muck-users 3.2.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -126,7 +126,7 @@ Calling rake muck:sync:users will pull in images, javascript and other assets.
126
126
  The javascript is automatically included when needed and does not need to be added to the head of your document.
127
127
  It is recommended that you include muck-users.css or copy it's content's and modify it as needed.
128
128
 
129
- === Beta Codes
129
+ === Access Codes
130
130
  muck-users includes the ability to require a code to sign up. Add a sign up form to collect emails:
131
131
 
132
132
  <%= muck_form_for :access_code_request, :url => access_code_requests_path, :html => { :class => 'ajax beta_code_request_form' } do |f| -%>
@@ -142,17 +142,20 @@ All emails will be stored in the database. Access the admin to send out beta cod
142
142
  http://yoursite.com/admin/access_codes
143
143
 
144
144
  === Helpers
145
- Muck users provides an autocomplete login search. To enable this functionality create a text box with the class 'login-search' and add
146
- the following code to include the needed javascript and css:
145
+ muck-users provides helpers that will build your signup form (@user is a new empty user):
147
146
 
148
- <% content_for :head do -%>
149
- <%= javascript_include_tag 'jquery/jquery.autocomplete.min.js' %>
150
- <%= javascript_include_tag 'muck-users' %>
151
- <%= stylesheet_link_tag 'jquery/jquery.autocomplete.js' %>
152
- <% end -%>
147
+ <%= signup_form(@user) %>
148
+
149
+ This will build a sign in form:
150
+
151
+ <%= signin_form %>
152
+
153
+ If you need a random access code in a page just call (@user is optional but if set it should be the user sharing the access code with another user):
154
+
155
+ <%= random_access_code(@user) %>
153
156
 
154
- If you override the users controller you will also need to include login_search in your routes:
155
- map.resources :users, :collection => { :login_search => :get }
157
+ === Notes
158
+ If you override any of the controllers in muck-users be sure to include the appropriate routes in your project. Look at lib/config/routes.rb for examples.
156
159
 
157
160
 
158
161
  == General information
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.0
1
+ 3.2.1
@@ -1,7 +1,7 @@
1
1
  class Admin::Muck::AccessCodesController < Admin::Muck::BaseController
2
2
 
3
3
  def index
4
- @codes = AccessCode.by_alpha.paginate(:page => @page, :per_page => @per_page)
4
+ @codes = AccessCode.by_newest.includes(:provided_by, :users).paginate(:page => @page, :per_page => @per_page)
5
5
  render :template => 'admin/access_codes/index'
6
6
  end
7
7
 
@@ -20,6 +20,13 @@ class Admin::Muck::UsersController < Admin::Muck::BaseController
20
20
  end
21
21
  end
22
22
 
23
+ def show
24
+ @user = User.find(params[:id])
25
+ respond_to do |format|
26
+ format.html { render :template => 'admin/users/show' }
27
+ end
28
+ end
29
+
23
30
  def inactive
24
31
  @user_inactive_count = User.inactive_count
25
32
  @users = User.inactive.paginate(:page => @page, :per_page => @per_page)
@@ -46,7 +53,8 @@ class Admin::Muck::UsersController < Admin::Muck::BaseController
46
53
  end
47
54
 
48
55
  def search
49
- @users = User.where("first_name LIKE ? OR last_name LIKE ? OR email LIKE ?", params[:query], params[:query], params[:query] ).paginate(:page => @page, :per_page => @per_page )
56
+ @is_search = true
57
+ @users = User.where("first_name LIKE ? OR last_name LIKE ? OR email LIKE ?", params[:query], params[:query], params[:query] ).paginate(:page => @page, :per_page => @per_page )
50
58
  respond_to do |format|
51
59
  format.html { render :template => 'admin/users/index' }
52
60
  format.js { render :partial => 'admin/users/table', :layout => false }
@@ -90,7 +90,10 @@ class Muck::UsersController < ApplicationController
90
90
  end
91
91
 
92
92
  def is_login_available
