muck-users 0.3.4 → 0.3.6

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.rdoc CHANGED
@@ -104,6 +104,19 @@ By default when a user logs out they are sent to the login page. You can add a
104
104
 
105
105
  muck-users sends out emails that need to be able to generate links. Be sure to set a value for application_url in global_config.yml
106
106
 
107
+ === Helpers
108
+ Muck users provides an autocomplete login search. To enable this functionality create a text box with the class 'login-search' and add
109
+ the following code to include the needed javascript and css:
110
+
111
+ <% content_for :head do -%>
112
+ <%= javascript_include_tag 'jquery/jquery.autocomplete.min' %>
113
+ <%= javascript_include_tag 'muck-users' %>
114
+ <%= stylesheet_link_tag 'jquery/jquery.autocomplete' %>
115
+ <% end -%>
116
+
117
+ If you override the users controller you will also need to include login_search in your routes:
118
+ map.resources :users, :collection => { :login_search => :get }
119
+
107
120
 
108
121
  == General information
109
122
  This engine implements authlogic. Some of the code contained was taken from here:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.4
1
+ 0.3.6
@@ -77,6 +77,16 @@ class Muck::UsersController < ApplicationController
77
77
  after_destroy_response
78
78
  end
79
79
 
80
+ def login_search
81
+ if params[:q]
82
+ @users = User.by_login_alpha.by_login(params[:q], :limit => params[:limit] || 100)
83
+ end
84
+ respond_to do |format|
85
+ format.js { render :text => @users.collect{|user| user.login }.join("\n") }
86
+ format.json { render :json => @users.collect{|user| { :login => user.login } }.to_json }
87
+ end
88
+ end
89
+
80
90
  def is_login_available
81
91
  result = t('muck.users.username_not_available')
82
92
  if params[:user_login].nil?
@@ -85,13 +95,9 @@ class Muck::UsersController < ApplicationController
85
95
  result = t('muck.users.login_empty')
86
96
  elsif !User.login_exists?(params[:user_login])
87
97
  @user = User.new(:login => params[:user_login])
88
- if !@user.validate_attributes(:only => [:login])
89
- result = t('muck.users.invalid_username')
90
- @user.errors.full_messages.each do |message|
91
- if !message.include? 'blank'
92
- result += "<br />#{message}"
93
- end
94
- end
98
+ @user.valid? # we aren't interested in the output of this.
99
+ if @user.errors.on(:login)
100
+ result = "#{t('muck.users.invalid_username')} <br /> #{t('muck.users.username')} #{@user.errors.on(:login)}"
95
101
  else
96
102
  result = t('muck.users.username_available')
97
103
  end
@@ -3,7 +3,7 @@ ActionController::Routing::Routes.draw do |map|
3
3
  # users
4
4
  map.resources :users, :controller => 'muck/users',
5
5
  :member => { :enable => :put, :welcome => :get, :activation_instructions => :get },
6
- :collection => { :is_login_available => :post, :is_email_available => :post }
6
+ :collection => { :is_login_available => :post, :is_email_available => :post, :login_search => :get }
7
7
 
8
8
  map.with_options(:controller => 'muck/users') do |users|
9
9
  users.signup "/signup", :action => 'new', :requirements => {:protocol => muck_routes_protocol}
@@ -16,6 +16,8 @@ module ActiveRecord
16
16
  named_scope :active, :conditions => "activated_at IS NOT NULL"
17
17
  named_scope :inactive, :conditions => "activated_at IS NULL"
18
18
  named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
19
+ named_scope :by_login_alpha, :order => "login ASC"
20
+ named_scope :by_login, lambda { |*args| { :conditions => ["login LIKE ?", args.first + '%'] } }
19
21
 
20
22
  belongs_to :access_code
21
23
  accepts_nested_attributes_for :access_code
data/locales/en.yml CHANGED
@@ -62,6 +62,7 @@ en:
62
62
  access_code_delete_link: Delete Access Code
63
63
  request_access_code: Request Access Code
64
64
  first_name: First Name
65
+ username: Username
65
66
  forgot_username: Forgot Username
66
67
  updated_permissions: Updated Permissions
