ucb_rails 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
data/README.md
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
# UCB Rails
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/ucb_rails)
|
4
|
+
[](https://travis-ci.org/stevedowney/ucb_rails)
|
5
|
+
[](https://coveralls.io/r/stevedowney/ucb_rails?branch=master)
|
6
|
+
[](https://codeclimate.com/github/stevedowney/ucb_rails)
|
7
|
+
|
3
8
|
Get a jump start on your Rails project at UCB. Includes:
|
4
9
|
|
5
10
|
* CalNet authentication with [omniauth-cas](https://github.com/dlindahl/omniauth-cas)
|
6
11
|
* LDAP integration with [ucb_ldap](https://rubygems.org/gems/ucb_ldap)
|
7
12
|
* includes several other gems including:
|
13
|
+
* [bootstrap-view-helpers](https://github.com/stevedowney/bootstrap-view-helpers)
|
14
|
+
* [user_announcements](https://github.com/stevedowney/user_announcements)
|
8
15
|
* [rails_environment](https://github.com/stevedowney/rails_environment)
|
9
16
|
|
10
17
|
## Installation
|
@@ -12,14 +19,37 @@ Get a jump start on your Rails project at UCB. Includes:
|
|
12
19
|
Add it to your Gemfile
|
13
20
|
|
14
21
|
```ruby
|
15
|
-
gem
|
22
|
+
gem 'ucb_rails'
|
23
|
+
|
24
|
+
# bleeding edge
|
25
|
+
gem 'ucb_rails', git: 'https://github.com/stevedowney/ucb_rails'
|
26
|
+
```
|
27
|
+
|
28
|
+
From the command line, install the `ucb_rails` gem:
|
29
|
+
|
30
|
+
```sh
|
31
|
+
bundle install
|
32
|
+
rails g ucb_rails:install
|
33
|
+
```
|
34
|
+
|
35
|
+
Run installers for included gems:
|
36
|
+
|
37
|
+
```sh
|
38
|
+
rails generate user_announcements:install
|
39
|
+
rails generate simple_form:install --bootstrap
|
40
|
+
```
|
41
|
+
|
42
|
+
Run migrations:
|
43
|
+
|
44
|
+
```sh
|
45
|
+
rake db:migrate
|
16
46
|
```
|
17
47
|
|
18
|
-
|
48
|
+
Remove superseded files:
|
19
49
|
|
20
50
|
```sh
|
21
|
-
|
22
|
-
|
51
|
+
rm public/index.html
|
52
|
+
rm app/views/layouts/application.html.erb
|
23
53
|
```
|
24
54
|
|
25
55
|
Restart your server and point your browser to:
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class UcbRails::Admin::UsersController < UcbRails::Admin::BaseController
|
2
|
+
before_filter :find_user, :only => [:edit, :update, :destroy]
|
3
|
+
|
4
|
+
def index
|
5
|
+
respond_to do |format|
|
6
|
+
format.html { @users = UcbRails::User.all }
|
7
|
+
# format.json { render json: UsersDatatable.new(view_context) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def edit
|
12
|
+
end
|
13
|
+
|
14
|
+
def create
|
15
|
+
uid = params.fetch(:uid)
|
16
|
+
if user = UcbRails::User.find_by_uid(uid)
|
17
|
+
flash[:warning] = "User already exists"
|
18
|
+
else
|
19
|
+
user = UcbRails::UserLdapService.create_user_from_uid(uid)
|
20
|
+
flash[:notice] = 'Record created'#msg_created(user)
|
21
|
+
end
|
22
|
+
# render :js => %(window.location.href = '#{ucb_rails_admin_user_path}')
|
23
|
+
render :js => %(window.location.href = '#{edit_ucb_rails_admin_user_path(user)}')
|
24
|
+
end
|
25
|
+
|
26
|
+
def update
|
27
|
+
if @user.update_attributes(params.fetch(:ucb_rails_user), :without_protection => true)
|
28
|
+
redirect_to(ucb_rails_admin_users_path, notice: 'Record updated')
|
29
|
+
else
|
30
|
+
render("edit")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def destroy
|
35
|
+
if @user.destroy
|
36
|
+
flash[:notice] = 'Record deleted' #msg_destroyed(@user)
|
37
|
+
else
|
38
|
+
flash[:error] = @user.errors[:base].first
|
39
|
+
end
|
40
|
+
|
41
|
+
redirect_to(ucb_rails_admin_users_path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def ldap_search
|
45
|
+
@lps_entries = UcbRails::LdapPerson::Finder.find_by_first_last(
|
46
|
+
params.fetch(:first_name),
|
47
|
+
params.fetch(:last_name),
|
48
|
+
:sort => :last_first_downcase
|
49
|
+
)
|
50
|
+
@lps_existing_uids = UcbRails::User.where(uid: @lps_entries.map(&:uid)).pluck(:uid)
|
51
|
+
|
52
|
+
render 'ucb_rails/lps/search'
|
53
|
+
end
|
54
|
+
|
55
|
+
def typeahead_search
|
56
|
+
tokens = params.fetch(:query).to_s.strip.split(/\s+/)
|
57
|
+
wheres = tokens.map { |e| 'first_last_name like ?' }.join(' and ')
|
58
|
+
values = tokens.map { |e| "%#{e}%" }
|
59
|
+
where = ["#{wheres}", *values]
|
60
|
+
results = UcbRails::User.where(*where).limit(10)
|
61
|
+
render json: results.map { |r| {uid: r.uid, first_last_name: r.first_last_name} }
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def find_user
|
67
|
+
@user ||= UcbRails::User.find(params.fetch(:id))
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class UcbRails::BootstrapController < ApplicationController
|
2
|
+
skip_before_filter :ensure_authenticated_user
|
3
|
+
|
4
|
+
def index
|
5
|
+
if RailsEnvironment.not_development?
|
6
|
+
raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}"
|
7
|
+
end
|
8
|
+
|
9
|
+
if UcbRails::User.count > 0
|
10
|
+
return render_text("Can't bootstrap. Already have users.")
|
11
|
+
end
|
12
|
+
|
13
|
+
if uid.present?
|
14
|
+
UCB::LDAP::Person.find_by_uid(uid).tap do |e|
|
15
|
+
return render_text("Bad uid: #{uid.inspect}") if e.blank?
|
16
|
+
user = UcbRails::UserLdapService.create_user_from_uid(uid)
|
17
|
+
user.update_attributes({admin: true}, without_protection: true)
|
18
|
+
redirect_to login_path
|
19
|
+
end
|
20
|
+
else
|
21
|
+
return render_text "Must provide a uid: /ucb_rails/bootstrap/:uid"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def uid
|
28
|
+
params[:uid]
|
29
|
+
end
|
30
|
+
|
31
|
+
def render_text(text)
|
32
|
+
render text: text
|
33
|
+
end
|
34
|
+
end
|
@@ -1,22 +1,83 @@
|
|
1
|
+
# Various controller methods mixed in to the host app.
|
2
|
+
#
|
3
|
+
# Most are also helper methods.
|
1
4
|
module UcbRails::ControllerMethods
|
2
|
-
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
+
included do
|
8
|
+
rescue_from UcbRails::LdapPerson::Finder::BlankSearchTermsError do
|
9
|
+
render :js => %(alert("Enter search terms"))
|
7
10
|
end
|
8
11
|
|
12
|
+
before_filter :ensure_authenticated_user
|
13
|
+
before_filter :log_request
|
14
|
+
|
15
|
+
after_filter :remove_user_settings
|
16
|
+
|
17
|
+
helper_method :admin?, :current_ldap_person, :current_user, :logged_in?
|
18
|
+
end
|
19
|
+
|
20
|
+
def admin?
|
21
|
+
current_user.try(:admin?)
|
22
|
+
end
|
23
|
+
|
24
|
+
def current_user
|
25
|
+
@current_user ||= begin
|
26
|
+
UcbRails.logger.debug 'recalc of current_user'
|
27
|
+
user_session_manager.current_user(session[:uid])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Returns +true+ if there is a logged in user
|
32
|
+
#
|
33
|
+
# @return [true] if user logged in
|
34
|
+
# @return [false] if user not logged in
|
9
35
|
def logged_in?
|
10
|
-
|
36
|
+
current_user.present?
|
37
|
+
end
|
38
|
+
|
39
|
+
def log_request
|
40
|
+
user_session_manager.log_request(current_user)
|
11
41
|
end
|
12
42
|
|
43
|
+
def remove_user_settings
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns an instance of UCB::LDAP::Person if there is a logged in user
|
47
|
+
#
|
48
|
+
# @return [UCB::LDAP::Person] if user logged in
|
49
|
+
# @return [nil] if user not logged in
|
13
50
|
def current_ldap_person
|
14
51
|
if logged_in?
|
15
|
-
|
52
|
+
@current_ldap_person ||= begin
|
53
|
+
UcbRails.logger.debug 'recalc of current_ldap_person'
|
54
|
+
user_session_manager.people_ou_entry(session[:uid])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def ensure_admin_user
|
60
|
+
admin? or redirect_to not_authorized_path
|
61
|
+
end
|
62
|
+
|
63
|
+
# Before filter that redirects redirects to +login_url+ unless user is logged in
|
64
|
+
#
|
65
|
+
# @return [nil]
|
66
|
+
def ensure_authenticated_user
|
67
|
+
unless session.has_key?(:uid)
|
68
|
+
session[:original_url] = request.env['REQUEST_URI']
|
69
|
+
redirect_to login_url
|
16
70
|
end
|
17
71
|
end
|
18
72
|
|
19
|
-
|
73
|
+
def user_session_manager
|
74
|
+
@user_session_manager ||= begin
|
75
|
+
UcbRails.logger.debug "creating new user_session_manager"
|
76
|
+
klass = UcbRails[:user_session_manager] || UcbRails::UserSessionManager::ActiveInUserTable
|
77
|
+
klass.to_s.classify.constantize.new
|
78
|
+
end
|
79
|
+
rescue NameError
|
80
|
+
raise "Could not find UcbRails user_session_manager: #{klass}"
|
20
81
|
end
|
21
82
|
|
22
83
|
end
|
@@ -1,5 +1,10 @@
|
|
1
1
|
class UcbRails::HomeController < ApplicationController
|
2
2
|
|
3
|
+
# Renders either a "logged in" page or a "logged out" page.
|
4
|
+
# Mainly used for getting going with the +ucb_rails+ gem.
|
5
|
+
# Not intended for production use.
|
6
|
+
#
|
7
|
+
# @return [nil]
|
3
8
|
def index
|
4
9
|
if logged_in?
|
5
10
|
render 'logged_in'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class UcbRails::LdapPersonSearchController < ApplicationController
|
2
|
+
NoSearchTermError = Class.new(StandardError)
|
3
|
+
|
4
|
+
skip_before_filter :ensure_authenticated_user
|
5
|
+
|
6
|
+
def search
|
7
|
+
@lps_entries = UcbRails::LdapPerson::Finder.find_by_first_last(
|
8
|
+
params.fetch(:first_name),
|
9
|
+
params.fetch(:last_name),
|
10
|
+
:sort => :last_first_downcase
|
11
|
+
)
|
12
|
+
render 'ucb_rails/lps/search'
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -1,26 +1,51 @@
|
|
1
|
+
# Manages starting and ending of sessions, i.e., logging in and out.
|
1
2
|
class UcbRails::SessionsController < ApplicationController
|
2
3
|
|
3
|
-
skip_before_filter :ensure_authenticated_user
|
4
|
+
skip_before_filter :ensure_authenticated_user, :log_request
|
4
5
|
|
6
|
+
# Redirects to authentication provider
|
7
|
+
#
|
8
|
+
# @return [nil]
|
5
9
|
def new
|
6
|
-
provider =
|
10
|
+
provider = UcbRails[:omniauth_provider] || :cas
|
7
11
|
redirect_to "/auth/#{provider}"
|
8
12
|
end
|
9
13
|
|
14
|
+
# Login user after authentication by provider
|
15
|
+
#
|
16
|
+
# @return [nil]
|
10
17
|
def create
|
11
|
-
|
12
|
-
session[:
|
13
|
-
|
14
|
-
|
18
|
+
uid = request.env['omniauth.auth'].uid
|
19
|
+
session[:omniauth_provider] = request.env['omniauth.auth'].provider
|
20
|
+
|
21
|
+
if user_session_manager.login(uid)
|
22
|
+
session[:uid] = uid
|
23
|
+
redirect_to session[:original_url] || root_path
|
24
|
+
else
|
25
|
+
redirect_to not_authorized_path
|
26
|
+
end
|
15
27
|
end
|
16
28
|
|
29
|
+
# Log user out
|
30
|
+
#
|
31
|
+
# @return [nil]
|
17
32
|
def destroy
|
18
|
-
|
19
|
-
provider = session[:
|
33
|
+
user_session_manager.logout(current_user)
|
34
|
+
provider = session[:omniauth_provider]
|
20
35
|
reset_session
|
21
36
|
redirect_to redirect_url(provider)
|
22
37
|
end
|
23
38
|
|
39
|
+
# Action called when unauthorized access attempted
|
40
|
+
#
|
41
|
+
# @return [nil]
|
42
|
+
def not_authorized
|
43
|
+
render(:text => "Not Authorized", :status => 401)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Handler for authentication failure.
|
47
|
+
#
|
48
|
+
# @return [nil]
|
24
49
|
def failure
|
25
50
|
Rails.logger.debug("Authentication Failed for: #{request.env['omniauth.auth']}")
|
26
51
|
render(:text => "Not Authorized", :status => 401)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module UcbRails::Admin::UsersHelper
|
2
|
+
|
3
|
+
def link_to_new_user
|
4
|
+
button('New User', :primary,
|
5
|
+
class: 'ldap-person-search',
|
6
|
+
data: {
|
7
|
+
search_url: ldap_search_ucb_rails_admin_users_path,
|
8
|
+
result_link_url: ucb_rails_admin_users_path,
|
9
|
+
result_link_http_method: 'post',
|
10
|
+
}
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# These methods should be extracted into own gem.
|
2
|
+
module UcbRails::ExtractableHelper
|
3
|
+
|
4
|
+
def ucbr_table_tag(*args)
|
5
|
+
options = canonicalize_options(args.extract_options!)
|
6
|
+
|
7
|
+
ar_class = args.first
|
8
|
+
if ar_class.respond_to?(:haml_attributes)
|
9
|
+
options[:id] ||= ar_class.haml_attributes["id"]
|
10
|
+
options = ensure_class(options, ar_class.haml_attributes["class"])
|
11
|
+
end
|
12
|
+
|
13
|
+
bs_table_tag(options) do
|
14
|
+
yield
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module UcbRails::LdapPersonSearchHelper
|
2
|
+
|
3
|
+
def link_to_ldap_person_entry(entry)
|
4
|
+
UcbRails::Renderer::LdapPersonSearchResultLink.new(self, entry).html
|
5
|
+
end
|
6
|
+
|
7
|
+
def ldap_entry_class(entry)
|
8
|
+
Array['ldap-result'].tap do |result|
|
9
|
+
result << 'ldap-result-exists' if ldap_already_include?(entry.uid)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def ldap_already_include?(uid)
|
14
|
+
ldap_person_search_existing_uids.include?(uid.to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
def ldap_person_search_existing_uids
|
18
|
+
@ldap_person_search_existing_uids ||= (@lps_existing_uids || []).map(&:to_s)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module UcbRails::LpsTypeaheadHelper
|
2
|
+
|
3
|
+
def lps_typeahead_search_field(options={})
|
4
|
+
name = options.delete(:name) || 'person_search'
|
5
|
+
required = options.delete(:required)
|
6
|
+
label = options.delete(:label) || 'User'
|
7
|
+
value = options.delete(:value) || params[name]
|
8
|
+
placeholder = options.delete(:placeholder) || 'Type name to search'
|
9
|
+
hint = options.delete(:hint) || 'Click icon to search CalNet'
|
10
|
+
|
11
|
+
result_link_text = options.delete(:result_link_text) || 'Select'
|
12
|
+
result_link_class = options.delete(:result_link_class) || 'lps-typeahead-item'
|
13
|
+
|
14
|
+
uid_dom_id = options.delete(:uid_dom_id) || 'uid'
|
15
|
+
search_url = options.delete(:search_url) || typeahead_search_ucb_rails_admin_users_path
|
16
|
+
|
17
|
+
content_tag(:div, class: 'control-group lps-typeahead') do
|
18
|
+
label_tag(name, class: label_classes(required)) do
|
19
|
+
required_marker(required) +
|
20
|
+
label
|
21
|
+
|
22
|
+
end +
|
23
|
+
content_tag(:div, class: 'controls') do
|
24
|
+
content_tag(:div, class: 'input-append') do
|
25
|
+
text_field_tag(name, value, placeholder: placeholder, class: 'typeahead-lps-search', data: { uid_dom_id: uid_dom_id, url: search_url }) +
|
26
|
+
content_tag(:span, class: 'add-on') do
|
27
|
+
icon('search', class: 'ldap-person-search', data: {search_field_name: name, result_link_text: result_link_text, result_link_class: result_link_class})
|
28
|
+
end
|
29
|
+
end +
|
30
|
+
content_tag(:p, hint, class: 'help-block')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def label_classes(required)
|
38
|
+
Array['control-label'].tap do |klasses|
|
39
|
+
klasses << 'required' if required
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def required_marker(required)
|
44
|
+
if required
|
45
|
+
content_tag(:abbr, '*', title: 'required') + ' '
|
46
|
+
else
|
47
|
+
''
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Base class for helper objects inspired by http://railscasts.com/episodes/101-refactoring-out-helper-object
|
2
|
+
#
|
3
|
+
# Use of such classes is indicated when you have:
|
4
|
+
#
|
5
|
+
# * helper methods calling each other, especially if ...
|
6
|
+
# * helper methods are passing around variables (which will become instance variables)
|
7
|
+
# * the same case/if logic in many methods, indicating a requirement for class hierarchy
|
8
|
+
#
|
9
|
+
# Your helper class's methods can just do calculations which are subsituted into
|
10
|
+
# html in the views, or the methods can generate html as well. This is helpful
|
11
|
+
# when the html is conditional on some other object's state.
|
12
|
+
#
|
13
|
+
# You have access to all the helper methods available to the view that creates
|
14
|
+
# the instance.
|
15
|
+
#
|
16
|
+
# Implementing helper classes should inherit from Renderer::Base and the template
|
17
|
+
# instance should be passed as an argument to the constructor.
|
18
|
+
#
|
19
|
+
# # app/helpers/renderer/my_renderer.rb
|
20
|
+
# class MyRenderer < Renderer::Base
|
21
|
+
# ...
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# # app/views/a_controller/a_view.html.erb
|
25
|
+
# <% renderer = MyRenderer.new(self) %> # must pass in template
|
26
|
+
# ...
|
27
|
+
# <div>
|
28
|
+
# <%= renderer.div_content %>
|
29
|
+
# </div>
|
30
|
+
class UcbRails::Renderer::Base
|
31
|
+
|
32
|
+
# Holds reference to view template
|
33
|
+
attr_accessor :template
|
34
|
+
|
35
|
+
# Options to pass to renderer
|
36
|
+
attr_accessor :options
|
37
|
+
|
38
|
+
# Returns new instance of renderer. The _template_ argument is the view template.
|
39
|
+
def initialize(template, options = {})
|
40
|
+
self.template = template
|
41
|
+
self.options = options
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# Method missing sends all calls to template instance. This techniuqe
|
47
|
+
# provides access to helper methods available to the template.
|
48
|
+
def method_missing(*args, &block)
|
49
|
+
template.send(*args, &block)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module UcbRails
|
2
|
+
module Renderer
|
3
|
+
|
4
|
+
class LdapPersonSearchResultLink < Base
|
5
|
+
attr_accessor :entry
|
6
|
+
|
7
|
+
def initialize(template, entry, options={})
|
8
|
+
super template, options
|
9
|
+
self.entry = entry
|
10
|
+
end
|
11
|
+
|
12
|
+
def html
|
13
|
+
exists? ? exists_html : button(text, :mini, :primary, link_options)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def exists?
|
19
|
+
ldap_person_search_existing_uids.include?(entry.uid.to_s)
|
20
|
+
end
|
21
|
+
|
22
|
+
def exists_html
|
23
|
+
params["result-link-exists-text"] || 'Exists'
|
24
|
+
end
|
25
|
+
|
26
|
+
def text
|
27
|
+
@text ||= params["result-link-text"].presence || "Add"
|
28
|
+
end
|
29
|
+
|
30
|
+
def link_options
|
31
|
+
{
|
32
|
+
class: classes,
|
33
|
+
url: item_url,
|
34
|
+
data: {
|
35
|
+
remote: remote,
|
36
|
+
method: http_method,
|
37
|
+
uid: entry.uid,
|
38
|
+
first_name: entry.first_name,
|
39
|
+
last_name: entry.last_name,
|
40
|
+
email: entry.email,
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def classes
|
46
|
+
extra_class = params['result-link-class'].presence || 'result-link-default'
|
47
|
+
"result-link #{extra_class}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def item_url
|
51
|
+
url_param.present? ? url_and_person_params : '#'
|
52
|
+
end
|
53
|
+
|
54
|
+
def remote
|
55
|
+
url_param.present?
|
56
|
+
end
|
57
|
+
|
58
|
+
def http_method
|
59
|
+
params['result-link-http-method'] || :get
|
60
|
+
end
|
61
|
+
|
62
|
+
def url_param
|
63
|
+
params["result-link-url"]
|
64
|
+
end
|
65
|
+
|
66
|
+
def url_and_person_params
|
67
|
+
connector = url_param.include?("?") ? '&' : '?'
|
68
|
+
"#{url_param}#{connector}#{person_params.to_query}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def person_params
|
72
|
+
{
|
73
|
+
uid: entry.uid,
|
74
|
+
first_name: entry.first_name,
|
75
|
+
last_name: entry.last_name,
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module UcbRails::LdapPerson
|
2
|
+
class Entry
|
3
|
+
|
4
|
+
# include ActiveAttr::Model <--- doesn't work with 4.0 (mass assign. security)
|
5
|
+
include ::ActiveAttr::Attributes
|
6
|
+
include ::ActiveAttr::BasicModel
|
7
|
+
include ::ActiveAttr::BlockInitialization
|
8
|
+
include ::ActiveAttr::MassAssignment
|
9
|
+
|
10
|
+
attribute :uid
|
11
|
+
attribute :calnet_id
|
12
|
+
attribute :first_name
|
13
|
+
attribute :last_name
|
14
|
+
attribute :email
|
15
|
+
attribute :phone
|
16
|
+
attribute :departments
|
17
|
+
attribute :affiliations
|
18
|
+
|
19
|
+
def full_name
|
20
|
+
"#{first_name()} #{last_name()}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def last_first
|
24
|
+
"#{last_name}, #{first_name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def last_first_downcase
|
28
|
+
last_first.downcase
|
29
|
+
end
|
30
|
+
|
31
|
+
# Currently only used in rspec
|
32
|
+
def ==(other)
|
33
|
+
uid == other.uid
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
37
|
+
|
38
|
+
def new_from_ldap_entry(ldap_entry)
|
39
|
+
new(
|
40
|
+
:uid => ldap_entry.uid,
|
41
|
+
:calnet_id => ldap_entry.berkeleyedukerberosprincipalstring.first,
|
42
|
+
:first_name => ldap_entry.givenname.first,
|
43
|
+
:last_name => ldap_entry.sn.first,
|
44
|
+
:email => ldap_entry.mail.first,
|
45
|
+
:phone => ldap_entry.phone,
|
46
|
+
:departments => ldap_entry.berkeleyeduunithrdeptname,
|
47
|
+
:affiliations => ldap_entry.berkeleyeduaffiliations
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|