93
- result = t('muck.users.username_not_available')
93
+ @available = 'unavailable'
94
+ @output_element = 'username'
95
+ recover_password_prompt = render_to_string :partial => 'users/recover_password_via_email_link', :locals => { :email => params[:user_email] }
96
+ result = t('muck.users.username_not_available', :reset_password_help => recover_password_prompt.html_safe).html_safe
94
97
  if params[:user_login].nil?
95
98
  result = ''
96
99
  elsif params[:user_login].empty?
@@ -104,21 +107,18 @@ class Muck::UsersController < ApplicationController
104
107
  result = t('muck.users.username_available')
105
108
  end
106
109
  end
110
+ if !@user.blank? && @user.errors[:login].blank? && !result.blank?
111
+ @available = 'available'
112
+ end
107
113
  respond_to do |format|
108
- if !@user.blank? && @user.errors[:login].blank? && !result.blank?
109
- format.html { render :partial => 'users/available', :locals => { :message => result } }
110
- format.js { render :partial => 'users/available', :locals => { :message => result } }
111
- else
112
- format.html { render :partial => 'users/unavailable', :locals => { :message => result } }
113
- format.js { render :partial => 'users/unavailable', :locals => { :message => result } }
114
- end
115
-
116
- #format.html { render :text => result }
117
- #format.js { render :text => result }
114
+ format.html { render :partial => 'users/availability', :locals => { :message => result } }
115
+ format.js { render :partial => 'users/availability', :locals => { :message => result } }
118
116
  end
119
117
  end
120
118
 
121
119
  def is_email_available
120
+ @available = 'unavailable'
121
+ @output_element = 'email'
122
122
  if params[:user_email].nil?
123
123
  result = ''
124
124
  elsif params[:user_email].empty?
@@ -134,19 +134,17 @@ class Muck::UsersController < ApplicationController
134
134
  recover_password_prompt = render_to_string :partial => 'users/recover_password_via_email_link', :locals => { :email => params[:user_email] }
135
135
  result = t('muck.users.email_not_available', :reset_password_help => recover_password_prompt.html_safe).html_safe
136
136
  respond_to do |format|
137
- format.html { render :partial => 'users/unavailable', :locals => { :message => result.html_safe } }
138
- format.js { render :partial => 'users/unavailable', :locals => { :message => result } }
137
+ format.html { render :partial => 'users/availability', :locals => { :message => result } }
138
+ format.js { render :partial => 'users/availability', :locals => { :message => result } }
139
139
  end
140
140
  return
141
+ end
142
+ if errors.blank? && ! result.nil?
143
+ @available = 'available'
141
144
  end
142
145
  respond_to do |format|
143
- if errors.blank? && ! result.nil?
144
- format.html { render :partial => 'users/available', :locals => { :message => result } }
145
- format.js { render :partial => 'users/available', :locals => { :message => result } }
146
- else
147
- format.html { render :partial => 'users/unavailable', :locals => { :message => result } }
148
- format.js { render :partial => 'users/unavailable', :locals => { :message => result } }
149
- end
146
+ format.html { render :partial => 'users/availability', :locals => { :message => result } }
147
+ format.js { render :partial => 'users/availability', :locals => { :message => result } }
150
148
  end
151
149
  end
152
150
 
@@ -16,6 +16,13 @@ module MuckUsersHelper
16
16
  end
17
17
  end
18
18
 
19
+ if params[:access_code].blank?
20
+ @access_code_help = '<p id="access_code_help" class="attention">' +
21
+ translate('muck.users.access_code_help',
22
+ :access_request_anchor => %Q{<a class="fancy-access-request iframe" href="#{new_access_code_request_path}">},
23
+ :access_request_anchor_end => "</a>") + '<p>'.html_safe
24
+ end
25
+
19
26
  raw_block_to_partial('users/signup_form', options.merge(:user => user, :redirect_to => redirect_to), &block)
20
27
  end
21
28
 
@@ -42,4 +49,17 @@ module MuckUsersHelper
42
49
  end
