devise_invitable 1.6.0 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of devise_invitable might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG +6 -0
- data/README.rdoc +10 -3
- data/app/controllers/devise/invitations_controller.rb +5 -2
- data/lib/devise_invitable/controllers/helpers.rb +2 -2
- data/lib/devise_invitable/model.rb +12 -10
- data/lib/devise_invitable/version.rb +1 -1
- data/test/functional/controller_helpers_test.rb +11 -6
- data/test/models/invitable_test.rb +18 -11
- data/test/rails_app/config/environments/test.rb +4 -0
- data/test/rails_app/config/initializers/devise.rb +1 -1
- data/test/test_helper.rb +11 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: babfb02e4177cd88fe44772401f61014f8b462ea
|
4
|
+
data.tar.gz: 1302cfd7ca394b79ed9f250fe49e9753c4ea0ac8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec68260bfce3d59a7365e60e14d756815b85f8c65260cc5df7f74cdd5cc0cf443176a4ec8468e91c667150d88e7676bf5acbea6a5c7b30211e2dc76d5d6d9d56
|
7
|
+
data.tar.gz: d4213cdfc200c4ba8fd5fee2eb0251cf2b892b6663caa0a9a7e307d62f2819307fcb00f43193d92815e8196277208994471f2a329c95931766cb13e5ef6f2cdb
|
data/CHANGELOG
CHANGED
data/README.rdoc
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
= DeviseInvitable
|
2
|
-
{<img src="https://badge.fury.io/rb/devise_invitable.svg"/>}[http://badge.fury.io/rb/devise_invitable] {<img src="https://travis-ci.org/scambra/devise_invitable.png"/>}[https://travis-ci.org/scambra/devise_invitable] {<img src="https://codeclimate.com/github/scambra/devise_invitable/badges/gpa.svg"/}[https://codeclimate.com/github/scambra/devise_invitable]
|
2
|
+
{<img src="https://badge.fury.io/rb/devise_invitable.svg"/>}[http://badge.fury.io/rb/devise_invitable] {<img src="https://travis-ci.org/scambra/devise_invitable.png"/>}[https://travis-ci.org/scambra/devise_invitable] {<img src="https://codeclimate.com/github/scambra/devise_invitable/badges/gpa.svg"/}[https://codeclimate.com/github/scambra/devise_invitable]
|
3
3
|
|
4
4
|
It adds support to devise[https://github.com/plataformatec/devise] for sending invitations by email (it requires to be authenticated) and accept the invitation setting the password.
|
5
5
|
|
@@ -18,7 +18,7 @@ Install DeviseInvitable gem, it will also install dependencies (such as devise a
|
|
18
18
|
Add DeviseInvitable to your Gemfile (and Devise if you weren't using them):
|
19
19
|
|
20
20
|
gem 'devise', '~> 3.5.2'
|
21
|
-
gem 'devise_invitable', '~> 1.
|
21
|
+
gem 'devise_invitable', '~> 1.6.0'
|
22
22
|
|
23
23
|
=== Automatic installation
|
24
24
|
|
@@ -283,6 +283,11 @@ You can also set <tt>invited_by</tt> when using the <tt>invite!</tt> class metho
|
|
283
283
|
|
284
284
|
User.invite!({:email => "new_user@example.com"}, current_user) # current_user will be set as invited_by
|
285
285
|
|
286
|
+
=== Find by invitation token
|
287
|
+
|
288
|
+
To find by invitation token use the <tt>find_by_invitation_token</tt> class method.
|
289
|
+
|
290
|
+
user = User.find_by_invitation_token(params[:invitation_token], true)
|
286
291
|
|
287
292
|
|
288
293
|
=== Accept an invitation
|
@@ -321,7 +326,7 @@ A pair of scopes to find those users that have accepted, and those that have not
|
|
321
326
|
Since the invitations controller take care of all the creation/acceptation of an invitation, in most cases you wouldn't call the <tt>invite!</tt> and <tt>accept_invitation!</tt> methods directly.
|
322
327
|
Instead, in your views, put a link to <tt>new_user_invitation_path</tt> or <tt>new_invitation_path(:user)</tt> or even <tt>/users/invitation/new</tt> to prepare and send an invitation (to a user in this example).
|
323
328
|
|
324
|
-
After an invitation is created and sent, the inviter will be redirected to after_invite_path_for(
|
329
|
+
After an invitation is created and sent, the inviter will be redirected to after_invite_path_for(inviter, invitee), which is stored path or the same path as after_sign_in_path_for by default.
|
325
330
|
|
326
331
|
After an invitation is accepted, the invitee will be redirected to after_accept_path_for(resource), which is the same path as after_sign_in_path_for by default. If you want to override the path, override invitations controller and define after_accept_path_for method. This is useful in the common case that a user is invited to a specific location in your application. More on {Devise's README}[https://github.com/plataformatec/devise], "Controller filters and helpers" section.
|
327
332
|
|
@@ -397,6 +402,8 @@ The DeviseInvitable mailer uses the same pattern as Devise to create mail subjec
|
|
397
402
|
|
398
403
|
Take a look at the generated locale file (in <tt>config/locales/devise_invitable.en.yml</tt>) to check all available messages.
|
399
404
|
|
405
|
+
Translations are not included in gem (and they won't), they are available at wiki[https://github.com/scambra/devise_invitable/wiki/I18n].
|
406
|
+
|
400
407
|
== Other ORMs
|
401
408
|
|
402
409
|
DeviseInvitable supports ActiveRecord and Mongoid, like Devise.
|
@@ -32,7 +32,11 @@ class Devise::InvitationsController < DeviseController
|
|
32
32
|
if is_flashing_format? && self.resource.invitation_sent_at
|
33
33
|
set_flash_message :notice, :send_instructions, :email => self.resource.email
|
34
34
|
end
|
35
|
-
|
35
|
+
if self.method(:after_invite_path_for).arity == 1
|
36
|
+
respond_with resource, :location => after_invite_path_for(current_inviter)
|
37
|
+
else
|
38
|
+
respond_with resource, :location => after_invite_path_for(current_inviter, resource)
|
39
|
+
end
|
36
40
|
else
|
37
41
|
respond_with_navigational(resource) { render :new }
|
38
42
|
end
|
@@ -117,4 +121,3 @@ class Devise::InvitationsController < DeviseController
|
|
117
121
|
'devise.invitations'
|
118
122
|
end
|
119
123
|
end
|
120
|
-
|
@@ -4,8 +4,8 @@ module DeviseInvitable::Controllers::Helpers
|
|
4
4
|
included do
|
5
5
|
end
|
6
6
|
|
7
|
-
def after_invite_path_for(
|
8
|
-
after_sign_in_path_for(
|
7
|
+
def after_invite_path_for(inviter, invitee = nil)
|
8
|
+
after_sign_in_path_for(inviter)
|
9
9
|
end
|
10
10
|
|
11
11
|
def after_accept_path_for(resource)
|
@@ -41,12 +41,14 @@ module Devise
|
|
41
41
|
counter_cache = Devise.invited_by_counter_cache
|
42
42
|
belongs_to_options.merge! :counter_cache => counter_cache if counter_cache
|
43
43
|
belongs_to_options.merge! :optional => true if ActiveRecord::VERSION::MAJOR >= 5
|
44
|
+
elsif defined?(Mongoid) && defined?(Mongoid::Document) && self < Mongoid::Document && Mongoid::VERSION >= '6.0.0'
|
45
|
+
belongs_to_options.merge! :optional => true
|
44
46
|
end
|
45
47
|
belongs_to :invited_by, belongs_to_options
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
extend ActiveModel::Callbacks
|
50
|
+
define_model_callbacks :invitation_created
|
51
|
+
define_model_callbacks :invitation_accepted
|
50
52
|
|
51
53
|
scope :no_active_invitation, lambda { where(:invitation_token => nil) }
|
52
54
|
if defined?(Mongoid) && defined?(Mongoid::Document) && self < Mongoid::Document
|
@@ -88,12 +90,12 @@ module Devise
|
|
88
90
|
# Accept an invitation by clearing invitation token and and setting invitation_accepted_at
|
89
91
|
# Saves the model and confirms it if model is confirmable, running invitation_accepted callbacks
|
90
92
|
def accept_invitation!
|
91
|
-
|
92
|
-
|
93
|
+
if self.invited_to_sign_up?
|
94
|
+
@accepting_invitation = true
|
93
95
|
run_callbacks :invitation_accepted do
|
94
96
|
self.accept_invitation
|
95
97
|
self.confirmed_at = self.invitation_accepted_at if self.respond_to?(:confirmed_at)
|
96
|
-
self.save
|
98
|
+
self.save
|
97
99
|
end
|
98
100
|
end
|
99
101
|
end
|
@@ -105,7 +107,7 @@ module Devise
|
|
105
107
|
|
106
108
|
# Verifies whether a user has been invited or not
|
107
109
|
def invited_to_sign_up?
|
108
|
-
persisted? && invitation_token.present?
|
110
|
+
accepting_invitation? || (persisted? && invitation_token.present?)
|
109
111
|
end
|
110
112
|
|
111
113
|
# Returns true if accept_invitation! was called
|
@@ -113,12 +115,12 @@ module Devise
|
|
113
115
|
@accepting_invitation
|
114
116
|
end
|
115
117
|
|
116
|
-
# Verifies whether a user accepted an invitation (
|
118
|
+
# Verifies whether a user accepted an invitation (false when user is accepting it)
|
117
119
|
def invitation_accepted?
|
118
|
-
invitation_accepted_at.present?
|
120
|
+
!accepting_invitation? && invitation_accepted_at.present?
|
119
121
|
end
|
120
122
|
|
121
|
-
# Verifies whether a user has accepted an invitation (
|
123
|
+
# Verifies whether a user has accepted an invitation (false when user is accepting it), or was never invited
|
122
124
|
def accepted_or_not_invited?
|
123
125
|
invitation_accepted? || !invited_to_sign_up?
|
124
126
|
end
|
@@ -6,32 +6,37 @@ class ControllerHelpersTest < ActionController::TestCase
|
|
6
6
|
test "after invite path defaults to after sign in path" do
|
7
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
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
|
15
15
|
custom_path = 'customized/after/invite/path'
|
16
16
|
@controller.instance_eval "def after_invite_path_for(resource) '#{custom_path}' end"
|
17
17
|
assert_equal @controller.after_invite_path_for(:user), custom_path
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
|
+
test 'after invite path is customizable from application controller with invited' do
|
21
|
+
custom_path = 'customized/after/invite/path'
|
22
|
+
@controller.instance_eval "def after_invite_path_for(resource, invited) '#{custom_path}' end"
|
23
|
+
assert_equal @controller.after_invite_path_for(:user, :invited), custom_path
|
24
|
+
end
|
20
25
|
test 'after accept path is customizable from application controller' do
|
21
26
|
custom_path = 'customized/after/accept/path'
|
22
27
|
@controller.instance_eval "def after_accept_path_for(resource) '#{custom_path}' end"
|
23
28
|
assert_equal @controller.after_accept_path_for(:user), custom_path
|
24
29
|
end
|
25
|
-
|
30
|
+
|
26
31
|
test 'is not a devise controller' do
|
27
32
|
assert !@controller.devise_controller?
|
28
33
|
end
|
29
|
-
|
34
|
+
|
30
35
|
test 'invitations controller respects definition for after invite path in application controller' do
|
31
36
|
assert Devise::InvitationsController.method_defined? :after_invite_path_for
|
32
37
|
assert !Devise::InvitationsController.instance_methods(false).include?(:after_invite_path_for)
|
33
38
|
end
|
34
|
-
|
39
|
+
|
35
40
|
test 'invitations controller respects definition for after accept path in application controller' do
|
36
41
|
assert Devise::InvitationsController.method_defined? :after_accept_path_for
|
37
42
|
assert !Devise::InvitationsController.instance_methods(false).include?(:after_accept_path_for)
|
@@ -193,16 +193,16 @@ class InvitableTest < ActiveSupport::TestCase
|
|
193
193
|
end
|
194
194
|
|
195
195
|
test 'should not accept invite without password' do
|
196
|
-
|
197
|
-
|
198
|
-
refute_predicate
|
196
|
+
User.invite!(:email => "valid@email.com")
|
197
|
+
User.accept_invitation!(:invitation_token => Thread.current[:token])
|
198
|
+
refute_predicate User.where(:email => 'valid@email.com').first, :invitation_accepted?
|
199
199
|
end
|
200
200
|
|
201
201
|
test 'should accept invite without password if enforce is disabled' do
|
202
202
|
Devise.stubs(:require_password_on_accepting => false)
|
203
|
-
|
204
|
-
|
205
|
-
assert_predicate
|
203
|
+
User.invite!(:email => "valid@email.com")
|
204
|
+
User.accept_invitation!(:invitation_token => Thread.current[:token])
|
205
|
+
assert_predicate User.where(:email => 'valid@email.com').first, :invitation_accepted?
|
206
206
|
end
|
207
207
|
|
208
208
|
test 'should set password and password confirmation from params' do
|
@@ -607,12 +607,14 @@ class InvitableTest < ActiveSupport::TestCase
|
|
607
607
|
user.accept_invitation!
|
608
608
|
|
609
609
|
assert user.confirmed?
|
610
|
+
refute user.changed?
|
610
611
|
end
|
611
612
|
|
612
613
|
test 'user.accept_invitation! should not confirm user if validation fails' do
|
613
614
|
user = User.invite!(:email => "valid@email.com")
|
614
615
|
user.username='a'*50
|
615
616
|
user.accept_invitation!
|
617
|
+
user.reload
|
616
618
|
|
617
619
|
refute_predicate user, :confirmed?
|
618
620
|
end
|
@@ -652,23 +654,28 @@ class InvitableTest < ActiveSupport::TestCase
|
|
652
654
|
test 'should pass validation before accept if field is required in post-invited instance' do
|
653
655
|
user = User.invite!(:email => "valid@email.com")
|
654
656
|
user.testing_accepted_or_not_invited = true
|
655
|
-
|
657
|
+
user.valid?
|
658
|
+
assert_empty user.errors
|
656
659
|
end
|
657
660
|
|
658
661
|
test 'should fail validation after accept if field is required in post-invited instance' do
|
659
662
|
user = User.invite!(:email => "valid@email.com")
|
660
663
|
user.testing_accepted_or_not_invited = true
|
661
|
-
user
|
662
|
-
|
664
|
+
assert_predicate user, :accept_invitation!
|
665
|
+
user = User.where(:email => "valid@email.com").first
|
666
|
+
user.valid?
|
667
|
+
refute_empty user.errors
|
663
668
|
end
|
664
669
|
|
665
670
|
test 'should pass validation after accept if field is required in post-invited instance' do
|
666
671
|
user = User.invite!(:email => "valid@email.com")
|
667
672
|
user.username = 'test'
|
668
673
|
user.testing_accepted_or_not_invited = true
|
674
|
+
assert_predicate user, :accept_invitation!
|
675
|
+
user = User.where(:email => "valid@email.com").first
|
669
676
|
user.bio = "Test"
|
670
|
-
user.
|
671
|
-
|
677
|
+
user.valid?
|
678
|
+
assert_empty user.errors
|
672
679
|
end
|
673
680
|
|
674
681
|
test 'should return instance with errors if invitation_token is nil' do
|
@@ -28,6 +28,10 @@ RailsApp::Application.configure do
|
|
28
28
|
# like if you have constraints or database-specific column types
|
29
29
|
# config.active_record.schema_format = :sql
|
30
30
|
|
31
|
+
if Rails.version >= '4.2' && config.respond_to?(:active_record)
|
32
|
+
config.active_record.raise_in_transactional_callbacks = true
|
33
|
+
end
|
34
|
+
|
31
35
|
# Print deprecation notices to the stderr
|
32
36
|
config.active_support.deprecation = :stderr
|
33
37
|
|
@@ -172,7 +172,7 @@ Devise.setup do |config|
|
|
172
172
|
# Email regex used to validate email formats. It simply asserts that
|
173
173
|
# an one (and only one) @ exists in the given string. This is mainly
|
174
174
|
# to give user feedback and not to assert the e-mail validity.
|
175
|
-
|
175
|
+
config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
|
176
176
|
|
177
177
|
# ==> Configuration for :timeoutable
|
178
178
|
# The time you want to timeout the user session without activity. After this
|
data/test/test_helper.rb
CHANGED
@@ -20,5 +20,15 @@ class ActionDispatch::IntegrationTest
|
|
20
20
|
include Capybara::DSL
|
21
21
|
end
|
22
22
|
class ActionController::TestCase
|
23
|
-
|
23
|
+
if defined? Devise::Test
|
24
|
+
include Devise::Test::ControllerHelpers
|
25
|
+
else
|
26
|
+
include Devise::TestHelpers
|
27
|
+
end
|
28
|
+
if Rails.version >= '5.0.0'
|
29
|
+
self.use_transactional_tests = true
|
30
|
+
else
|
31
|
+
require 'test_after_commit' rescue nil
|
32
|
+
self.use_transactional_fixtures = true
|
33
|
+
end
|
24
34
|
end
|
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.6.
|
4
|
+
version: 1.6.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: 2016-04
|
11
|
+
date: 2016-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -163,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
163
|
version: 1.3.6
|
164
164
|
requirements: []
|
165
165
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.
|
166
|
+
rubygems_version: 2.5.1
|
167
167
|
signing_key:
|
168
168
|
specification_version: 4
|
169
169
|
summary: An invitation strategy for Devise
|