devise_invitable 1.4.2 → 1.5.0
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/README.rdoc +6 -3
- data/lib/devise_invitable/model.rb +22 -5
- data/lib/devise_invitable/version.rb +1 -1
- data/lib/generators/active_record/templates/migration.rb +3 -3
- data/lib/generators/devise_invitable/templates/simple_form_for/invitations/edit.html.erb +1 -1
- data/lib/generators/devise_invitable/templates/simple_form_for/invitations/new.html.erb +1 -1
- data/test/models/invitable_test.rb +22 -3
- data/test/rails_app/config/application.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ebdddd2e1426fdde9ad700f7f60e4cedf3e48ab
|
4
|
+
data.tar.gz: 3a783c0d76c73a4a6af2c07cda15b80904fecdcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b85b1eabee1011a5175f98ca92f05f39a1f49e3da2666f17bafa8a87d22115700d6f7beee89261a5096d70dcfeec473834dc43bfcaa5a967b63fc78b7789bb7f
|
7
|
+
data.tar.gz: 483b574690f8a3064b7d4f941a7fad4e321fe89d677192b82e68d0d0f3feba49d92125054f17e89521c2810e9feb80de12ee135895728d7d1f633bdd845845ea
|
data/README.rdoc
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
= DeviseInvitable
|
2
|
-
{<img src="https://travis-ci.org/scambra/devise_invitable.png"/>}[http://travis-ci.org/scambra/devise_invitable]
|
2
|
+
{<img src="https://travis-ci.org/scambra/devise_invitable.png"/>}[http://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[http://github.com/plataformatec/devise] for sending invitations by email (it requires to be authenticated) and accept the invitation setting the password.
|
5
5
|
|
@@ -256,9 +256,11 @@ You can add :skip_invitation to attributes hash if skip_invitation is added to a
|
|
256
256
|
User.invite!(:email => "new_user@example.com", :name => "John Doe", :skip_invitation => true)
|
257
257
|
# => the record will be created, but the invitation email will not be sent
|
258
258
|
|
259
|
-
Skip_invitation skips sending the email, but sets invitation_token, so invited_to_sign_up
|
259
|
+
Skip_invitation skips sending the email, but sets invitation_token, so <tt>invited_to_sign_up?</tt> on the
|
260
260
|
resulting user returns true.
|
261
261
|
|
262
|
+
To check if a perticular user is created by invitation, irrespective to state of invitation one can use <tt>created_by_invite?</tt>
|
263
|
+
|
262
264
|
**Warning**
|
263
265
|
|
264
266
|
When using skip_invitation you must send the email with the user object instance that generated the tokens, as
|
@@ -297,8 +299,9 @@ The callbacks support all options and arguments available to the standard callba
|
|
297
299
|
|
298
300
|
A pair of scopes to find those users that have accepted, and those that have not accepted, invitations are defined:
|
299
301
|
|
300
|
-
User.invitation_accepted
|
302
|
+
User.invitation_accepted # => returns all Users for whom the invitation_accepted_at attribute is not nil
|
301
303
|
User.invitation_not_accepted # => returns all Users for whom the invitation_accepted_at attribute is nil
|
304
|
+
User.created_by_invite # => returns all Users who are created by invitations, irrespective to invitation status
|
302
305
|
|
303
306
|
== Integration in a Rails application
|
304
307
|
|
@@ -47,9 +47,11 @@ module Devise
|
|
47
47
|
|
48
48
|
scope :no_active_invitation, lambda { where(:invitation_token => nil) }
|
49
49
|
if defined?(Mongoid) && defined?(Mongoid::Document) && self < Mongoid::Document
|
50
|
+
scope :created_by_invite, lambda { where(:invitation_sent_at.ne => nil) }
|
50
51
|
scope :invitation_not_accepted, lambda { where(:invitation_accepted_at => nil, :invitation_token.ne => nil) }
|
51
52
|
scope :invitation_accepted, lambda { where(:invitation_accepted_at.ne => nil) }
|
52
53
|
else
|
54
|
+
scope :created_by_invite, lambda { where(arel_table[:invitation_sent_at].not_eq(nil)) }
|
53
55
|
scope :invitation_not_accepted, lambda { where(arel_table[:invitation_token].not_eq(nil)).where(:invitation_accepted_at => nil) }
|
54
56
|
scope :invitation_accepted, lambda { where(arel_table[:invitation_accepted_at].not_eq(nil)) }
|
55
57
|
|
@@ -85,6 +87,11 @@ module Devise
|
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
90
|
+
# Verify wheather a user is created by invitation, irrespective to invitation status
|
91
|
+
def created_by_invite?
|
92
|
+
invitation_sent_at.present?
|
93
|
+
end
|
94
|
+
|
88
95
|
# Verifies whether a user has been invited or not
|
89
96
|
def invited_to_sign_up?
|
90
97
|
persisted? && invitation_token.present?
|
@@ -102,23 +109,24 @@ module Devise
|
|
102
109
|
|
103
110
|
# Reset invitation token and send invitation again
|
104
111
|
def invite!(invited_by = nil)
|
112
|
+
# This is an order-dependant assignment, this can't be moved
|
105
113
|
was_invited = invited_to_sign_up?
|
106
114
|
|
107
115
|
# Required to workaround confirmable model's confirmation_required? method
|
108
116
|
# being implemented to check for non-nil value of confirmed_at
|
109
|
-
if
|
117
|
+
if new_record_and_responds_to?(:confirmation_required?)
|
110
118
|
def self.confirmation_required?; false; end
|
111
119
|
end
|
112
120
|
|
113
121
|
yield self if block_given?
|
114
|
-
generate_invitation_token if
|
122
|
+
generate_invitation_token if no_token_present_or_skip_invitation?
|
115
123
|
self.invitation_created_at = Time.now.utc
|
116
124
|
self.invitation_sent_at = self.invitation_created_at unless skip_invitation
|
117
125
|
self.invited_by = invited_by if invited_by
|
118
126
|
|
119
127
|
# Call these before_validate methods since we aren't validating on save
|
120
|
-
self.downcase_keys if
|
121
|
-
self.strip_whitespace if
|
128
|
+
self.downcase_keys if new_record_and_responds_to?(:downcase_keys)
|
129
|
+
self.strip_whitespace if new_record_and_responds_to?(:strip_whitespace)
|
122
130
|
|
123
131
|
if save(:validate => false)
|
124
132
|
self.invited_by.decrement_invitation_limit! if !was_invited and self.invited_by.present?
|
@@ -143,7 +151,7 @@ module Devise
|
|
143
151
|
end
|
144
152
|
|
145
153
|
def after_password_reset
|
146
|
-
super
|
154
|
+
super if defined?(super)
|
147
155
|
accept_invitation! if invited_to_sign_up?
|
148
156
|
end
|
149
157
|
|
@@ -219,6 +227,14 @@ module Devise
|
|
219
227
|
generate_invitation_token && save(:validate => false)
|
220
228
|
end
|
221
229
|
|
230
|
+
def new_record_and_responds_to?(method)
|
231
|
+
self.new_record? && self.respond_to?(method, true)
|
232
|
+
end
|
233
|
+
|
234
|
+
def no_token_present_or_skip_invitation?
|
235
|
+
self.invitation_token.nil? || (!skip_invitation || @raw_invitation_token.nil?)
|
236
|
+
end
|
237
|
+
|
222
238
|
module ClassMethods
|
223
239
|
# Return fields to invite
|
224
240
|
def invite_key_fields
|
@@ -308,6 +324,7 @@ module Devise
|
|
308
324
|
Devise::Models.config(self, :invite_key)
|
309
325
|
Devise::Models.config(self, :resend_invitation)
|
310
326
|
Devise::Models.config(self, :allow_insecure_sign_in_after_accept)
|
327
|
+
|
311
328
|
end
|
312
329
|
end
|
313
330
|
end
|
@@ -6,10 +6,10 @@ class DeviseInvitableAddTo<%= table_name.camelize %> < ActiveRecord::Migration
|
|
6
6
|
t.datetime :invitation_sent_at
|
7
7
|
t.datetime :invitation_accepted_at
|
8
8
|
t.integer :invitation_limit
|
9
|
-
t.references :invited_by, :
|
9
|
+
t.references :invited_by, polymorphic: true
|
10
10
|
t.integer :invitations_count, default: 0
|
11
11
|
t.index :invitations_count
|
12
|
-
t.index :invitation_token, :
|
12
|
+
t.index :invitation_token, unique: true # for invitable
|
13
13
|
t.index :invited_by_id
|
14
14
|
end
|
15
15
|
|
@@ -22,7 +22,7 @@ class DeviseInvitableAddTo<%= table_name.camelize %> < ActiveRecord::Migration
|
|
22
22
|
|
23
23
|
def down
|
24
24
|
change_table :<%= table_name %> do |t|
|
25
|
-
t.remove_references :invited_by, :
|
25
|
+
t.remove_references :invited_by, polymorphic: true
|
26
26
|
t.remove :invitations_count, :invitation_limit, :invitation_sent_at, :invitation_accepted_at, :invitation_token, :invitation_created_at
|
27
27
|
end
|
28
28
|
change_column_null :<%= table_name %>, :encrypted_password, false
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<h2><%= t 'devise.invitations.edit.header' %></h2>
|
2
2
|
|
3
|
-
<%= simple_form_for resource, :
|
3
|
+
<%= simple_form_for resource, as: resource_name, url: invitation_path(resource_name), html: { method: :put } do |f| %>
|
4
4
|
<%= devise_error_messages! %>
|
5
5
|
<%= f.hidden_field :invitation_token %>
|
6
6
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<h2><%= t "devise.invitations.new.header" %></h2>
|
2
2
|
|
3
|
-
<%= simple_form_for resource, :
|
3
|
+
<%= simple_form_for resource, as: resource_name, url: invitation_path(resource_name), html: { method: :post} do |f| %>
|
4
4
|
<%= devise_error_messages! %>
|
5
5
|
|
6
6
|
<% resource.class.invite_key_fields.each do |field| -%>
|
@@ -431,6 +431,21 @@ class InvitableTest < ActiveSupport::TestCase
|
|
431
431
|
user.reload
|
432
432
|
assert !user.valid_password?('new_password')
|
433
433
|
end
|
434
|
+
|
435
|
+
test 'should check if created by invitation' do
|
436
|
+
user = User.invite!(:email => "valid@email.com")
|
437
|
+
assert user.created_by_invite?
|
438
|
+
|
439
|
+
invited_user = User.accept_invitation!(
|
440
|
+
:invitation_token => Thread.current[:token],
|
441
|
+
:password => 'new_password',
|
442
|
+
:password_confirmation => 'new_password',
|
443
|
+
:username => 'a'
|
444
|
+
)
|
445
|
+
user.reload
|
446
|
+
assert user.created_by_invite?
|
447
|
+
end
|
448
|
+
|
434
449
|
|
435
450
|
test 'should set other attributes on accepting invitation' do
|
436
451
|
user = new_user(:password => nil, :password_confirmation => nil)
|
@@ -611,19 +626,23 @@ class InvitableTest < ActiveSupport::TestCase
|
|
611
626
|
assert !user.errors.empty?
|
612
627
|
end
|
613
628
|
|
614
|
-
test "should count accepted and not accepted invitations" do
|
629
|
+
test "should count invited, created_by_invite, accepted and not accepted invitations" do
|
615
630
|
assert_equal 0, User.invitation_not_accepted.count
|
616
631
|
assert_equal 0, User.invitation_accepted.count
|
632
|
+
assert_equal 0, User.created_by_invite.count
|
617
633
|
|
618
634
|
User.invite!(:email => "invalid@email.com")
|
635
|
+
User.invite!(:email => "another_invalid@email.com")
|
619
636
|
user = User.invite!(:email => "valid@email.com")
|
620
637
|
|
621
|
-
assert_equal
|
638
|
+
assert_equal 3, User.invitation_not_accepted.count
|
622
639
|
assert_equal 0, User.invitation_accepted.count
|
640
|
+
assert_equal 3, User.created_by_invite.count
|
623
641
|
|
624
642
|
user.accept_invitation!
|
625
|
-
assert_equal
|
643
|
+
assert_equal 2, User.invitation_not_accepted.count
|
626
644
|
assert_equal 1, User.invitation_accepted.count
|
645
|
+
assert_equal 3, User.created_by_invite.count
|
627
646
|
end
|
628
647
|
|
629
648
|
test "should preserve return values of Devise::Recoverable#reset_password!" do
|
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
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergio Cambra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03
|
11
|
+
date: 2015-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|