43
50
  end
44
51
 
52
+ # Generates a new random access code. If provided_by is provided then the provided_by user
53
+ # will be attached to the access code as the providing user.
54
+ def random_access_code(provided_by)
55
+ access_code = AccessCode.new(:expires_at => 1.year.since)
56
+ access_code.provided_by = provided_by
57
+ access_code.unlimited = false
58
+ access_code.use_limit = 1
59
+ access_code.uses = 0
60
+ access_code.code = AccessCode.random_code
61
+ access_code.save!
62
+ access_code
63
+ end
64
+
45
65
  end
@@ -4,6 +4,12 @@
4
4
  <td><%= access_code.use_limit %></td>
5
5
  <td><%= access_code.unlimited %></td>
6
6
  <td><%= access_code.sent_to %></td>
7
+ <td><%= link_to(access_code.provided_by.display_name, admin_user_path(access_code.provided_by)) if access_code.provided_by %></td>
8
+ <td>
9
+ <% access_code.users.each do |user| %>
10
+ <%= link_to(user.display_name, admin_user_path(user))%>
11
+ <% end -%>
12
+ </td>
7
13
  <td><%= format_date(access_code.expires_at) %></td>
8
14
  <td><%= format_date(access_code.created_at) %></td>
9
15
  <td><%= link_to(translate('muck.users.edit'), edit_admin_access_code_path(access_code.id), { :class => 'dialog-pop', :title => translate('muck.users.edit_access_code_title') }) %></td>
@@ -7,7 +7,9 @@
7
7
  <th><%=translate('muck.users.access_code_uses') %></th>
8
8
  <th><%=translate('muck.users.access_code_use_limit') %></th>
9
9
  <th><%=translate('muck.users.access_code_unlimited') %></th>
10
- <th><%=translate('muck.users.access_code_sent_to') %></th>
10
+ <th><%=translate('muck.users.access_code_sent_to') %></th>
11
+ <th><%=translate('muck.users.access_code_provided_by') %></th>
12
+ <th><%=translate('muck.users.access_code_used_by') %></th>
11
13
  <th><%=translate('muck.users.access_code_expires') %></th>
12
14
  <th><%=translate('muck.users.access_code_created') %></th>
13
15
  <th></th>
@@ -1,5 +1,5 @@
1
1
  <tr id="<%=user.dom_id('row')%>" class="<%= cycle('odd','even') %> <%=active_class(user)%>">
2
- <td><%= link_to h(user.full_name), user %></td>
2
+ <td><%= link_to h(user.full_name), admin_user_path(user) %></td>
3
3
  <td><%= mail_to h(user.email), user.email %></td>
4
4
  <td>
5
5
  <ul id="<%=user.dom_id('permissions')%>" class="permissions inline">
@@ -1,5 +1,5 @@
1
1
  <div id="search_box" class="search-box">
2
- <%= form_tag search_admin_users_path, :class => 'ajax' do -%>
2
+ <%= form_tag search_admin_users_path do -%>
3
3
  <%= text_field_tag :query, '', :class => 'span-5' %>
4
4
  <%= submit_tag t("muck.users.admin.search_users") %>
5
5
  <% end -%>
@@ -1,5 +1,8 @@
1
1
  <div>
2
2
  <h2><%= t('muck.users.admin_users_title') %></h2>
3
- <%= link_to 'Download Users', admin_users_path(:format => 'csv')%>
3
+ <% if !@is_search -%>
4
+ <%= link_to 'Download Users', admin_users_path(:format => 'csv')%>
5
+ <%=translate('muck.users.total_users', :total => User.count) %>
6
+ <% end -%>
4
7
  <%= render :partial => 'admin/users/table' -%>
5
8
  </div>
