devise_invitable 1.4.0 → 1.4.1
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.
Potentially problematic release.
This version of devise_invitable might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/controllers/devise/invitations_controller.rb +9 -5
- data/config/locales/en.yml +9 -9
- data/lib/devise_invitable/model.rb +9 -8
- data/lib/devise_invitable/version.rb +1 -1
- data/test/functional/controller_helpers_test.rb +3 -3
- data/test/integration/invitation_remove_test.rb +1 -1
- data/test/integration/invitation_test.rb +13 -3
- data/test/models/invitable_test.rb +5 -5
- data/test/rails_app/app/controllers/application_controller.rb +7 -0
- data/test/rails_app/app/controllers/free_invitations_controller.rb +6 -0
- data/test/rails_app/app/views/devise/sessions/new.html.erb +17 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3baf83979bda300001727d86af188f93a91bf95c
|
4
|
+
data.tar.gz: 74d6ac1f55c041e7075e4c1e8ec026e470fdfe12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b08b0b990d88fd99aed53e4d3082db8354bda2e5046fad13901debde5ecb614ba5cdcea7e11709798ea16d4dc99dac27dbd622534179cf1d9a3cbaaaba38bda
|
7
|
+
data.tar.gz: 3ca119718132addd0b7b331ac4fe81c4e21852b6480ef10c3ed742492b82e86e6fbd01f84957e5a7b6426aba2bbd5eaeb8f65460730399f3e286e125355ca77f
|
@@ -15,13 +15,15 @@ class Devise::InvitationsController < DeviseController
|
|
15
15
|
# POST /resource/invitation
|
16
16
|
def create
|
17
17
|
self.resource = invite_resource
|
18
|
+
resource_invited = resource.errors.empty?
|
18
19
|
|
19
|
-
if
|
20
|
-
|
20
|
+
yield resource if block_given?
|
21
|
+
|
22
|
+
if resource_invited
|
21
23
|
if is_flashing_format? && self.resource.invitation_sent_at
|
22
24
|
set_flash_message :notice, :send_instructions, :email => self.resource.email
|
23
25
|
end
|
24
|
-
respond_with resource, :location => after_invite_path_for(
|
26
|
+
respond_with resource, :location => after_invite_path_for(current_inviter)
|
25
27
|
else
|
26
28
|
respond_with_navigational(resource) { render :new }
|
27
29
|
end
|
@@ -36,9 +38,11 @@ class Devise::InvitationsController < DeviseController
|
|
36
38
|
# PUT /resource/invitation
|
37
39
|
def update
|
38
40
|
self.resource = accept_resource
|
41
|
+
invitation_accepted = resource.errors.empty?
|
42
|
+
|
43
|
+
yield resource if block_given?
|
39
44
|
|
40
|
-
if
|
41
|
-
yield resource if block_given?
|
45
|
+
if invitation_accepted
|
42
46
|
flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
|
43
47
|
set_flash_message :notice, flash_message if is_flashing_format?
|
44
48
|
sign_in(resource_name, resource)
|
data/config/locales/en.yml
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
en:
|
2
2
|
devise:
|
3
3
|
failure:
|
4
|
-
invited:
|
4
|
+
invited: "You have a pending invitation, accept it to finish creating your account."
|
5
5
|
invitations:
|
6
|
-
send_instructions:
|
7
|
-
invitation_token_invalid:
|
8
|
-
updated:
|
6
|
+
send_instructions: "An invitation email has been sent to %{email}."
|
7
|
+
invitation_token_invalid: "The invitation token provided is not valid!"
|
8
|
+
updated: "Your password was set successfully. You are now signed in."
|
9
9
|
no_invitations_remaining: "No invitations remaining"
|
10
|
-
invitation_removed:
|
10
|
+
invitation_removed: "Your invitation was removed."
|
11
11
|
new:
|
12
12
|
header: "Send invitation"
|
13
13
|
submit_button: "Send an invitation"
|
@@ -16,8 +16,8 @@ en:
|
|
16
16
|
submit_button: "Set my password"
|
17
17
|
mailer:
|
18
18
|
invitation_instructions:
|
19
|
-
subject:
|
20
|
-
hello:
|
21
|
-
someone_invited_you:
|
22
|
-
accept:
|
19
|
+
subject: "Invitation instructions"
|
20
|
+
hello: "Hello %{email}"
|
21
|
+
someone_invited_you: "Someone has invited you to %{url}, you can accept it through the link below."
|
22
|
+
accept: "Accept invitation"
|
23
23
|
ignore: "If you don't want to accept the invitation, please ignore this email.<br />Your account won't be created until you access the link above and set your password."
|
@@ -111,9 +111,9 @@ module Devise
|
|
111
111
|
end
|
112
112
|
|
113
113
|
yield self if block_given?
|
114
|
-
generate_invitation_token if self.invitation_token.nil? || (
|
114
|
+
generate_invitation_token if self.invitation_token.nil? || (!skip_invitation || @raw_invitation_token.nil?)
|
115
115
|
self.invitation_created_at = Time.now.utc
|
116
|
-
self.invitation_sent_at = self.invitation_created_at unless
|
116
|
+
self.invitation_sent_at = self.invitation_created_at unless skip_invitation
|
117
117
|
self.invited_by = invited_by if invited_by
|
118
118
|
|
119
119
|
# Call these before_validate methods since we aren't validating on save
|
@@ -122,7 +122,7 @@ module Devise
|
|
122
122
|
|
123
123
|
if save(:validate => false)
|
124
124
|
self.invited_by.decrement_invitation_limit! if !was_invited and self.invited_by.present?
|
125
|
-
deliver_invitation unless
|
125
|
+
deliver_invitation unless skip_invitation
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
@@ -172,9 +172,12 @@ module Devise
|
|
172
172
|
protected
|
173
173
|
# Overriding the method in Devise's :validatable module so password is not required on inviting
|
174
174
|
def password_required?
|
175
|
-
|
175
|
+
!skip_password && super
|
176
176
|
end
|
177
177
|
|
178
|
+
def skip_password
|
179
|
+
@skip_password ||= false
|
180
|
+
end
|
178
181
|
|
179
182
|
# Checks if the invitation for the user is within the limit time.
|
180
183
|
# We do this by calculating if the difference between today and the
|
@@ -254,13 +257,11 @@ module Devise
|
|
254
257
|
end
|
255
258
|
|
256
259
|
def invite!(attributes={}, invited_by=nil, &block)
|
257
|
-
|
258
|
-
invitable
|
260
|
+
_invite(attributes.with_indifferent_access, invited_by, &block).first
|
259
261
|
end
|
260
262
|
|
261
263
|
def invite_mail!(attributes={}, invited_by=nil, &block)
|
262
|
-
|
263
|
-
mail
|
264
|
+
_invite(attributes, invited_by, &block).last
|
264
265
|
end
|
265
266
|
|
266
267
|
# Attempt to find a user by it's invitation_token to set it's password.
|
@@ -4,11 +4,11 @@ class ControllerHelpersTest < ActionController::TestCase
|
|
4
4
|
tests ApplicationController
|
5
5
|
|
6
6
|
test "after invite path defaults to after sign in path" do
|
7
|
-
assert_equal @controller.
|
7
|
+
assert_equal @controller.send(:after_sign_in_path_for, :user), @controller.after_invite_path_for(:user)
|
8
8
|
end
|
9
9
|
|
10
10
|
test "after accept path defaults to after sign in path" do
|
11
|
-
assert_equal @controller.
|
11
|
+
assert_equal @controller.send(:after_sign_in_path_for, :user), @controller.after_accept_path_for(:user)
|
12
12
|
end
|
13
13
|
|
14
14
|
test 'after invite path is customizable from application controller' do
|
@@ -36,4 +36,4 @@ class ControllerHelpersTest < ActionController::TestCase
|
|
36
36
|
assert Devise::InvitationsController.method_defined? :after_accept_path_for
|
37
37
|
assert !Devise::InvitationsController.instance_methods(false).include?(:after_accept_path_for)
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
@@ -4,7 +4,7 @@ require 'integration_tests_helper'
|
|
4
4
|
class InvitationRemoveTest < ActionDispatch::IntegrationTest
|
5
5
|
|
6
6
|
test 'invited user can choose to remove his account/invite' do
|
7
|
-
|
7
|
+
User.invite!(:email => "valid@email.com")
|
8
8
|
|
9
9
|
# remove!
|
10
10
|
visit remove_user_invitation_path(:invitation_token => Thread.current[:token])
|
@@ -107,7 +107,7 @@ class InvitationTest < ActionDispatch::IntegrationTest
|
|
107
107
|
end
|
108
108
|
|
109
109
|
test 'sign in user automatically after setting it\'s password' do
|
110
|
-
|
110
|
+
User.invite!(:email => "valid@email.com")
|
111
111
|
set_password :invitation_token => Thread.current[:token]
|
112
112
|
assert_equal root_path, current_path
|
113
113
|
end
|
@@ -213,10 +213,20 @@ class InvitationTest < ActionDispatch::IntegrationTest
|
|
213
213
|
end
|
214
214
|
|
215
215
|
test 'authenticated admin should be able to send an admin invitation' do
|
216
|
-
|
216
|
+
admin = Admin.create(:email => 'admin@test.com', :password => '123456', :password_confirmation => '123456')
|
217
|
+
sign_in_as_user admin
|
217
218
|
|
218
219
|
send_invitation new_admin_path
|
219
|
-
assert_equal
|
220
|
+
assert_equal edit_admin_registration_path(admin), current_path
|
221
|
+
assert page.has_css?('p#notice', :text => 'An invitation email has been sent to user@test.com.')
|
222
|
+
end
|
223
|
+
|
224
|
+
test 'authenticated admin should be redirected to own page after send a free invitation' do
|
225
|
+
admin = Admin.create(:email => 'admin@test.com', :password => '123456', :password_confirmation => '123456')
|
226
|
+
sign_in_as_user admin
|
227
|
+
|
228
|
+
send_invitation new_free_invitation_path
|
229
|
+
assert_equal edit_admin_registration_path(admin), current_path
|
220
230
|
assert page.has_css?('p#notice', :text => 'An invitation email has been sent to user@test.com.')
|
221
231
|
end
|
222
232
|
end
|
@@ -169,7 +169,7 @@ class InvitableTest < ActiveSupport::TestCase
|
|
169
169
|
end
|
170
170
|
|
171
171
|
test 'should set password and password confirmation from params' do
|
172
|
-
|
172
|
+
User.invite!(:email => "valid@email.com")
|
173
173
|
user = User.accept_invitation!(:invitation_token => Thread.current[:token], :password => '123456789', :password_confirmation => '123456789')
|
174
174
|
assert user.valid_password?('123456789')
|
175
175
|
end
|
@@ -406,7 +406,7 @@ class InvitableTest < ActiveSupport::TestCase
|
|
406
406
|
user = new_user(:password => nil, :password_confirmation => nil)
|
407
407
|
user.invite!
|
408
408
|
|
409
|
-
|
409
|
+
User.accept_invitation!(
|
410
410
|
:invitation_token => Thread.current[:token],
|
411
411
|
:password => 'new_password',
|
412
412
|
:password_confirmation => 'new_password'
|
@@ -480,13 +480,13 @@ class InvitableTest < ActiveSupport::TestCase
|
|
480
480
|
|
481
481
|
test 'should not send an invitation if we want to skip the invitation' do
|
482
482
|
assert_no_difference('ActionMailer::Base.deliveries.size') do
|
483
|
-
|
483
|
+
User.invite!(:email => "valid@email.com", :username => "a"*50, :skip_invitation => true)
|
484
484
|
end
|
485
485
|
end
|
486
486
|
|
487
487
|
test 'should not send an invitation if we want to skip the invitation with block' do
|
488
488
|
assert_no_difference('ActionMailer::Base.deliveries.size') do
|
489
|
-
|
489
|
+
User.invite!(:email => "valid@email.com", :username => "a"*50) do |u|
|
490
490
|
u.skip_invitation = true
|
491
491
|
end
|
492
492
|
end
|
@@ -606,7 +606,7 @@ class InvitableTest < ActiveSupport::TestCase
|
|
606
606
|
end
|
607
607
|
|
608
608
|
test 'should return instance with errors if invitation_token is nil' do
|
609
|
-
|
609
|
+
User.create(:email => 'admin@test.com', :password => '123456', :password_confirmation => '123456')
|
610
610
|
user = User.accept_invitation!
|
611
611
|
assert !user.errors.empty?
|
612
612
|
end
|
@@ -3,6 +3,13 @@ class ApplicationController < ActionController::Base
|
|
3
3
|
before_filter :configure_permitted_parameters, :if => :devise_controller?
|
4
4
|
|
5
5
|
protected
|
6
|
+
def after_sign_in_path_for(resource)
|
7
|
+
if resource.is_a? Admin
|
8
|
+
edit_admin_registration_path(resource)
|
9
|
+
else
|
10
|
+
super
|
11
|
+
end
|
12
|
+
end
|
6
13
|
|
7
14
|
def configure_permitted_parameters
|
8
15
|
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :bio) } if defined?(ActionController::StrongParameters)
|
@@ -3,4 +3,10 @@ class FreeInvitationsController < Devise::InvitationsController
|
|
3
3
|
def authenticate_inviter!
|
4
4
|
# everyone can invite
|
5
5
|
end
|
6
|
+
def current_inviter
|
7
|
+
current_admin || current_user
|
8
|
+
end
|
9
|
+
def after_invite_path_for(resource)
|
10
|
+
resource ? super : root_path
|
11
|
+
end
|
6
12
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<h2>Log in</h2>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
|
4
|
+
<div><%= f.label :email %><br />
|
5
|
+
<%= f.email_field :email, autofocus: true %></div>
|
6
|
+
|
7
|
+
<div><%= f.label :password %><br />
|
8
|
+
<%= f.password_field :password, autocomplete: "off" %></div>
|
9
|
+
|
10
|
+
<% if devise_mapping.rememberable? -%>
|
11
|
+
<div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
|
12
|
+
<% end -%>
|
13
|
+
|
14
|
+
<div><%= f.submit "Log in" %></div>
|
15
|
+
<% end %>
|
16
|
+
|
17
|
+
<%= render "devise/shared/links" %>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise_invitable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergio Cambra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,9 @@ executables: []
|
|
66
66
|
extensions: []
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|
69
|
+
- CHANGELOG
|
70
|
+
- LICENSE
|
71
|
+
- README.rdoc
|
69
72
|
- app/controllers/devise/invitations_controller.rb
|
70
73
|
- app/controllers/devise_invitable/registrations_controller.rb
|
71
74
|
- app/views/devise/invitations/edit.html.erb
|
@@ -90,9 +93,6 @@ files:
|
|
90
93
|
- lib/generators/devise_invitable/templates/simple_form_for/invitations/new.html.erb
|
91
94
|
- lib/generators/devise_invitable/views_generator.rb
|
92
95
|
- lib/generators/mongoid/devise_invitable_generator.rb
|
93
|
-
- LICENSE
|
94
|
-
- README.rdoc
|
95
|
-
- CHANGELOG
|
96
96
|
- test/functional/controller_helpers_test.rb
|
97
97
|
- test/functional/registrations_controller_test.rb
|
98
98
|
- test/generators/views_generator_test.rb
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- test/rails_app/app/models/octopussy.rb
|
118
118
|
- test/rails_app/app/models/user.rb
|
119
119
|
- test/rails_app/app/views/admins/new.html.erb
|
120
|
+
- test/rails_app/app/views/devise/sessions/new.html.erb
|
120
121
|
- test/rails_app/app/views/free_invitations/new.html.erb
|
121
122
|
- test/rails_app/app/views/home/index.html.erb
|
122
123
|
- test/rails_app/app/views/layouts/application.html.erb
|
@@ -167,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
168
|
version: 1.3.6
|
168
169
|
requirements: []
|
169
170
|
rubyforge_project:
|
170
|
-
rubygems_version: 2.
|
171
|
+
rubygems_version: 2.4.5
|
171
172
|
signing_key:
|
172
173
|
specification_version: 4
|
173
174
|
summary: An invitation strategy for Devise
|
@@ -196,6 +197,7 @@ test_files:
|
|
196
197
|
- test/rails_app/app/models/octopussy.rb
|
197
198
|
- test/rails_app/app/models/user.rb
|
198
199
|
- test/rails_app/app/views/admins/new.html.erb
|
200
|
+
- test/rails_app/app/views/devise/sessions/new.html.erb
|
199
201
|
- test/rails_app/app/views/free_invitations/new.html.erb
|
200
202
|
- test/rails_app/app/views/home/index.html.erb
|
201
203
|
- test/rails_app/app/views/layouts/application.html.erb
|