devise_invitable 2.0.0 → 2.0.8
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -0
- data/README.rdoc +88 -37
- data/app/controllers/devise/invitations_controller.rb +33 -32
- data/app/controllers/devise_invitable/registrations_controller.rb +11 -11
- data/app/views/devise/invitations/edit.html.erb +1 -1
- data/app/views/devise/mailer/invitation_instructions.html.erb +1 -1
- data/app/views/devise/mailer/invitation_instructions.text.erb +1 -1
- data/config/locales/ar.yml +23 -0
- data/config/locales/ca.yml +32 -0
- data/config/locales/da.yml +41 -0
- data/config/locales/de.yml +31 -0
- data/config/locales/es.yml +31 -0
- data/config/locales/et.yml +23 -0
- data/config/locales/fa.yml +31 -0
- data/config/locales/fr.yml +34 -0
- data/config/locales/it.yml +31 -0
- data/config/locales/ja.yml +31 -0
- data/config/locales/ko.yml +24 -0
- data/config/locales/nl.yml +32 -0
- data/config/locales/no.yml +17 -0
- data/config/locales/pl.yml +31 -0
- data/config/locales/pt-BR.yml +23 -0
- data/config/locales/pt.yml +23 -0
- data/config/locales/ru.yml +23 -0
- data/config/locales/tr.yml +24 -0
- data/config/locales/ua.yml +31 -0
- data/config/locales/vi.yml +25 -0
- data/config/locales/zh-HK.yml +31 -0
- data/config/locales/zh-TW.yml +31 -0
- data/lib/devise_invitable/controllers/helpers.rb +7 -4
- data/lib/devise_invitable/inviter.rb +4 -3
- data/lib/devise_invitable/mapping.rb +8 -5
- data/lib/devise_invitable/models/authenticatable.rb +7 -1
- data/lib/devise_invitable/models.rb +16 -13
- data/lib/devise_invitable/parameter_sanitizer.rb +18 -18
- data/lib/devise_invitable/routes.rb +1 -1
- data/lib/devise_invitable/version.rb +1 -1
- data/lib/devise_invitable.rb +2 -1
- data/lib/generators/active_record/templates/migration.rb +0 -1
- data/lib/generators/devise_invitable/devise_invitable_generator.rb +1 -1
- data/lib/generators/devise_invitable/install_generator.rb +4 -3
- data/test/functional/controller_helpers_test.rb +10 -0
- data/test/generators/views_generator_test.rb +7 -6
- data/test/generators_test.rb +3 -2
- data/test/integration/invitation_test.rb +1 -1
- data/test/integration_tests_helper.rb +0 -1
- data/test/mailers/invitation_mail_test.rb +1 -1
- data/test/model_tests_helper.rb +1 -1
- data/test/models/invitable_test.rb +27 -11
- data/test/orm/active_record.rb +6 -1
- data/test/rails_app/app/controllers/admins_controller.rb +4 -3
- data/test/rails_app/app/controllers/application_controller.rb +10 -9
- data/test/rails_app/app/controllers/free_invitations_controller.rb +12 -9
- data/test/rails_app/config/initializers/devise.rb +4 -3
- data/test/rails_app/config/initializers/secret_token.rb +9 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -2
- data/test/test_helper.rb +5 -18
- metadata +32 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1d79a9c9139872616687b6479929d53572f9634188eeb9a83a7fdb56c9a56de0
|
|
4
|
+
data.tar.gz: dd37eafdb0b8a074c11ab51c25b8faea114992cf640e599edb5b9fefec0eb9a3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a275438d6791f2f3e06d3d7a0b83db15142ce0a24337f928e08ee7c9818aa517efaa070c73e2bfc280a28ef8cf1104a9aa6711c8325479c02a794a1b963ec9d5
|
|
7
|
+
data.tar.gz: cef6663d0ce1f61b87dcc73cf151afa55a4054983c8a580d2a94446887f5018a5ba604eea0a656495e2ae3755bc437457c1d109d1ae8faf775182417c4ca313f
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
## 2.0.8
|
|
2
|
+
- Fix for turbo stream
|
|
3
|
+
|
|
4
|
+
## 2.0.7
|
|
5
|
+
- Allow customizing invalid_token_path_for, the path to redirect users who try to accept with invalid token
|
|
6
|
+
- Don't override registrations controller in routes if module option is used
|
|
7
|
+
- Fix typo in spanish translation, add Catalan translation ([#857](https://github.com/scambra/devise_invitable/pull/857))
|
|
8
|
+
- Fix for ruby 3.2.0
|
|
9
|
+
|
|
10
|
+
## 2.0.6
|
|
11
|
+
- Fix submit form failure with turbolinks, fixes ([#865](https://github.com/scambra/devise_invitable/issues/865))
|
|
12
|
+
- Fix obsolete symbols in German translation ([#864](https://github.com/scambra/devise_invitable/pull/864))
|
|
13
|
+
- Allow to provide validate option to the instance method "invite!", default to follow the setting validate_on_invite
|
|
14
|
+
|
|
15
|
+
## 2.0.5
|
|
16
|
+
- Fix NoMethodError in random_password when validatable is not used ([#850](https://github.com/scambra/devise_invitable/pull/850))
|
|
17
|
+
|
|
18
|
+
## 2.0.4
|
|
19
|
+
- Fix devise deprecations ([#842](https://github.com/scambra/devise_invitable/pull/842))
|
|
20
|
+
- Update translations ([#844](https://github.com/scambra/devise_invitable/pull/844), [#845](https://github.com/scambra/devise_invitable/pull/845))
|
|
21
|
+
- Fix/enforce initial password length to follow devise ([#848](https://github.com/scambra/devise_invitable/pull/848))
|
|
22
|
+
|
|
23
|
+
## 2.0.3
|
|
24
|
+
- Add locales ([#834](https://github.com/scambra/devise_invitable/pull/834), [#835](https://github.com/scambra/devise_invitable/pull/835))
|
|
25
|
+
- Remove index on invitations_count column ([#830](https://github.com/scambra/devise_invitable/pull/830))
|
|
26
|
+
|
|
27
|
+
## 2.0.2
|
|
28
|
+
- Fix ruby 2.7 deprecation warning
|
|
29
|
+
|
|
30
|
+
## 2.0.1
|
|
31
|
+
- Use per-model allow_insecure_sign_in_after_accept ([#790](https://github.com/scambra/devise_invitable/pull/790))
|
|
32
|
+
|
|
1
33
|
## 2.0.0
|
|
2
34
|
- Remove deprecated devise_error_messages! from templates ([#786](https://github.com/scambra/devise_invitable/pull/785))
|
|
3
35
|
- Drop Devise < 4.6 support ([#786](https://github.com/scambra/devise_invitable/pull/786))
|
data/README.rdoc
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
= DeviseInvitable
|
|
2
|
-
{<img src="https://badge.fury.io/rb/devise_invitable.svg"/>}[http://badge.fury.io/rb/devise_invitable]
|
|
2
|
+
{<img src="https://badge.fury.io/rb/devise_invitable.svg"/>}[http://badge.fury.io/rb/devise_invitable]
|
|
3
|
+
{<img src="https://github.com/scambra/devise_invitable/actions/workflows/ci.yml/badge.svg"/>}[https://github.com/scambra/devise_invitable/actions/workflows/ci.yml]
|
|
4
|
+
{<img src="https://codeclimate.com/github/scambra/devise_invitable/badges/gpa.svg"/>}[https://codeclimate.com/github/scambra/devise_invitable]
|
|
3
5
|
|
|
4
6
|
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
7
|
|
|
@@ -35,14 +37,14 @@ Replace MODEL by the class name you want to add DeviseInvitable, like <tt>User</
|
|
|
35
37
|
|
|
36
38
|
Follow the walkthrough for Devise and after it's done, follow this walkthrough.
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
==== Devise Configuration
|
|
39
41
|
Add <tt>:invitable</tt> to the <tt>devise</tt> call in your model (we’re assuming here you already have a User model with some Devise modules):
|
|
40
42
|
|
|
41
43
|
class User < ActiveRecord::Base
|
|
42
44
|
devise :database_authenticatable, :confirmable, :invitable
|
|
43
45
|
end
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
==== ActiveRecord Migration
|
|
46
48
|
Add <tt>t.invitable</tt> to your Devise model migration:
|
|
47
49
|
|
|
48
50
|
create_table :users do
|
|
@@ -70,11 +72,6 @@ or for a model that already exists, define a migration to add DeviseInvitable to
|
|
|
70
72
|
add_column :users, :invited_by_id, :integer
|
|
71
73
|
add_column :users, :invited_by_type, :string
|
|
72
74
|
add_index :users, :invitation_token, unique: true
|
|
73
|
-
|
|
74
|
-
# Allow null encrypted_password
|
|
75
|
-
change_column_null :users, :encrypted_password, :string, true
|
|
76
|
-
# Allow null password_salt (add it if you are using Devise's encryptable module)
|
|
77
|
-
change_column_null :users, :password_salt, :string, true
|
|
78
75
|
end
|
|
79
76
|
|
|
80
77
|
If you previously used devise_invitable with a <tt>:limit</tt> on <tt>:invitation_token</tt>, remove it:
|
|
@@ -109,13 +106,13 @@ Remember to create indexes within the MongoDB database after deploying your chan
|
|
|
109
106
|
|
|
110
107
|
DeviseInvitable adds some new configuration options:
|
|
111
108
|
|
|
112
|
-
* <tt>invite_for</tt>: The period the generated invitation token is valid
|
|
109
|
+
* <tt>invite_for</tt>: The period the generated invitation token is valid. After this period, the invited resource won't be able to accept the invitation. When <tt>invite_for</tt> is <tt>0</tt> (the default), the invitation won't expire.
|
|
113
110
|
|
|
114
111
|
You can set this configuration option in the Devise initializer as follow:
|
|
115
112
|
|
|
116
113
|
# ==> Configuration for :invitable
|
|
117
|
-
# The period the generated invitation token is valid
|
|
118
|
-
# this period, the invited resource won't be able to accept the invitation.
|
|
114
|
+
# The period the generated invitation token is valid.
|
|
115
|
+
# After this period, the invited resource won't be able to accept the invitation.
|
|
119
116
|
# When invite_for is 0 (the default), the invitation won't expire.
|
|
120
117
|
# config.invite_for = 2.weeks
|
|
121
118
|
|
|
@@ -186,23 +183,21 @@ To change behaviour of inviting or accepting users, you can simply override two
|
|
|
186
183
|
class Users::InvitationsController < Devise::InvitationsController
|
|
187
184
|
private
|
|
188
185
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
u.skip_invitation = true
|
|
186
|
+
# This is called when creating invitation.
|
|
187
|
+
# It should return an instance of resource class.
|
|
188
|
+
def invite_resource
|
|
189
|
+
# skip sending emails on invite
|
|
190
|
+
super { |user| user.skip_invitation = true }
|
|
195
191
|
end
|
|
196
|
-
end
|
|
197
192
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
193
|
+
# This is called when accepting invitation.
|
|
194
|
+
# It should return an instance of resource class.
|
|
195
|
+
def accept_resource
|
|
196
|
+
resource = resource_class.accept_invitation!(update_resource_params)
|
|
197
|
+
# Report accepting invitation to analytics
|
|
198
|
+
Analytics.report('invite.accept', resource.id)
|
|
199
|
+
resource
|
|
200
|
+
end
|
|
206
201
|
end
|
|
207
202
|
|
|
208
203
|
== Strong Parameters
|
|
@@ -224,6 +219,61 @@ Here is an example of what your application controller might need to include in
|
|
|
224
219
|
devise_parameter_sanitizer.permit(:accept_invitation, keys: [:first_name, :last_name, :phone])
|
|
225
220
|
end
|
|
226
221
|
|
|
222
|
+
Here is an example setting a User's first name, last name, and role for a custom invitation:
|
|
223
|
+
|
|
224
|
+
#Configuring the InvitationsController to accept :first_name, :last_name, and :role
|
|
225
|
+
|
|
226
|
+
class Users::InvitationsController < Devise::InvitationsController
|
|
227
|
+
before_action :configure_permitted_parameters
|
|
228
|
+
|
|
229
|
+
protected
|
|
230
|
+
|
|
231
|
+
# Permit the new params here.
|
|
232
|
+
def configure_permitted_parameters
|
|
233
|
+
devise_parameter_sanitizer.permit(:invite, keys: [:first_name, :last_name, :role])
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
#Define your roles in the User model
|
|
238
|
+
|
|
239
|
+
class User < ApplicationRecord
|
|
240
|
+
has_many :models
|
|
241
|
+
|
|
242
|
+
enum role: {Role 1 Name: 0, Role 2 Name: 1, Role 3 Name: 2, etc...}
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
#In the Invitation view
|
|
246
|
+
|
|
247
|
+
<h2><%= t "devise.invitations.new.header" %></h2>
|
|
248
|
+
|
|
249
|
+
<%= form_for(resource, as: resource_name, url: invitation_path(resource_name), html: { method: :post }) do |f| %>
|
|
250
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
251
|
+
<% resource.class.invite_key_fields.each do |field| -%>
|
|
252
|
+
<div class="field">
|
|
253
|
+
<%= f.label field %><br />
|
|
254
|
+
<%= f.text_field field %>
|
|
255
|
+
</div>
|
|
256
|
+
<% end %>
|
|
257
|
+
|
|
258
|
+
<div class="field">
|
|
259
|
+
<%= f.label :first_name %>
|
|
260
|
+
<%= f.text_field :first_name %>
|
|
261
|
+
</div>
|
|
262
|
+
|
|
263
|
+
<div class="field">
|
|
264
|
+
<%= f.label :last_name %>
|
|
265
|
+
<%= f.text_field :last_name %>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<div class="field">
|
|
269
|
+
<%= f.label :role %>
|
|
270
|
+
<%= f.select :role, options_for_select(User.roles.map { |key, value| [key.humanize, key] }), {prompt: "Select Role"} %>
|
|
271
|
+
</div>
|
|
272
|
+
|
|
273
|
+
<div class="actions">
|
|
274
|
+
<%= f.submit t("devise.invitations.new.submit_button") %>
|
|
275
|
+
</div>
|
|
276
|
+
<% end %>
|
|
227
277
|
|
|
228
278
|
== Usage
|
|
229
279
|
|
|
@@ -241,13 +291,13 @@ If you want to create the invitation but not send it, you can set <tt>skip_invit
|
|
|
241
291
|
end
|
|
242
292
|
# => the record will be created, but the invitation email will not be sent
|
|
243
293
|
|
|
244
|
-
When generating the <tt>accept_user_invitation_url</tt> yourself, you must use the <tt>raw_invitation_token</tt
|
|
245
|
-
|
|
294
|
+
When generating the <tt>accept_user_invitation_url</tt> yourself, you must use the <tt>raw_invitation_token</tt>.
|
|
295
|
+
This value is temporarily available when you invite a user and will be decrypted when received.
|
|
246
296
|
|
|
247
297
|
accept_user_invitation_url(invitation_token: user.raw_invitation_token)
|
|
248
298
|
|
|
249
299
|
When <tt>skip_invitation</tt> is used, you must also then set the <tt>invitation_sent_at</tt> field when the user is sent their token. Failure to do so will yield "Invalid invitation token" error when the user attempts to accept the invite.
|
|
250
|
-
You can set column, or call <tt>deliver_invitation</tt> to
|
|
300
|
+
You can set the column, or call <tt>deliver_invitation</tt> to send the invitation and set the column:
|
|
251
301
|
|
|
252
302
|
user.deliver_invitation
|
|
253
303
|
|
|
@@ -291,7 +341,7 @@ To accept an invitation with a token use the <tt>accept_invitation!</tt> class m
|
|
|
291
341
|
=== Callbacks
|
|
292
342
|
|
|
293
343
|
A callback event is fired before and after an invitation is created (User#invite!) or accepted (User#accept_invitation!). For example, in your resource model you can add:
|
|
294
|
-
|
|
344
|
+
# Note: callbacks should be placed after devise: :invitable is specified.
|
|
295
345
|
before_invitation_created :email_admins
|
|
296
346
|
after_invitation_accepted :email_invited_by
|
|
297
347
|
|
|
@@ -315,16 +365,16 @@ A pair of scopes to find those users that have accepted, and those that have not
|
|
|
315
365
|
|
|
316
366
|
== Integration in a Rails application
|
|
317
367
|
|
|
318
|
-
Since the invitations controller
|
|
368
|
+
Since the invitations controller takes 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.
|
|
319
369
|
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).
|
|
320
370
|
|
|
321
371
|
After an invitation is created and sent, the inviter will be redirected to <tt>after_invite_path_for(inviter, invitee)</tt>, which is the same path as <tt>signed_in_root_path</tt> by default.
|
|
322
372
|
|
|
323
373
|
After an invitation is accepted, the invitee will be redirected to <tt>after_accept_path_for(resource)</tt>, which is the same path as <tt>signed_in_root_path</tt> by default. If you want to override the path, override invitations controller and define <tt>after_accept_path_for</tt> 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.
|
|
324
374
|
|
|
325
|
-
The invitation email includes a link to accept the invitation that looks like this: <tt>/users/invitation/accept?invitation_token=abcd123</tt>. When clicked, the invited must set a password in order to accept its invitation. Note that if the <tt>invitation_token</tt> is not present or not valid, the invited is redirected to <tt>after_sign_out_path_for(resource_name)</tt>.
|
|
375
|
+
The invitation email includes a link to accept the invitation that looks like this: <tt>/users/invitation/accept?invitation_token=abcd123</tt>. When clicked, the invited must set a password in order to accept its invitation. Note that if the <tt>invitation_token</tt> is not present or not valid, the invited is redirected to <tt>invalid_token_path_for(resource_name)</tt>, which by default is <tt>after_sign_out_path_for(resource_name)</tt>.
|
|
326
376
|
|
|
327
|
-
The controller sets the <tt>invited_by_id</tt> attribute for the new user to the current user. This will let you easily keep track of who invited
|
|
377
|
+
The controller sets the <tt>invited_by_id</tt> attribute for the new user to the current user. This will let you easily keep track of who invited whom.
|
|
328
378
|
|
|
329
379
|
== Controller filter
|
|
330
380
|
|
|
@@ -335,10 +385,11 @@ Default behavior requires authentication of the same resource as the invited one
|
|
|
335
385
|
You would have a <tt>User</tt> model which is configured as invitable and an <tt>Admin</tt> model which is not. If you want to allow only admins to send invitations, simply overwrite the <tt>authenticate_inviter!</tt> method as follow:
|
|
336
386
|
|
|
337
387
|
class ApplicationController < ActionController::Base
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
388
|
+
protected
|
|
389
|
+
|
|
390
|
+
def authenticate_inviter!
|
|
391
|
+
authenticate_admin!(force: true)
|
|
392
|
+
end
|
|
342
393
|
end
|
|
343
394
|
|
|
344
395
|
And include <tt>DeviseInvitable::Inviter</tt> module into <tt>Admin</tt> model:
|
|
@@ -31,7 +31,7 @@ class Devise::InvitationsController < DeviseController
|
|
|
31
31
|
respond_with resource, location: after_invite_path_for(current_inviter, resource)
|
|
32
32
|
end
|
|
33
33
|
else
|
|
34
|
-
|
|
34
|
+
respond_with(resource)
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -51,9 +51,10 @@ class Devise::InvitationsController < DeviseController
|
|
|
51
51
|
yield resource if block_given?
|
|
52
52
|
|
|
53
53
|
if invitation_accepted
|
|
54
|
-
if
|
|
54
|
+
if resource.class.allow_insecure_sign_in_after_accept
|
|
55
55
|
flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
|
|
56
56
|
set_flash_message :notice, flash_message if is_flashing_format?
|
|
57
|
+
resource.after_database_authentication
|
|
57
58
|
sign_in(resource_name, resource)
|
|
58
59
|
respond_with resource, location: after_accept_path_for(resource)
|
|
59
60
|
else
|
|
@@ -62,7 +63,7 @@ class Devise::InvitationsController < DeviseController
|
|
|
62
63
|
end
|
|
63
64
|
else
|
|
64
65
|
resource.invitation_token = raw_invitation_token
|
|
65
|
-
|
|
66
|
+
respond_with(resource)
|
|
66
67
|
end
|
|
67
68
|
end
|
|
68
69
|
|
|
@@ -75,42 +76,42 @@ class Devise::InvitationsController < DeviseController
|
|
|
75
76
|
|
|
76
77
|
protected
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
def invite_resource(&block)
|
|
80
|
+
resource_class.invite!(invite_params, current_inviter, &block)
|
|
81
|
+
end
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
def accept_resource
|
|
84
|
+
resource_class.accept_invitation!(update_resource_params)
|
|
85
|
+
end
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
def current_inviter
|
|
88
|
+
authenticate_inviter!
|
|
89
|
+
end
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
def has_invitations_left?
|
|
92
|
+
unless current_inviter.nil? || current_inviter.has_invitations_left?
|
|
93
|
+
self.resource = resource_class.new
|
|
94
|
+
set_flash_message :alert, :no_invitations_remaining if is_flashing_format?
|
|
95
|
+
respond_with_navigational(resource) { render :new }
|
|
96
|
+
end
|
|
95
97
|
end
|
|
96
|
-
end
|
|
97
98
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
def resource_from_invitation_token
|
|
100
|
+
unless params[:invitation_token] && self.resource = resource_class.find_by_invitation_token(params[:invitation_token], true)
|
|
101
|
+
set_flash_message(:alert, :invitation_token_invalid) if is_flashing_format?
|
|
102
|
+
redirect_to invalid_token_path_for(resource_name)
|
|
103
|
+
end
|
|
102
104
|
end
|
|
103
|
-
end
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
def invite_params
|
|
107
|
+
devise_parameter_sanitizer.sanitize(:invite)
|
|
108
|
+
end
|
|
108
109
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
def update_resource_params
|
|
111
|
+
devise_parameter_sanitizer.sanitize(:accept_invitation)
|
|
112
|
+
end
|
|
112
113
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
def translation_scope
|
|
115
|
+
'devise.invitations'
|
|
116
|
+
end
|
|
116
117
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
class DeviseInvitable::RegistrationsController < Devise::RegistrationsController
|
|
2
2
|
protected
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
def build_resource(hash = {})
|
|
5
|
+
if hash[:email]
|
|
6
|
+
self.resource = resource_class.where(email: hash[:email]).first
|
|
7
|
+
if self.resource && self.resource.respond_to?(:invited_to_sign_up?) && self.resource.invited_to_sign_up?
|
|
8
|
+
self.resource.attributes = hash
|
|
9
|
+
self.resource.send_confirmation_instructions if self.resource.confirmation_required_for_invited?
|
|
10
|
+
self.resource.accept_invitation
|
|
11
|
+
else
|
|
12
|
+
self.resource = nil
|
|
13
|
+
end
|
|
13
14
|
end
|
|
15
|
+
self.resource ||= super
|
|
14
16
|
end
|
|
15
|
-
self.resource ||= super
|
|
16
|
-
end
|
|
17
17
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<p><%= t("devise.mailer.invitation_instructions.someone_invited_you", url: root_url) %></p>
|
|
4
4
|
|
|
5
|
-
<p><%= link_to t("devise.mailer.invitation_instructions.accept"), accept_invitation_url(@resource, :
|
|
5
|
+
<p><%= link_to t("devise.mailer.invitation_instructions.accept"), accept_invitation_url(@resource, invitation_token: @token) %></p>
|
|
6
6
|
|
|
7
7
|
<% if @resource.invitation_due_at %>
|
|
8
8
|
<p><%= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format')) %></p>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<%= t("devise.mailer.invitation_instructions.someone_invited_you", url: root_url) %>
|
|
4
4
|
|
|
5
|
-
<%= accept_invitation_url(@resource, :
|
|
5
|
+
<%= accept_invitation_url(@resource, invitation_token: @token) %>
|
|
6
6
|
|
|
7
7
|
<% if @resource.invitation_due_at %>
|
|
8
8
|
<%= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format')) %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
ar:
|
|
2
|
+
devise:
|
|
3
|
+
failure:
|
|
4
|
+
invited: 'لديك دعوة معلّقة، يجب عليك قبولها للإنتهاء من إنشاء حسابك.'
|
|
5
|
+
invitations:
|
|
6
|
+
send_instructions: 'تم إرسال الدعوة إلى البريد الإلكتروني %{email}.'
|
|
7
|
+
invitation_token_invalid: 'كود الدعوة غير صحيح'
|
|
8
|
+
updated: 'تم تحديد كلمة المرور الخاص بك، انت الآن مسجل دخول.'
|
|
9
|
+
no_invitations_remaining: "لم يبق لديك دعوات"
|
|
10
|
+
invitation_removed: 'تم حذف دعوتك.'
|
|
11
|
+
new:
|
|
12
|
+
header: "ارسال الدعوة"
|
|
13
|
+
submit_button: "ارسل الدعوة"
|
|
14
|
+
edit:
|
|
15
|
+
header: "تحديد كلمة المرور"
|
|
16
|
+
submit_button: "حدد كلمة المرور"
|
|
17
|
+
mailer:
|
|
18
|
+
invitation_instructions:
|
|
19
|
+
subject: 'تعليمات الدعوة'
|
|
20
|
+
hello: 'مرحبا %{email}'
|
|
21
|
+
someone_invited_you: 'تم إرسال دعوة لك إلى %{url}, يمكنك الموافقة من خلال الرابط في الأسفل'
|
|
22
|
+
accept: 'قبول الدعوة'
|
|
23
|
+
ignore: "إذا كنت لا تريد قبول الدعوة، الرجاء تجاهل هذا البريد.<br />لن يتم إنشاء حساب خاص بك إلا إذا دخلت على الرابط أعلاه وحددت كلمة مرور خاص بك."
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
|
|
2
|
+
ca:
|
|
3
|
+
devise:
|
|
4
|
+
failure:
|
|
5
|
+
invited: "Tens una invitació pendent, accepta-la per acabar de crear el teu compte."
|
|
6
|
+
invitations:
|
|
7
|
+
send_instructions: "S'ha enviat una invitació a %{email}."
|
|
8
|
+
invitation_token_invalid: "La invitació no es vàlida!"
|
|
9
|
+
updated: "S'ha configurat la seva contrasenya i s'ha ingressat al sistema"
|
|
10
|
+
updated_not_active: "La seva contrasenya s'ha configurat correctament."
|
|
11
|
+
no_invitations_remaining: "No queden invitacions"
|
|
12
|
+
invitation_removed: "S'ha retirat la seva invitació"
|
|
13
|
+
new:
|
|
14
|
+
header: "Enviar Invitació"
|
|
15
|
+
submit_button: "Envia una invitació"
|
|
16
|
+
edit:
|
|
17
|
+
header: "Establir contrasenya"
|
|
18
|
+
submit_button: "Guardar la meva contrasenya"
|
|
19
|
+
mailer:
|
|
20
|
+
invitation_instructions:
|
|
21
|
+
subject: "Instruccions de la invitació"
|
|
22
|
+
hello: "Hola %{email}"
|
|
23
|
+
someone_invited_you: "Has estat invitat a %{url}, pots acceptar-ho seguint el següent enllaç"
|
|
24
|
+
accept: "Aceptar la invitació"
|
|
25
|
+
accept_until: "Aquesta invitació expirarà en %{due_date}."
|
|
26
|
+
ignore: "Si no li interessa aquesta invitació, simplement ignori aquest correu. No es crearà el teu compte fins que accedeixis a l'anterior enllaç i creïs una contrasenya"
|
|
27
|
+
time:
|
|
28
|
+
formats:
|
|
29
|
+
devise:
|
|
30
|
+
mailer:
|
|
31
|
+
invitation_instructions:
|
|
32
|
+
accept_until_format: "%d de %B de %Y, %H:%M"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
da:
|
|
2
|
+
activerecord:
|
|
3
|
+
attributes:
|
|
4
|
+
user:
|
|
5
|
+
invitation_token: Invitationsnøgle
|
|
6
|
+
invitation_created_at: Invitation oprettet
|
|
7
|
+
invitation_sent_at: Invitation sendt
|
|
8
|
+
invitation_accepted_at: Invitation accepteret
|
|
9
|
+
invitation_limit: Invitationsbegrænsning
|
|
10
|
+
invited_by: Inviteret af
|
|
11
|
+
invitations_count: Antal invitationer
|
|
12
|
+
devise:
|
|
13
|
+
failure:
|
|
14
|
+
invited: "Du har allerede en ventende invitation, som du bedes acceptere for at oprette en konto."
|
|
15
|
+
invitations:
|
|
16
|
+
send_instructions: "Der er sendt en invitationsmail til %{email}."
|
|
17
|
+
invitation_token_invalid: "Den angivne invitationsnøgle er ikke gyldig."
|
|
18
|
+
updated: "Din adgangskode er gemt, og du er nu logget ind."
|
|
19
|
+
updated_not_active: "Din adgangskode er gemt, og du kan nu logge ind på din konto."
|
|
20
|
+
no_invitations_remaining: "Ikke flere invitationer tilbage"
|
|
21
|
+
invitation_removed: "Din invitation er blevet fjernet."
|
|
22
|
+
new:
|
|
23
|
+
header: "Send en invitation"
|
|
24
|
+
submit_button: "Send mail"
|
|
25
|
+
edit:
|
|
26
|
+
header: "Vælg din adgangskode"
|
|
27
|
+
submit_button: "Gem adgangskode"
|
|
28
|
+
mailer:
|
|
29
|
+
invitation_instructions:
|
|
30
|
+
subject: "Invitation til at oprette en konto"
|
|
31
|
+
hello: "Hej %{email}"
|
|
32
|
+
someone_invited_you: "Du er blevet inviteret til at oprette en konto på %{url}, og du kan gøre det via linket herunder."
|
|
33
|
+
accept: "Accepter invitation"
|
|
34
|
+
accept_until: "Invitation gælder indtil %{due_date}."
|
|
35
|
+
ignore: "Hvis du ikke vil tage imod invitationen om at oprette en konto, kan du blot ignorere denne mail.<br />\nDer vil ikke blive oprettet nogen konto, medmindre du følger linket herover og derefter opretter en adgangskode."
|
|
36
|
+
time:
|
|
37
|
+
formats:
|
|
38
|
+
devise:
|
|
39
|
+
mailer:
|
|
40
|
+
invitation_instructions:
|
|
41
|
+
accept_until_format: "%e. %B %Y kl. %H.%M"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
de:
|
|
2
|
+
devise:
|
|
3
|
+
failure:
|
|
4
|
+
invited: "Du hast bereits eine Einladung erhalten. Nimm die Einladung an um dein Nutzerkonto zu erstellen."
|
|
5
|
+
invitations:
|
|
6
|
+
send_instructions: "Eine Einladung wurde an %{email} verschickt."
|
|
7
|
+
invitation_token_invalid: "Der Einladungs-Code ist ungültig!"
|
|
8
|
+
updated: "Dein Passwort wurde gesetzt. Du bist nun angemeldet."
|
|
9
|
+
updated_not_active: "Dein Passwort wurde gesetzt."
|
|
10
|
+
no_invitations_remaining: "Es gibt keine weiteren Einladungen"
|
|
11
|
+
invitation_removed: "Deine Einladung wurde gelöscht."
|
|
12
|
+
new:
|
|
13
|
+
header: "Einladung schicken"
|
|
14
|
+
submit_button: "Einladung schicken"
|
|
15
|
+
edit:
|
|
16
|
+
header: "Setze ein Passwort"
|
|
17
|
+
submit_button: "Passwort setzen"
|
|
18
|
+
mailer:
|
|
19
|
+
invitation_instructions:
|
|
20
|
+
subject: "Einladung"
|
|
21
|
+
hello: "Hallo %{email}"
|
|
22
|
+
someone_invited_you: "Jemand hat dich zu %{url} eingeladen. Du kannst die Einladung mit dem Link unten annehmen."
|
|
23
|
+
accept: "Einladung annehmen"
|
|
24
|
+
accept_until: "Diese Einladung ist gültig bis zum %{due_date}."
|
|
25
|
+
ignore: "Wenn du die Einladung nicht annehmen willst, ignoriere diese E-Mail einfach. Es wird kein Benutzerkonto erstellt solange du nicht die Einladung mittels des Links oben annimmst."
|
|
26
|
+
time:
|
|
27
|
+
formats:
|
|
28
|
+
devise:
|
|
29
|
+
mailer:
|
|
30
|
+
invitation_instructions:
|
|
31
|
+
accept_until_format: "%d. %B %Y %H:%M"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
es:
|
|
2
|
+
devise:
|
|
3
|
+
failure:
|
|
4
|
+
invited: "Tienes una invitación pendiente, acéptala para acabar de crear tu cuenta."
|
|
5
|
+
invitations:
|
|
6
|
+
send_instructions: "Se ha enviado una invitación a %{email}."
|
|
7
|
+
invitation_token_invalid: "¡La invitación no es válida!"
|
|
8
|
+
updated: "Se ha configurado su contraseña y ha ingresado al sistema"
|
|
9
|
+
updated_not_active: "Su contraseña se ha configurado correctamente."
|
|
10
|
+
no_invitations_remaining: "No quedan invitaciones"
|
|
11
|
+
invitation_removed: "Se ha retirado su invitación"
|
|
12
|
+
new:
|
|
13
|
+
header: "Enviar Invitación"
|
|
14
|
+
submit_button: "Envía una invitación"
|
|
15
|
+
edit:
|
|
16
|
+
header: "Establecer contraseña"
|
|
17
|
+
submit_button: "Guardar mi contraseña"
|
|
18
|
+
mailer:
|
|
19
|
+
invitation_instructions:
|
|
20
|
+
subject: "Instrucciones de la invitación"
|
|
21
|
+
hello: "Hola %{email}"
|
|
22
|
+
someone_invited_you: "Has sido invitado a %{url}, puedes aceptarlo siguiendo el siguiente enlace"
|
|
23
|
+
accept: "Aceptar la invitación"
|
|
24
|
+
accept_until: "Esta invitación expirará en %{due_date}."
|
|
25
|
+
ignore: "Si no le interesa esta invitación, simplemente ignore este correo. No se creará tu cuenta hasta que accedas al enlace anterior y crees una contraseña."
|
|
26
|
+
time:
|
|
27
|
+
formats:
|
|
28
|
+
devise:
|
|
29
|
+
mailer:
|
|
30
|
+
invitation_instructions:
|
|
31
|
+
accept_until_format: "%d de %B de %Y, %H:%M"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
et:
|
|
2
|
+
devise:
|
|
3
|
+
failure:
|
|
4
|
+
invited: 'Sul on kutse ootel - aktsepteeri, et konto loomine lõpule viia.'
|
|
5
|
+
invitations:
|
|
6
|
+
send_instructions: 'Kutse on saadetud emailile %{email}.'
|
|
7
|
+
invitation_token_invalid: 'Antud kutse ei ole kehtiv!'
|
|
8
|
+
updated: 'Sinu salasõna on edukalt sätitud. Oled nüüd sisse logitud.'
|
|
9
|
+
no_invitations_remaining: "Kutseid pole rohkem järgi."
|
|
10
|
+
invitation_removed: 'Sinu kutse eemaldati.'
|
|
11
|
+
new:
|
|
12
|
+
header: "Kutse saatmine"
|
|
13
|
+
submit_button: "Saada kutse"
|
|
14
|
+
edit:
|
|
15
|
+
header: "Salasõna sättimine"
|
|
16
|
+
submit_button: "Säti mu salasõna"
|
|
17
|
+
mailer:
|
|
18
|
+
invitation_instructions:
|
|
19
|
+
subject: 'Kutse juhised'
|
|
20
|
+
hello: 'Tere, %{email}'
|
|
21
|
+
someone_invited_you: 'Keegi kutsus Sind aadressile %{url}. Kutse saad vastu võtta allolevalt lingilt.'
|
|
22
|
+
accept: 'Võta kutse vastu'
|
|
23
|
+
ignore: "Kui Sa ei soovi kutset vastu võtta, siis lihtsalt ignoreeri seda emaili.<br />Sinu kontot ei looda enne, kui oled ülalolevat linki külastanud ja oma salasõna määranud."
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
fa:
|
|
2
|
+
devise:
|
|
3
|
+
failure:
|
|
4
|
+
invited: "شما یک دعوت نامه در حال انتظار دارید، با قبول آن حساب خود را بسازید."
|
|
5
|
+
invitations:
|
|
6
|
+
send_instructions: "یک ایمیل دعوت نامه به %{email} ارسال شد."
|
|
7
|
+
invitation_token_invalid: "کد دعوت نامه معتبر نیست!"
|
|
8
|
+
updated: "رمز عبور شما ذخیره شد. شما وارد سایت شدید!"
|
|
9
|
+
updated_not_active: "رمز عبور شما ذخیره شد."
|
|
10
|
+
no_invitations_remaining: "دعوت نامه ای نمانده"
|
|
11
|
+
invitation_removed: "دعوت نامه شما حذف شده."
|
|
12
|
+
new:
|
|
13
|
+
header: "فرستادن دعوت نامه"
|
|
14
|
+
submit_button: "فرستادن دعوت نامه"
|
|
15
|
+
edit:
|
|
16
|
+
header: "رمز عبور انتخاب کنید"
|
|
17
|
+
submit_button: "رمز عبور ذخیره کن"
|
|
18
|
+
mailer:
|
|
19
|
+
invitation_instructions:
|
|
20
|
+
subject: "شما دعوت شدید!"
|
|
21
|
+
hello: "سلام %{email}"
|
|
22
|
+
someone_invited_you: "شما به %{url} دعوت شدید. لینک زیر را استفاده کنید تا حساب شما فعال شود."
|
|
23
|
+
accept: "قبول دعوت"
|
|
24
|
+
accept_until: "این دعوت نامه تا تاریخ %{due_date} اعتبار دارد."
|
|
25
|
+
ignore: "اگر نمی خواهید این دعوت را قبول کنید, لطفا این ایمیل را نادیده بگیرید.<br />تا وقتی که بر روی لینک بالا کلیک نکنید، حساب شما ساخته نخواهد شد."
|
|
26
|
+
time:
|
|
27
|
+
formats:
|
|
28
|
+
devise:
|
|
29
|
+
mailer:
|
|
30
|
+
invitation_instructions:
|
|
31
|
+
accept_until_format: "%B %d, %Y %I:%M %p"
|