@@ -0,0 +1,17 @@
1
+ <h2><%= link_to @user.full_name, @user %></h2>
2
+ <%= mail_to @user.email, @user.email %>
3
+ <%= link_to t('muck.users.public_profile'), @user %>
4
+ <div>
5
+ <ul id="<%=@user.dom_id('permissions')%>" class="permissions inline">
6
+ <%= render :partial => 'admin/permissions/permission', :collection => @user.permissions, :locals => { :user => @user } %>
7
+ </ul>
8
+ </div>
9
+
10
+ <div>
11
+ <ul class="drop-menu">
12
+ <li><%= link_to(translate('muck.users.change_permissions'), permissions_admin_user_path(@user), { :title => translate('muck.users.change_permissions_for', :user => @user.full_name), :class => 'dialog-pop', :alt => 'pop' }) %></li>
13
+ <li><%= render :partial => 'admin/users/activate', :locals => { :user => @user }, :alt => 'pop' %></li>
14
+ <li><%= link_to(t("muck.users.edit"), edit_admin_user_path(@user.id), { :title =>t('muck.users.edit_this_user'), :class => 'dialog-pop', :alt => 'pop'}) -%></li>
15
+ <li><%= link_to(t("muck.general.delete"), admin_user_path(@user.id), { :title => t('muck.users.delete_this_user'), :class => 'delete-user ajax-delete' }) -%></li>
16
+ </ul>
17
+ </div>
@@ -0,0 +1,2 @@
1
+ jQuery("#<%=@output_element%>-availibility").html('<span class="<%= @available %>"><%= message.html_safe %></span>');
2
+
@@ -20,12 +20,9 @@
20
20
  :access_request_anchor => %Q{<a class="fancy-access-request iframe" href="#{new_access_code_request_path}">},
21
21
  :access_request_anchor_end => "</a>").html_safe %>
22
22
  </p>
23
- <% end -%>
23
+ <% end -%>
24
24
  <%= f.text_field :access_code_code, { :label => translate('muck.users.access_code'),
25
- :extra_html => '<p id="access_code_help" class="attention">' +
26
- translate('muck.users.access_code_help',
27
- :access_request_anchor => %Q{<a class="fancy-access-request iframe" href="#{new_access_code_request_path}">},
28
- :access_request_anchor_end => "</a>") + '<p>'.html_safe } -%>
25
+ :extra_html => @access_code_help } -%>
29
26
  <% end -%>
30
27
 
31
28
  <%= f.text_field :login, { :label => t('muck.users.choose_member_name'),
@@ -1,5 +1,7 @@
1
- <% content_for :head do -%>
1
+ <% content_for :javascript do -%>
2
2
  <%= javascript_include_tag 'jquery/jquery.autocomplete.min.js' %>
3
3
  <%= javascript_include_tag 'muck-users' %>
4
+ <% end -%>
5
+ <% content_for :head do -%>
4
6
  <%= stylesheet_link_tag 'jquery/jquery.autocomplete.css' %>
5
7
  <% end -%>
@@ -2,6 +2,7 @@
2
2
  en:
3
3
  muck:
4
4
  users:
5
+ public_profile: Public Profile
5
6
  add_access_code: Add Access Code
6
7
  cant_delete_admin: You can't delete a user that is in the admin role. Remove the user from the administrator role and then try again. Please be careful when deleting administrators. If you delete all administrator accounts you will no longer be able to login to the administration system.
7
8
  sign_in_now: Sign in now!
@@ -24,7 +25,8 @@ en:
24
25
  bulk_access_code_message: Message
25
26
  view_your_account: View Your Account
26
27
  password_mismatch: Password mismatch.
27
- username_not_available: Username not available
28
+ username_not_available: Username already in use. %{reset_password_help}
29
+ email_not_available: Email already in use. %{reset_password_help}
28
30
  admin:
29
31
  activate_all_inactive_users_confirm: Are you sure you want to activate all inactive users in the system? This cannot be undone!
30
32
  activate_all_inactive_users: Activate All Inactive Users
@@ -37,7 +39,6 @@ en:
37
39
  confirm_select_new_password: Confirm Password Change
38
40
  email_invalid: Invalid email
39
41
  user_disable_problem: There was a problem disabling this user.
40
- email_not_available: Email already in use. %{reset_password_help}
41
42
  total_users: "Total Users: %{total}"
42
43
  add_role_dialog_title: Add Role
43
44
  submit: Submit
@@ -91,6 +92,8 @@ en:
91
92
  search_users: Search Users
92
93
  access_code_uses: Uses
93
94
  access_code_sent_to: Sent To
95
+ access_code_provided_by: Provided By
96
+ access_code_used_by: Used By
94
97
  select_new_password: Select a New Password
95
98
  login: Login
96
99
  access_code_requests_code_sent_on: Code Sent on
@@ -0,0 +1,9 @@
1
+ class AddProvidedByToAccessCodes < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :access_codes, :provided_by_id, :integer
4
+ end
5
+
6
+ def self.down
7
+ remove_column :access_codes, :provided_by_id
8
+ end
9
+ end
@@ -10,7 +10,8 @@ module MuckUsers
10
10
  validates_uniqueness_of :code
11
11
 
12
12
  has_many :users
13
-
13
+ belongs_to :provided_by, :class_name => "User"
14
+
14
15
  scope :by_newest, order('access_codes.created_at DESC')
15
16
  scope :by_alpha, order('access_codes.code ASC')
16
17
  scope :active, where('access_codes.expires_at > Now() AND access_codes.uses <= use_limit')
@@ -21,6 +21,7 @@ module MuckUsers
21
21
  scope :by_login_alpha, order("users.login ASC")
22
22
  scope :by_login, lambda { |*args| { :conditions => ["users.login LIKE ?", args.first + '%'] } }
23
23
 
24
+ has_many :provided_access_codes, :class_name => "AccessCode", :foreign_key => "provided_by_id"
24
25
  belongs_to :access_code
25
26
  accepts_nested_attributes_for :access_code
26
27
  attr_accessor :access_code_code
@@ -33,7 +34,7 @@ module MuckUsers
33
34
  before_save :lower_login
34
35
 
35
36
  validates_format_of :login, :with => /^[a-z0-9-]+$/i, :message => 'may only contain letters, numbers or a hyphen.'
36
- validates_format_of :email, :with => email_regex, :message => 'does not look like a valid email address.'
37
+ #validates_format_of :email, :with => email_regex, :message => 'does not look like a valid email address.'
37
38
 
38
39
  # prevents a user from submitting a crafted form that bypasses activation
39
40
  attr_protected :crypted_password, :password_salt, :persistence_token, :single_access_token, :perishable_token, :login_count,
data/muck-users.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{muck-users}
8
- s.version = "3.2.0"
8
+ s.version = "3.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Justin Ball", "Joel Duffin"]
12
- s.date = %q{2011-04-19}
12
+ s.date = %q{2011-04-20}
13
13
  s.description = %q{Easily add user signup, login and other features to your application}
14
14
  s.email = %q{justin@tatemae.com}
