devise_invitable 1.4.2 → 1.5.0
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/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
|