muck-users 0.3.4 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
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