15
15
  s.extra_rdoc_files = [
@@ -79,6 +79,7 @@ Gem::Specification.new do |s|
79
79
  "app/views/admin/users/row.js.erb",
80
80
  "app/views/admin/users/search.html.erb",
81
81
  "app/views/admin/users/search.js.erb",
82
+ "app/views/admin/users/show.html.erb",
82
83
  "app/views/password_resets/edit.html.erb",
83
84
  "app/views/password_resets/new.html.erb",
84
85
  "app/views/user_mailer/access_code.ar.html.erb",
@@ -408,11 +409,10 @@ Gem::Specification.new do |s|
408
409
  "app/views/user_sessions/_form.erb",
409
410
  "app/views/user_sessions/new.html.erb",
410
411
  "app/views/username_request/new.html.erb",
411
- "app/views/users/_available.html.erb",
412
+ "app/views/users/_availability.html.erb",
412
413
  "app/views/users/_recover_password_via_email_link.html.erb",
413
414
  "app/views/users/_signup_form.html.erb",
414
415
  "app/views/users/_signup_form_javascript.html.erb",
415
- "app/views/users/_unavailable.html.erb",
416
416
  "app/views/users/_user.html.erb",
417
417
  "app/views/users/activation_confirmation.html.erb",
418
418
  "app/views/users/activation_instructions.html.erb",
@@ -472,6 +472,7 @@ Gem::Specification.new do |s|
472
472
  "db/migrate/20100123233654_create_access_code_requests.rb",
473
473
  "db/migrate/20101117172951_add_name_to_access_code_requests.rb",
474
474
  "db/migrate/20110303183433_add_sent_to_to_access_codes.rb",
475
+ "db/migrate/20110420153714_add_provided_by_to_access_codes.rb",
475
476
  "lib/muck-users.rb",
476
477
  "lib/muck-users/config.rb",
477
478
  "lib/muck-users/controllers/authentic_application.rb",
@@ -1,16 +1,12 @@
1
1
  jQuery(document).ready(function() {
2
2
  jQuery("#user_login").blur(function(){
3
- jQuery.post("/users/is_login_available",{ user_login:jQuery(this).val(), format:'js' },function(data){
4
- jQuery("#username-availibility").html(data);
5
- });
3
+ jQuery.post("/users/is_login_available",{ user_login:jQuery(this).val(), format:'js' },function(data){});
6
4
  });
7
5
  jQuery("#user_login").keydown(function() {
8
6
  jQuery("#username-availibility").html('');
9
7
  });
10
8
  jQuery("#user_email").blur(function(){
11
- jQuery.post("/users/is_email_available",{ user_email:jQuery(this).val(), format:'js' },function(data){
12
- jQuery("#email-availibility").html(data);
13
- });
9
+ jQuery.post("/users/is_email_available",{ user_email:jQuery(this).val(), format:'js' },function(data){});
14
10
  });
15
11
  jQuery("#user_email").keydown(function() {
16
12
  jQuery("#email-availibility").html('');
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: muck-users
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 13
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 2
9
- - 0
10
- version: 3.2.0
9
+ - 1
10
+ version: 3.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Justin Ball
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-04-19 00:00:00 -06:00
19
+ date: 2011-04-20 00:00:00 -06:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -147,6 +147,7 @@ files:
147
147
  - app/views/admin/users/row.js.erb
148
148
  - app/views/admin/users/search.html.erb
149
149
  - app/views/admin/users/search.js.erb
150
+ - app/views/admin/users/show.html.erb
150
151
  - app/views/password_resets/edit.html.erb
151
152
  - app/views/password_resets/new.html.erb
152
153
  - app/views/user_mailer/access_code.ar.html.erb
@@ -476,11 +477,10 @@ files:
476
477
  - app/views/user_sessions/_form.erb
477
478
  - app/views/user_sessions/new.html.erb
478
479
  - app/views/username_request/new.html.erb
479
- - app/views/users/_available.html.erb
480
+ - app/views/users/_availability.html.erb
480
481
  - app/views/users/_recover_password_via_email_link.html.erb
481
482
  - app/views/users/_signup_form.html.erb
482
483
  - app/views/users/_signup_form_javascript.html.erb
483
- - app/views/users/_unavailable.html.erb
484
484
  - app/views/users/_user.html.erb
485
485
  - app/views/users/activation_confirmation.html.erb
486
486
  - app/views/users/activation_instructions.html.erb
@@ -540,6 +540,7 @@ files:
540
540
  - db/migrate/20100123233654_create_access_code_requests.rb
541
541
  - db/migrate/20101117172951_add_name_to_access_code_requests.rb
542
542
  - db/migrate/20110303183433_add_sent_to_to_access_codes.rb
543
+ - db/migrate/20110420153714_add_provided_by_to_access_codes.rb
543
544
  - lib/muck-users.rb
544
545
  - lib/muck-users/config.rb
545
546
  - lib/muck-users/controllers/authentic_application.rb
@@ -1 +0,0 @@
1
- <span class="available"><%= message %></span>
@@ -1 +0,0 @@
1
- <span class="unavailable"><%= message %></span>