ucb_rails 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +34 -4
- data/app/controllers/ucb_rails/admin/base_controller.rb +4 -0
- data/app/controllers/ucb_rails/admin/users_controller.rb +70 -0
- data/app/controllers/ucb_rails/bootstrap_controller.rb +34 -0
- data/app/controllers/ucb_rails/controller_methods.rb +67 -6
- data/app/controllers/ucb_rails/home_controller.rb +5 -0
- data/app/controllers/ucb_rails/ldap_person_search_controller.rb +15 -0
- data/app/controllers/ucb_rails/sessions_controller.rb +33 -8
- data/app/helpers/ucb_rails/admin/users_helper.rb +14 -0
- data/app/helpers/ucb_rails/extractable_helper.rb +17 -0
- data/app/helpers/ucb_rails/icons_helper.rb +7 -0
- data/app/helpers/ucb_rails/ldap_person_search_helper.rb +21 -0
- data/app/helpers/ucb_rails/lps_typeahead_helper.rb +50 -0
- data/app/helpers/ucb_rails/renderer/base.rb +52 -0
- data/app/helpers/ucb_rails/renderer/ldap_person_search_result_link.rb +81 -0
- data/app/models/ucb_rails/ldap_person/entry.rb +54 -0
- data/app/models/ucb_rails/ldap_person/finder.rb +67 -0
- data/app/models/ucb_rails/ldap_person/test_finder.rb +50 -0
- data/app/models/ucb_rails/user.rb +28 -0
- data/app/models/ucb_rails/user_ldap_service.rb +50 -0
- data/app/models/ucb_rails/user_session_manager/active_in_user_table.rb +37 -0
- data/app/models/ucb_rails/user_session_manager/admin_in_user_table.rb +13 -0
- data/app/models/ucb_rails/user_session_manager/base.rb +44 -0
- data/app/models/ucb_rails/user_session_manager/in_people_ou.rb +27 -0
- data/app/models/ucb_rails/user_session_manager/in_people_ou_add_to_users_table.rb +19 -0
- data/app/models/ucb_rails/user_session_manager/ldap_person_user_wrapper.rb +29 -0
- data/app/models/ucb_rails/user_table_active.rb +3 -0
- data/app/views/ucb_rails/admin/users/_form.html.haml +16 -0
- data/app/views/ucb_rails/admin/users/_user.html.haml +12 -0
- data/app/views/ucb_rails/admin/users/edit.html.haml +3 -0
- data/app/views/ucb_rails/admin/users/index.html.haml +40 -0
- data/app/views/ucb_rails/lps/_form.html.haml +16 -0
- data/app/views/ucb_rails/lps/_modal.html.haml +6 -0
- data/app/views/ucb_rails/lps/_results.html.haml +21 -0
- data/app/views/ucb_rails/lps/search.js.haml +2 -0
- data/config/routes.rb +18 -1
- data/lib/generators/ucb_rails/install_generator.rb +27 -23
- data/lib/generators/ucb_rails/templates/README +13 -0
- data/lib/generators/ucb_rails/templates/app/assets/javascripts/application.js +19 -0
- data/lib/generators/ucb_rails/templates/app/assets/javascripts/lps.js +71 -0
- data/lib/generators/ucb_rails/templates/app/assets/javascripts/lps_typeahead.js +56 -0
- data/lib/generators/ucb_rails/templates/app/assets/javascripts/typeahead.js +8 -0
- data/lib/generators/ucb_rails/templates/app/assets/stylesheets/application.css +14 -0
- data/lib/generators/ucb_rails/templates/app/assets/stylesheets/bootstrap_and_overrides.css.scss +3 -0
- data/lib/generators/ucb_rails/templates/app/assets/stylesheets/ucb_rails.css.scss +51 -0
- data/lib/generators/ucb_rails/templates/app/helpers/ucb_rails/application_helper.rb +12 -0
- data/lib/generators/ucb_rails/templates/app/views/layouts/_developer.html.haml +13 -0
- data/lib/generators/ucb_rails/templates/app/views/layouts/_footer.html.haml +5 -0
- data/lib/generators/ucb_rails/templates/app/views/layouts/_navigation.html.haml +25 -0
- data/lib/generators/ucb_rails/templates/app/views/layouts/application.html.haml +22 -0
- data/lib/generators/ucb_rails/templates/config/initializers/local/active_record/dom_and_haml.rb +61 -0
- data/lib/generators/ucb_rails/templates/config/initializers/local/haml_buffer.rb +20 -0
- data/lib/generators/ucb_rails/templates/config/initializers/local/simple_form.rb +142 -0
- data/lib/generators/ucb_rails/templates/config/initializers/local/simple_form_bootstrap.rb +45 -0
- data/lib/generators/ucb_rails/templates/config/initializers/local/ucb_rails.rb +45 -0
- data/lib/generators/ucb_rails/templates/config/locales/simple_form.en.yml +26 -0
- data/lib/generators/ucb_rails/templates/db/migrate/create_users.rb +23 -0
- data/lib/generators/ucb_rails/templates/lib/templates/haml/scaffold/_form.html.haml +10 -0
- data/lib/ucb_rails/engine.rb +22 -1
- data/lib/ucb_rails/log_tagger.rb +20 -0
- data/lib/ucb_rails/version.rb +1 -1
- data/lib/ucb_rails.rb +16 -0
- metadata +312 -10
- data/lib/generators/ucb_rails/templates/initializer.rb +0 -4
@@ -0,0 +1,67 @@
|
|
1
|
+
module UcbRails::LdapPerson
|
2
|
+
class Finder
|
3
|
+
BlankSearchTermsError = Class.new(StandardError)
|
4
|
+
PersonNotFound = Class.new(StandardError)
|
5
|
+
|
6
|
+
def benchmark(message = "Benchmarking")
|
7
|
+
result = nil
|
8
|
+
ms = Benchmark.ms { result = yield }
|
9
|
+
Rails.logger.debug "#{message} #{ms}"
|
10
|
+
result
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_by_uid(uid)
|
14
|
+
benchmark("find_by_uid(#{uid})") do
|
15
|
+
find_by_attributes(:uid => uid.to_s).first
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_by_uid!(uid)
|
20
|
+
find_by_uid(uid) or raise(PersonNotFound, "uid=#{uid.inspect}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_by_first_last(first_name, last_name, options={})
|
24
|
+
raise BlankSearchTermsError unless first_name.present? || last_name.present?
|
25
|
+
|
26
|
+
find_by_attributes(:givenname => first_name, :sn => last_name).tap do |entries|
|
27
|
+
if options[:sort]
|
28
|
+
sort_symbol = options[:sort]
|
29
|
+
entries.sort_by!(&options[:sort])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def find_by_attributes(attributes)
|
35
|
+
attributes.each { |k, v| attributes.delete(k) if v.blank? }
|
36
|
+
UCB::LDAP::Person.
|
37
|
+
search(:filter => build_filter(attributes)).
|
38
|
+
map { |ldap_entry| Entry.new_from_ldap_entry(ldap_entry) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def build_filter(attrs)
|
42
|
+
filter_parts = attrs.map { |k, v| build_filter_part(k, v) }
|
43
|
+
filter = filter_parts.inject { |accum, filter| accum.send(:&, filter) }
|
44
|
+
filter
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_filter_part(key, value)
|
48
|
+
value = key.to_s == 'uid' ? value : "#{value}*"
|
49
|
+
Net::LDAP::Filter.eq(key.to_s, value)
|
50
|
+
end
|
51
|
+
|
52
|
+
class << self
|
53
|
+
def klass
|
54
|
+
if RailsEnvironment.test? || UcbRails[:omniauth_provider] == :developer
|
55
|
+
UcbRails::LdapPerson::TestFinder
|
56
|
+
else
|
57
|
+
UcbRails::LdapPerson::Finder
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def method_missing(method, *args)
|
62
|
+
klass.new.send(method, *args)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module UcbRails::LdapPerson
|
2
|
+
class TestFinder
|
3
|
+
PersonNotFound = Class.new(StandardError)
|
4
|
+
|
5
|
+
def find_by_uid(uid)
|
6
|
+
uid.presence and find_by_attributes(:uid => uid.to_s).first
|
7
|
+
end
|
8
|
+
|
9
|
+
def find_by_uid!(uid)
|
10
|
+
find_by_uid(uid) || raise(PersonNotFound, "uid=#{uid.inspect}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_by_first_last(first_name, last_name, options={})
|
14
|
+
find_by_attributes(:first_name => first_name, :last_name => last_name)
|
15
|
+
end
|
16
|
+
|
17
|
+
def find_by_attributes(attributes)
|
18
|
+
self.class.entries.select { |entry| entry_matches_attributes(entry, attributes) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def entry_matches_attributes(entry, attributes)
|
22
|
+
attributes.keys.all? do |key|
|
23
|
+
value = attributes[key].to_s.downcase
|
24
|
+
value.blank? || entry.send(key).downcase.include?(value)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.entries
|
29
|
+
[
|
30
|
+
new_entry("1", 'art', "Art", "Andrews", "art@example.com", "999-999-0001", "Dept 1"),
|
31
|
+
new_entry("2", 'beth', "Beth", "Brown", "beth@example.com", "999-999-0002", "Dept 2"),
|
32
|
+
new_entry("61065", 'runner', "Steven", "Hansen", "runner@berkeley.edu", "999-999-9998", "EAS"),
|
33
|
+
new_entry("191501", 'stevedowney', "Steve", "Downey", "sldowney@berkeley.edu", "999-999-9999", "EAS"),
|
34
|
+
]
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.new_entry(uid, calnet_id, fn, ln, email, phone, depts)
|
38
|
+
::UcbRails::LdapPerson::Entry.new(
|
39
|
+
:uid => uid,
|
40
|
+
:calnet_id => calnet_id,
|
41
|
+
:first_name => fn,
|
42
|
+
:last_name => ln,
|
43
|
+
:email => email,
|
44
|
+
:phone => phone,
|
45
|
+
:departments => depts
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class UcbRails::User < ActiveRecord::Base
|
2
|
+
self.table_name = 'users'
|
3
|
+
|
4
|
+
attr_accessible :uid, :first_name, :last_name, :inactive
|
5
|
+
|
6
|
+
before_validation :set_first_last_name
|
7
|
+
|
8
|
+
def admin!
|
9
|
+
update_attribute(:admin, true)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.active
|
13
|
+
where(inactive: false)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.admin
|
17
|
+
where(admin: true)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def set_first_last_name
|
23
|
+
self.first_last_name = [first_name, last_name]
|
24
|
+
.select { |n| n.present? }
|
25
|
+
.join(' ')
|
26
|
+
.presence
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class UcbRails::UserLdapService
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def create_user_from_uid(uid)
|
6
|
+
ldap_entry = UcbRails::LdapPerson::Finder.find_by_uid!(uid)
|
7
|
+
create_user_from_ldap_entry(ldap_entry)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_user_from_ldap_entry(ldap_entry)
|
11
|
+
|
12
|
+
UcbRails::User.create! do |u|
|
13
|
+
u.uid = ldap_entry.uid
|
14
|
+
u.first_name = ldap_entry.first_name
|
15
|
+
u.last_name = ldap_entry.last_name
|
16
|
+
u.email = ldap_entry.email
|
17
|
+
u.phone = ldap_entry.phone
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_user_from_ldap_entry(ldap_entry)
|
24
|
+
# ldap_entry = UcbRails::LdapPerson::Finder.find_by_uid!(uid)
|
25
|
+
UcbRails::User.find_by_uid!(ldap_entry.uid).tap do |user|
|
26
|
+
user.first_name = ldap_entry.first_name
|
27
|
+
user.last_name = ldap_entry.last_name
|
28
|
+
user.email = ldap_entry.email
|
29
|
+
user.phone = ldap_entry.phone
|
30
|
+
user.save(validate: false)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_or_update_user(uid)
|
35
|
+
if user = UcbRails::User.find_by_uid(uid)
|
36
|
+
update_user(uid)
|
37
|
+
else
|
38
|
+
create_user(uid)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_or_update_user_from_entry(entry)
|
43
|
+
if user = UcbRails::User.find_by_uid(entry.uid)
|
44
|
+
update_user_from_ldap_entry(entry)
|
45
|
+
else
|
46
|
+
create_user_from_ldap_entry(entry)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module UcbRails
|
2
|
+
module UserSessionManager
|
3
|
+
class ActiveInUserTable < Base
|
4
|
+
|
5
|
+
def login(uid)
|
6
|
+
self.uid = uid
|
7
|
+
|
8
|
+
if user_table_entry && people_ou_entry
|
9
|
+
UcbRails::UserLdapService.update_user_from_ldap_entry(people_ou_entry).tap do |user|
|
10
|
+
user.touch(:last_login_at)
|
11
|
+
end
|
12
|
+
else
|
13
|
+
false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def current_user(uid)
|
18
|
+
UcbRails::User.find_by_uid(uid)
|
19
|
+
end
|
20
|
+
|
21
|
+
def log_request(user)
|
22
|
+
user.present? and user.touch(:last_request_at)
|
23
|
+
end
|
24
|
+
|
25
|
+
def logout(user)
|
26
|
+
user.present? and user.touch(:last_logout_at)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def user_table_entry
|
32
|
+
active_user
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class UcbRails::UserSessionManager::Base
|
2
|
+
attr_accessor :uid
|
3
|
+
|
4
|
+
def login(uid)
|
5
|
+
raise NotImplementedError
|
6
|
+
end
|
7
|
+
|
8
|
+
def current_user(uid)
|
9
|
+
raise NotImplementedError
|
10
|
+
end
|
11
|
+
|
12
|
+
def log_request(user)
|
13
|
+
end
|
14
|
+
|
15
|
+
def logout(user)
|
16
|
+
end
|
17
|
+
|
18
|
+
def people_ou_entry(uid_in=nil)
|
19
|
+
self.uid = uid_in if uid_in.present?
|
20
|
+
|
21
|
+
@people_ou_entry ||= begin
|
22
|
+
if @people_ou_entry = UcbRails::LdapPerson::Finder.find_by_uid(uid)
|
23
|
+
@people_ou_entry
|
24
|
+
else
|
25
|
+
UcbRails.logger.debug "#{self.class} people_ou_entry not found for uid: #{uid.inspect}"
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def active_user
|
34
|
+
@active_user ||= UcbRails::User.active.find_by_uid(uid)
|
35
|
+
end
|
36
|
+
|
37
|
+
def active_admin_user
|
38
|
+
@active_user ||= UcbRails::User.active.admin.find_by_uid(uid)
|
39
|
+
end
|
40
|
+
|
41
|
+
def ldap_person_user_wrapper(ldap_person_entry)
|
42
|
+
UcbRails::UserSessionManager::LdapPersonUserWrapper.new(ldap_person_entry)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module UcbRails
|
2
|
+
module UserSessionManager
|
3
|
+
class InPeopleOu < Base
|
4
|
+
|
5
|
+
def login(uid)
|
6
|
+
self.uid = uid
|
7
|
+
|
8
|
+
if people_ou_entry.present?
|
9
|
+
current_user(uid)
|
10
|
+
else
|
11
|
+
false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def current_user(uid)
|
16
|
+
self.uid = uid
|
17
|
+
|
18
|
+
if people_ou_entry.present?
|
19
|
+
ldap_person_user_wrapper(people_ou_entry)
|
20
|
+
else
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module UcbRails
|
2
|
+
module UserSessionManager
|
3
|
+
|
4
|
+
class InPeopleOuAddToUsersTable < ActiveInUserTable
|
5
|
+
|
6
|
+
def login(uid)
|
7
|
+
self.uid = uid
|
8
|
+
|
9
|
+
if people_ou_entry.present?
|
10
|
+
UcbRails::UserLdapService.create_or_update_user_from_entry(people_ou_entry)
|
11
|
+
else
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module UcbRails
|
2
|
+
module UserSessionManager
|
3
|
+
|
4
|
+
class LdapPersonUserWrapper
|
5
|
+
attr_accessor :ldap_person_entry
|
6
|
+
|
7
|
+
def initialize(ldap_person_entry)
|
8
|
+
self.ldap_person_entry = ldap_person_entry
|
9
|
+
end
|
10
|
+
|
11
|
+
def id
|
12
|
+
uid
|
13
|
+
end
|
14
|
+
|
15
|
+
def admin?
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_missing(method, *args, &block)
|
20
|
+
if ldap_person_entry.respond_to?(method)
|
21
|
+
ldap_person_entry.send(method, *args, &block)
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
= simple_form_for(@user, url: url, method: method, :html => {:class => 'form-horizontal'}) do |f|
|
2
|
+
= f.input :uid, :input_html => {disabled: 'disabled'}
|
3
|
+
= f.input :first_name, :input_html => {disabled: 'disabled'}
|
4
|
+
= f.input :last_name, :input_html => {disabled: 'disabled'}
|
5
|
+
= f.input :email, :input_html => {disabled: 'disabled'}
|
6
|
+
= f.input :phone, :input_html => {disabled: 'disabled'}
|
7
|
+
= f.input :last_login_at, as: :string, :input_html => {disabled: 'disabled', value: datetime_to_s(@user.last_login_at, :long)}
|
8
|
+
= f.input :last_request_at, as: :string, :input_html => {disabled: 'disabled', value: datetime_to_s(@user.last_request_at, :long)}
|
9
|
+
= f.input :last_logout_at, as: :string, :input_html => {disabled: 'disabled', value: datetime_to_s(@user.last_logout_at, :long)}
|
10
|
+
= f.input :admin, :label => false, :as => :boolean, :inline_label => "Admin?"
|
11
|
+
= f.input :inactive, :label => false, :as => :boolean, :inline_label => "Inactive User?"
|
12
|
+
|
13
|
+
= form_actions do
|
14
|
+
= submit_button_tag("Update User")
|
15
|
+
= cancel_button_tag(url: ucb_rails_admin_users_path)
|
16
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
%tr[user]
|
2
|
+
= td_bln(user.admin)
|
3
|
+
= td_bln(user.inactive)
|
4
|
+
%td= user.first_name
|
5
|
+
%td= user.last_name
|
6
|
+
%td= mail_to(user.email)
|
7
|
+
%td.phone= user.phone
|
8
|
+
%td.dt= datetime_to_s(user.last_request_at, :long)
|
9
|
+
%td.min= user.uid
|
10
|
+
%td= link_to('edit', edit_ucb_rails_admin_user_path(user), :class => 'btn btn-mini', :id => dom_id(user, 'edit'))
|
11
|
+
%td= link_to('delete', ucb_rails_admin_user_path(user), :data => {confirm: 'Are you sure?'}, :method => :delete, :class => 'btn btn-mini btn-danger')
|
12
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
%h1 Users
|
2
|
+
|
3
|
+
%p= link_to_new_user
|
4
|
+
|
5
|
+
= ucbr_table_tag UcbRails::User do
|
6
|
+
%thead
|
7
|
+
%tr
|
8
|
+
%th.min Admin?
|
9
|
+
%th.min Inactive?
|
10
|
+
%th First Name
|
11
|
+
%th Last Name
|
12
|
+
%th Email
|
13
|
+
%th Phone
|
14
|
+
%th.dt Last Request At
|
15
|
+
%th UID
|
16
|
+
%th.min Edit
|
17
|
+
%th.min Delete
|
18
|
+
%tbody.highlight
|
19
|
+
= render partial: 'ucb_rails/admin/users/user', collection: @users
|
20
|
+
|
21
|
+
= render :partial => 'ucb_rails/lps/modal'
|
22
|
+
|
23
|
+
:javascript
|
24
|
+
$('#ucb_rails_users').dataTable({
|
25
|
+
"sDom": "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
|
26
|
+
"sPaginationType": "bootstrap",
|
27
|
+
"bStateSave": true,
|
28
|
+
"iDisplayLength": 20,
|
29
|
+
"aLengthMenu": [[10, 20, 50, -1], [10, 20, 50, 'All']],
|
30
|
+
"aaSorting": [[ 5, "desc" ]],
|
31
|
+
"aoColumnDefs": [
|
32
|
+
{ "aDataSort": [ 0, 2, 3 ], "aTargets": [ 0 ] }, // admin
|
33
|
+
{ "aDataSort": [ 1, 2, 3 ], "aTargets": [ 0 ] }, // active
|
34
|
+
{ "aDataSort": [ 1, 2 ], "aTargets": [ 2 ] }, // first name
|
35
|
+
{ "aDataSort": [ 2, 1], "aTargets": [ 3 ] }, // last name
|
36
|
+
{ "bSortable": false, "aTargets": [ 8 ] }, // edit
|
37
|
+
{ "bSortable": false, "aTargets": [ 9 ] }, // delete
|
38
|
+
]
|
39
|
+
});
|
40
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
= form_tag('/ucb_rails/ldap_person_search', :class => "well form-inline", :id => 'lps-form', :method => :get, :remote => true) do
|
2
|
+
|
3
|
+
= hidden_field_tag('search-field-name')
|
4
|
+
= hidden_field_tag('result-link-http-method')
|
5
|
+
= hidden_field_tag('result-link-text')
|
6
|
+
= hidden_field_tag('result-link-class')
|
7
|
+
= hidden_field_tag('result-link-url')
|
8
|
+
|
9
|
+
= label_tag 'first_name', 'First Name'
|
10
|
+
= text_field_tag("first_name")
|
11
|
+
= label_tag 'last_name', 'Last Name'
|
12
|
+
= text_field_tag("last_name")
|
13
|
+
|
14
|
+
= submit_button_tag('Search', id: 'lps-search')
|
15
|
+
= button("Clear", url: "#", :id => 'lps-clear')
|
16
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
- if @lps_entries.empty?
|
2
|
+
%p No records were found.
|
3
|
+
- else
|
4
|
+
= ucbr_table_tag(class: 'table-condensed') do
|
5
|
+
%thead
|
6
|
+
%tr
|
7
|
+
%th{style: 'width="1%"'}
|
8
|
+
%th First Name
|
9
|
+
%th Last Name
|
10
|
+
%th Email
|
11
|
+
%th Department
|
12
|
+
%tbody
|
13
|
+
- @lps_entries.each do |entry|
|
14
|
+
- entry_id = "ldap_uid_#{entry.uid}"
|
15
|
+
%tr{id: entry_id, class: ldap_entry_class(entry)}
|
16
|
+
%td= link_to_ldap_person_entry(entry)
|
17
|
+
%td= entry.first_name
|
18
|
+
%td= entry.last_name
|
19
|
+
%td= entry.email
|
20
|
+
%td= entry.departments
|
21
|
+
|
data/config/routes.rb
CHANGED
@@ -5,7 +5,24 @@ Rails.application.routes.draw do
|
|
5
5
|
|
6
6
|
match '/login', :to => 'ucb_rails/sessions#new', :as => 'login'
|
7
7
|
match '/logout', :to => 'ucb_rails/sessions#destroy', :as => 'logout'
|
8
|
-
match '/auth/:
|
8
|
+
match '/auth/:omniauth_provider/callback' => 'ucb_rails/sessions#create'
|
9
9
|
match '/auth/failure' => "ucb_rails/sessions#failure"
|
10
|
+
match '/not_authorized', :to => 'ucb_rails/sessions#not_authorized', as: 'not_authorized'
|
11
|
+
|
12
|
+
match '/ucb_rails/bootstrap(/:uid)' => 'ucb_rails/bootstrap#index'
|
13
|
+
|
14
|
+
resources :hidden_announcements, path: '/announcements', only: [:index, :create, :destroy]
|
15
|
+
|
16
|
+
namespace :ucb_rails do
|
17
|
+
get '/ldap_person_search' => 'ldap_person_search#search', :as => :ldap_person_search
|
18
|
+
|
19
|
+
namespace :admin do
|
20
|
+
resources :announcements
|
21
|
+
resources :users do
|
22
|
+
get 'ldap_search', on: :collection
|
23
|
+
get 'typeahead_search', on: :collection
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
10
27
|
|
11
28
|
end
|
@@ -1,39 +1,43 @@
|
|
1
1
|
require 'rails/generators/active_record/migration'
|
2
2
|
|
3
3
|
module UcbRails
|
4
|
+
# @private
|
4
5
|
module Generators
|
6
|
+
# @private
|
5
7
|
class InstallGenerator < Rails::Generators::Base
|
6
8
|
include Rails::Generators::Migration
|
7
9
|
extend ActiveRecord::Generators::Migration
|
8
10
|
source_root File.join(File.dirname(__FILE__), "templates")
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
desc <<DESC
|
13
|
-
Description:
|
14
|
-
# Copies stylesheet to 'app/assets/stylesheets/user_announcements.css'
|
15
|
-
Copies configuration
|
16
|
-
# Copies db migration to 'db/migrate/<timestamp>/create_user_announcement_tables.rb'
|
17
|
-
|
18
|
-
DESC
|
19
|
-
|
20
|
-
def preamble
|
21
|
-
puts "\n============================================================"
|
22
|
-
puts "Installing UCB Rails Essentials\n"
|
23
|
-
end
|
12
|
+
desc 'Copy ucb_rails files'
|
13
|
+
class_option :readme, aliases: '-r', type: :boolean, desc: 'Display README and exit'
|
24
14
|
|
25
15
|
def install
|
26
|
-
|
27
|
-
|
28
|
-
|
16
|
+
return if options.readme?
|
17
|
+
|
18
|
+
directory 'app/assets'
|
19
|
+
directory 'app/helpers'
|
20
|
+
directory 'app/views'
|
21
|
+
directory 'config'
|
22
|
+
install_migrations
|
29
23
|
end
|
30
24
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
25
|
+
def show_readme
|
26
|
+
if behavior == :invoke
|
27
|
+
readme "README"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def install_migrations
|
34
|
+
template_dir = Pathname.new(self.class.source_root)
|
35
|
+
Dir["#{template_dir}/db/migrate/*.rb"].each do |migration_file|
|
36
|
+
# migration_template migration_file
|
37
|
+
# puts migration_file
|
38
|
+
relative_name = Pathname.new(migration_file).relative_path_from(Pathname.new(template_dir))
|
39
|
+
migration_template relative_name
|
40
|
+
end
|
37
41
|
end
|
38
42
|
end
|
39
43
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
****************************************************************************
|
2
|
+
* Check configuration settings in config/initializers/local/ucb_rails.rb
|
3
|
+
|
4
|
+
* run other generators, migrate db, remove superseded files
|
5
|
+
|
6
|
+
rails generate user_announcements:install
|
7
|
+
rails generate simple_form:install --bootstrap
|
8
|
+
rake db:migrate
|
9
|
+
rm public/index.html
|
10
|
+
rm app/views/layouts/application.html.erb
|
11
|
+
|
12
|
+
|
13
|
+
****************************************************************************
|
@@ -0,0 +1,19 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
11
|
+
// GO AFTER THE REQUIRES BELOW.
|
12
|
+
//
|
13
|
+
//= require jquery
|
14
|
+
//= require jquery_ujs
|
15
|
+
//= require bootstrap
|
16
|
+
//= require dataTables/jquery.dataTables
|
17
|
+
//= require dataTables/jquery.dataTables.api.fnSetFilteringDelay
|
18
|
+
//= require dataTables/jquery.dataTables.bootstrap
|
19
|
+
//= require_tree .
|