67
68
  account_activated: Your account has been activated! You can now login.
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 = "0.3.4"
8
+ s.version = "0.3.6"
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{2010-02-08}
12
+ s.date = %q{2010-02-10}
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 = [
@@ -15,4 +15,10 @@ jQuery(document).ready(function() {
15
15
  jQuery("#user_email").keydown(function() {
16
16
  jQuery("#email-availibility").html('');
17
17
  });
18
+ jQuery(".login-search").autocomplete('/users/login_search.js', {
19
+ minChars: 1,
20
+ delay: 200,
21
+ autoFill: true,
22
+ mustMatch: false
23
+ });
18
24
  });
@@ -13,12 +13,13 @@ class ApplicationController < ActionController::Base
13
13
  access_denied unless admin?
14
14
  end
15
15
 
16
- # only require ssl if we are in production
16
+ # only require ssl if it is turned on
17
17
  def ssl_required?
18
- return ENV['SSL'] == 'on' ? true : false if defined? ENV['SSL']
19
- return false if local_request?
20
- return false if RAILS_ENV == 'test'
21
- ((self.class.read_inheritable_attribute(:ssl_required_actions) || []).include?(action_name.to_sym)) && (RAILS_ENV == 'production' || RAILS_ENV == 'staging')
18
+ if GlobalConfig.enable_ssl
19
+ (self.class.read_inheritable_attribute(:ssl_required_actions) || []).include?(action_name.to_sym)
20
+ else
21
+ false
22
+ end
22
23
  end
23
-
24
+
24
25
  end
@@ -1,4 +1,4 @@
1
- NOTE: the jquery.autocomplete.pack.js file is modified from the original to work with luvfoo. Specifically line
1
+ NOTE: the jquery.autocomplete.pack.js file has been modified. Specifically line
2
2
  314 was changed from
3
3
  if ( data && data.length && hasFocus ) {
4
4
  to
@@ -15,4 +15,10 @@ jQuery(document).ready(function() {
15
15
  jQuery("#user_email").keydown(function() {
16
16
  jQuery("#email-availibility").html('');
17
17
  });
18
+ jQuery(".login-search").autocomplete('/users/login_search.js', {
19
+ minChars: 1,
20
+ delay: 200,
21
+ autoFill: true,
22
+ mustMatch: false
23
+ });
18
24
  });
@@ -232,32 +232,91 @@ class Muck::UsersControllerTest < ActionController::TestCase
232
232
  should_redirect_to("login") { login_path }
233
233
  end
234
234
  end
235
-
236
- context "on GET to is_email_available" do
235
+
236
+ context "GET to login_search" do
237
+ setup do
238
+ @auser = Factory(:user, :login => 'aaaa')
239
+ @zuser = Factory(:user, :login => 'zzzz')
240
+ end
241
+ context "valid params" do
242
+ setup do
243
+ get :login_search, :q => 'a', :format => 'js'
244
+ end
245
+ should_respond_with :success
246
+ should "find a user" do
247
+ assert @response.body.include?('aaaa')
248
+ assert assigns(:users).include?(@auser)
249
+ end
250
+ should "not find a non-matching user" do
251
+ assert !@response.body.include?('zzzz')
252
+ end
253
+ end
254
+ end
255
+
256
+ context "POST to is_login_available" do
257
+ context "no params" do
258
+ setup do
259
+ post :is_login_available
260
+ end
261
+ should_respond_with :success
262
+ should_render_text ""
263
+ end
264
+ context "empty login" do
265
+ setup do
266
+ post :is_login_available, :user_login => ''
267
+ end
268
+ should_respond_with :success
269
+ should_render_text I18n.t('muck.users.login_empty')
270
+ end
271
+ context "valid login" do
272
+ setup do
273
+ post :is_login_available, :user_login => 'testdude1945'
274
+ end
275
+ should_respond_with :success
276
+ should_render_text I18n.t('muck.users.username_available')
277
+ end
278
+ context "invalid login" do
279
+ setup do
280
+ post :is_login_available, :user_login => 'testdude1945@example.comm'
281
+ end
282
+ should_respond_with :success
283
+ should_render_partial_text I18n.t('muck.users.invalid_username')
284
+ end
285
+ context "login not available" do
286
+ setup do
287
+ @user = Factory(:user)
288
+ post :is_login_available, :user_login => @user.login
289
+ end
290
+ should_respond_with :success
291
+ should_render_partial_text I18n.t('muck.users.username_not_available')
292
+ end
293
+ end
294
+
295
+ context "POST to is_email_available" do
237
296
  context "no params" do
238
297
  setup do
239
- get :is_email_available
298
+ post :is_email_available
240
299
  end
241
300
  should_respond_with :success
242
301
  should_render_text ""
243
302
  end
244
303
  context "empty email" do
245
304
  setup do
246
- get :is_email_available, :user_email => ''
305
+ post :is_email_available, :user_email => ''
247
306
  end
248
307
  should_respond_with :success
249
308
  should_render_text I18n.t('muck.users.email_empty')
250
309
  end
251
310
  context "valid email" do
252
311
  setup do
253
- get :is_email_available, :user_email => 'testdude1945@example.com'
312
+ post :is_email_available, :user_email => 'testdude1945@example.com'
254
313
  end
255
314
  should_respond_with :success
256
315
  should_render_text I18n.t('muck.users.email_available')
257
316
  end
258
317
  context "invalid email" do
259
318
  setup do
260
- get :is_email_available, :user_email => 'testdude1945@com'
319
+ post :is_email_available, :user_email => 'testdude1945@com'
261
320
  end
262
321
  should_respond_with :success
263
322
  should_render_text I18n.t('muck.users.email_invalid')
@@ -265,7 +324,7 @@ class Muck::UsersControllerTest < ActionController::TestCase
265
324
  context "email not available" do
266
325
  setup do
267
326
  @user = Factory(:user)
268
- get :is_email_available, :user_email => @user.email
327
+ post :is_email_available, :user_email => @user.email
269
328
  end
270
329
  should_respond_with :success
271
330
  should_render_partial_text I18n.t('muck.users.email_not_available', :reset_password_help => '')
@@ -75,6 +75,31 @@ class UserTest < ActiveSupport::TestCase
75
75
  assert !User.inactive.include?(@active_user)
76
76
  end
77
77
  end
78
+ context "by_login_alpha" do
79
+ setup do
80
+ @user1 = Factory(:user, :login => 'atest')
81
+ @user2 = Factory(:user, :login => 'btest')
82
+ end
83
+ should "order by login" do
84
+ users = User.by_login_alpha
85
+ assert users.index(@user1) < users.index(@user2)
86
+ end
87
+ end
88
+ context "by_login" do
89
+ setup do
90
+ @zuser = Factory(:user, :login => 'zasdf')
91
+ @xuser = Factory(:user, :login => 'xasdf')
92
+ end
93
+ should "find login by character match" do
94
+ assert User.by_login('z').include?(@zuser)
95
+ end
96
+ should "not find login that doesn't match" do
97
+ assert !User.by_login('x').include?(@zuser)
98
+ end
99
+ should "not find login that start with a matching character" do
100
+ assert User.by_login('asdf').blank?
101
+ end
102
+ end
78
103
  end
79
104
  end
80
105
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: muck-users
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Ball
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2010-02-08 00:00:00 -07:00
13
+ date: 2010-02-10 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency