devise-approvable 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/app/controllers/approvals_controller.rb +14 -0
- data/app/views/devise/approvals/new.html.erb +16 -0
- data/devise-approvable.gemspec +10 -4
- data/lib/devise_approvable.rb +21 -0
- data/lib/devise_approvable/mailer.rb +11 -0
- data/lib/devise_approvable/model.rb +95 -0
- data/lib/devise_approvable/routes.rb +9 -0
- data/lib/devise_approvable/version.rb +3 -0
- metadata +9 -3
- data/lib/approvable.rb +0 -176
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bf6254958c077f9db90bb7ec5dc6d6ef447ca7e
|
4
|
+
data.tar.gz: 531778b042291c73449f14ec291da0c11113b943
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30c89efcedb4d1787decb362dfeb58b154dd618518e885c90fb0900ca4681dc9a766750e95e265c5bceeaebc1de82477217310a1afb86c9102eb60a8b5f9bbda
|
7
|
+
data.tar.gz: 064b9c741ad42d97192e334d89afc7206799cee2f20a064d67d2a6c8db139d9e4057c7ef484f794a8657793be900b4c09743ae70966938f054f2ed62e0040c1e
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Devise::ApprovalsController < DeviseController
|
2
|
+
# GET /resource/confirmation?confirmation_token=abcdef
|
3
|
+
def show
|
4
|
+
self.resource = resource_class.approve_by_token(params[:approval_token])
|
5
|
+
yield resource if block_given?
|
6
|
+
|
7
|
+
if resource.errors.empty?
|
8
|
+
set_flash_message(:notice, :approved) if is_flashing_format?
|
9
|
+
respond_with_navigational(resource){ redirect_to after_approval_path_for(resource_name, resource) }
|
10
|
+
else
|
11
|
+
respond_with_navigational(resource.errors, status: :unprocessable_entity){ render :new }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<h2>Dev Account Approval</h2>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name, url: approval_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
+
<%= devise_error_messages! %>
|
5
|
+
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true, value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="actions">
|
12
|
+
<%= f.submit "Resend confirmation instructions" %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= render "devise/shared/links" %>
|
data/devise-approvable.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: devise-approvable 0.
|
5
|
+
# stub: devise-approvable 0.3.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "devise-approvable"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.3.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Alex Egg"]
|
14
|
-
s.date = "2015-04-
|
14
|
+
s.date = "2015-04-06"
|
15
15
|
s.description = "adds feature to devise"
|
16
16
|
s.email = "eggie5@gmail.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -23,10 +23,16 @@ Gem::Specification.new do |s|
|
|
23
23
|
"README",
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
|
+
"app/controllers/approvals_controller.rb",
|
27
|
+
"app/views/devise/approvals/new.html.erb",
|
26
28
|
"config/initializers/devise.rb",
|
27
29
|
"devise-approvable.gemspec",
|
28
|
-
"lib/approvable.rb",
|
29
30
|
"lib/approvable_mailer.rb",
|
31
|
+
"lib/devise_approvable.rb",
|
32
|
+
"lib/devise_approvable/mailer.rb",
|
33
|
+
"lib/devise_approvable/model.rb",
|
34
|
+
"lib/devise_approvable/routes.rb",
|
35
|
+
"lib/devise_approvable/version.rb",
|
30
36
|
"test/approvable_test.rb",
|
31
37
|
"views/devise_mailer/approval_instructions.html.erb"
|
32
38
|
]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module DeviseApprovable
|
2
|
+
autoload :Mailer, 'devise_approvable/mailer'
|
3
|
+
end
|
4
|
+
|
5
|
+
require 'devise'
|
6
|
+
require 'devise_approvable/routes'
|
7
|
+
# require 'devise_approvable/rails'
|
8
|
+
|
9
|
+
module Devise
|
10
|
+
# Public: Validity period of the invitation token (default: 0). If
|
11
|
+
# invite_for is 0 or nil, the invitation will never expire.
|
12
|
+
# Set invite_for in the Devise configuration file (in config/initializers/devise.rb).
|
13
|
+
#
|
14
|
+
# config.invite_for = 2.weeks # => The invitation token will be valid 2 weeks
|
15
|
+
mattr_accessor :admin_email
|
16
|
+
@@admin_email = "admin@curbcall.com"
|
17
|
+
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
Devise.add_module :approvable, :controller => :approvals, :model => 'devise_approvable/model', :route => {:approval => [nil, :new, :accept, :show]}
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Devise
|
2
|
+
module Models
|
3
|
+
module Approvable
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
puts "Devise::Models::Approvable module injected into #{self.class} class"
|
7
|
+
|
8
|
+
base.class_eval do
|
9
|
+
extend ClassMethods
|
10
|
+
|
11
|
+
before_create :generate_approval_token, :if => :approval_required?
|
12
|
+
after_create :send_approval_instructions, :unless => :approved?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
#override
|
17
|
+
def active_for_authentication?
|
18
|
+
super && approved?
|
19
|
+
end
|
20
|
+
|
21
|
+
#override
|
22
|
+
def inactive_message
|
23
|
+
if !approved?
|
24
|
+
:not_approved
|
25
|
+
else
|
26
|
+
super # Use whatever other message
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def approve!
|
32
|
+
self.approved_at = Time.now.utc
|
33
|
+
self.approval_token = nil
|
34
|
+
save(:validate => false)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Verifies whether a user is confirmed or not
|
38
|
+
def approved?
|
39
|
+
!!self.approved_at
|
40
|
+
end
|
41
|
+
|
42
|
+
def skip_approval!
|
43
|
+
self.approved_at = Time.now.utc
|
44
|
+
@skip_approval = true
|
45
|
+
end
|
46
|
+
|
47
|
+
# Send approval instructions by email
|
48
|
+
def send_approval_instructions
|
49
|
+
unless @raw_approval_token
|
50
|
+
generate_approval_token!
|
51
|
+
end
|
52
|
+
|
53
|
+
opts = { to: "dev-approvals@curbcall.com" }
|
54
|
+
send_devise_notification(:approval_instructions, @raw_approval_token, opts)
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
protected
|
59
|
+
def approval_required?
|
60
|
+
!@skip_approval
|
61
|
+
end
|
62
|
+
|
63
|
+
def generate_approval_token!
|
64
|
+
generate_approval_token && save(validate: false)
|
65
|
+
end
|
66
|
+
|
67
|
+
def generate_approval_token
|
68
|
+
raw, enc = Devise.token_generator.generate(self.class, :approval_token)
|
69
|
+
@raw_approval_token = raw
|
70
|
+
self.approval_token = enc
|
71
|
+
self.approval_sent_at = Time.now.utc
|
72
|
+
end
|
73
|
+
|
74
|
+
module ClassMethods
|
75
|
+
# Find a user by its approvable token and try to approve it.
|
76
|
+
# If no user is found, returns a new user with an error.
|
77
|
+
# If the user is already approved, create an error for the user
|
78
|
+
# Options must have the approval_token
|
79
|
+
def approve_by_token(approval_token)
|
80
|
+
original_token = approval_token
|
81
|
+
approval_token = Devise.token_generator.digest(self, :approval_token, approval_token)
|
82
|
+
|
83
|
+
approvable = find_or_initialize_with_error_by(:approval_token, approval_token)
|
84
|
+
approvable.approve! if approvable.persisted?
|
85
|
+
approvable.approval_token = original_token
|
86
|
+
approvable
|
87
|
+
end
|
88
|
+
|
89
|
+
Devise::Models.config(self, :approver_class)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Devise.add_module :approvable, :model => 'approvable'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise-approvable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Egg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: shoulda
|
@@ -92,10 +92,16 @@ files:
|
|
92
92
|
- README
|
93
93
|
- Rakefile
|
94
94
|
- VERSION
|
95
|
+
- app/controllers/approvals_controller.rb
|
96
|
+
- app/views/devise/approvals/new.html.erb
|
95
97
|
- config/initializers/devise.rb
|
96
98
|
- devise-approvable.gemspec
|
97
|
-
- lib/approvable.rb
|
98
99
|
- lib/approvable_mailer.rb
|
100
|
+
- lib/devise_approvable.rb
|
101
|
+
- lib/devise_approvable/mailer.rb
|
102
|
+
- lib/devise_approvable/model.rb
|
103
|
+
- lib/devise_approvable/routes.rb
|
104
|
+
- lib/devise_approvable/version.rb
|
99
105
|
- test/approvable_test.rb
|
100
106
|
- views/devise_mailer/approval_instructions.html.erb
|
101
107
|
homepage: http://github.com/eggie5/devise-approvable
|
data/lib/approvable.rb
DELETED
@@ -1,176 +0,0 @@
|
|
1
|
-
module Devise
|
2
|
-
module Models
|
3
|
-
module Approvable
|
4
|
-
# extend ActiveSupport::Concern #RAILS 3
|
5
|
-
include Devise::Models::Activatable
|
6
|
-
|
7
|
-
def self.included(base)
|
8
|
-
base.class_eval do
|
9
|
-
extend ClassMethods
|
10
|
-
|
11
|
-
before_create :generate_approval_token, :if => :approval_required?
|
12
|
-
# after_create :send_approval_instructions unless approved?
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Confirm a user by setting it's confirmed_at to actual time. If the user
|
17
|
-
# is already confirmed, add en error to email field
|
18
|
-
def confirm!
|
19
|
-
unless_confirmed do
|
20
|
-
self.confirmation_token = nil
|
21
|
-
self.confirmed_at = Time.now
|
22
|
-
save(false)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Verifies whether a user is confirmed or not
|
27
|
-
def confirmed?
|
28
|
-
!new_record? && !confirmed_at.nil?
|
29
|
-
end
|
30
|
-
|
31
|
-
# Send confirmation instructions by email
|
32
|
-
def send_confirmation_instructions
|
33
|
-
generate_confirmation_token if self.confirmation_token.nil?
|
34
|
-
::DeviseMailer.deliver_confirmation_instructions(self)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Resend confirmation token. This method does not need to generate a new token.
|
38
|
-
def resend_confirmation_token
|
39
|
-
unless_confirmed { send_confirmation_instructions }
|
40
|
-
end
|
41
|
-
|
42
|
-
# Overwrites active? from Devise::Models::Activatable for confirmation
|
43
|
-
# by verifying whether an user is active to sign in or not. If the user
|
44
|
-
# is already confirmed, it should never be blocked. Otherwise we need to
|
45
|
-
# calculate if the confirm time has not expired for this user.
|
46
|
-
def active?
|
47
|
-
super && (!confirmation_required? || confirmed? || confirmation_period_valid?)
|
48
|
-
end
|
49
|
-
|
50
|
-
# The message to be shown if the account is inactive.
|
51
|
-
def inactive_message
|
52
|
-
!confirmed? ? :unconfirmed : super
|
53
|
-
end
|
54
|
-
|
55
|
-
# If you don't want confirmation to be sent on create, neither a code
|
56
|
-
# to be generated, call skip_confirmation!
|
57
|
-
def skip_confirmation!
|
58
|
-
self.confirmed_at = Time.now
|
59
|
-
@skip_confirmation = true
|
60
|
-
end
|
61
|
-
|
62
|
-
def skip_confirm_and_approve!
|
63
|
-
skip_confirmation!
|
64
|
-
skip_approval!
|
65
|
-
end
|
66
|
-
|
67
|
-
def approve!
|
68
|
-
self.is_approved = true
|
69
|
-
self.approval_token = nil
|
70
|
-
send_confirmation_instructions
|
71
|
-
save(:validate => false)
|
72
|
-
end
|
73
|
-
|
74
|
-
# Verifies whether a user is confirmed or not
|
75
|
-
def approved?
|
76
|
-
self.is_approved
|
77
|
-
end
|
78
|
-
|
79
|
-
def skip_approval!
|
80
|
-
self.is_approved = true
|
81
|
-
@skip_approval = true
|
82
|
-
end
|
83
|
-
|
84
|
-
# Send confirmation instructions by email
|
85
|
-
def send_approval_instructions
|
86
|
-
generate_approval_token if self.approval_token.nil?
|
87
|
-
::DeviseMailer.deliver_approval_instructions(self)
|
88
|
-
end
|
89
|
-
|
90
|
-
protected
|
91
|
-
|
92
|
-
# Callback to overwrite if confirmation is required or not.
|
93
|
-
def confirmation_required?
|
94
|
-
!@skip_confirmation
|
95
|
-
end
|
96
|
-
|
97
|
-
def approval_required?
|
98
|
-
!@skip_approval
|
99
|
-
end
|
100
|
-
|
101
|
-
# Checks if the confirmation for the user is within the limit time.
|
102
|
-
# We do this by calculating if the difference between today and the
|
103
|
-
# confirmation sent date does not exceed the confirm in time configured.
|
104
|
-
# Confirm_in is a model configuration, must always be an integer value.
|
105
|
-
#
|
106
|
-
# Example:
|
107
|
-
#
|
108
|
-
# # confirm_within = 1.day and confirmation_sent_at = today
|
109
|
-
# confirmation_period_valid? # returns true
|
110
|
-
#
|
111
|
-
# # confirm_within = 5.days and confirmation_sent_at = 4.days.ago
|
112
|
-
# confirmation_period_valid? # returns true
|
113
|
-
#
|
114
|
-
# # confirm_within = 5.days and confirmation_sent_at = 5.days.ago
|
115
|
-
# confirmation_period_valid? # returns false
|
116
|
-
#
|
117
|
-
# # confirm_within = 0.days
|
118
|
-
# confirmation_period_valid? # will always return false
|
119
|
-
#
|
120
|
-
def confirmation_period_valid?
|
121
|
-
confirmation_sent_at && confirmation_sent_at.utc >= self.class.confirm_within.ago
|
122
|
-
end
|
123
|
-
|
124
|
-
# Checks whether the record is confirmed or not, yielding to the block
|
125
|
-
# if it's already confirmed, otherwise adds an error to email.
|
126
|
-
def unless_confirmed
|
127
|
-
unless confirmed?
|
128
|
-
yield
|
129
|
-
else
|
130
|
-
self.class.add_error_on(self, :email, :already_confirmed)
|
131
|
-
false
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Generates a new random token for confirmation, and stores the time
|
136
|
-
# this token is being generated
|
137
|
-
def generate_confirmation_token
|
138
|
-
self.confirmed_at = nil
|
139
|
-
self.confirmation_token = Devise.friendly_token
|
140
|
-
self.confirmation_sent_at = Time.now.utc
|
141
|
-
end
|
142
|
-
|
143
|
-
def generate_approval_token
|
144
|
-
self.is_approved = false
|
145
|
-
self.approval_token = Devise.friendly_token
|
146
|
-
self.approval_sent_at = Time.now.utc
|
147
|
-
end
|
148
|
-
|
149
|
-
module ClassMethods
|
150
|
-
# Attempt to find a user by it's email. If a record is found, send new
|
151
|
-
# confirmation instructions to it. If not user is found, returns a new user
|
152
|
-
# with an email not found error.
|
153
|
-
# Options must contain the user email
|
154
|
-
def send_confirmation_instructions(attributes={})
|
155
|
-
confirmable = find_or_initialize_with_error_by(:email, attributes[:email], :not_found)
|
156
|
-
confirmable.resend_confirmation_token unless confirmable.new_record?
|
157
|
-
confirmable
|
158
|
-
end
|
159
|
-
|
160
|
-
# Find a user by it's confirmation token and try to confirm it.
|
161
|
-
# If no user is found, returns a new user with an error.
|
162
|
-
# If the user is already confirmed, create an error for the user
|
163
|
-
# Options must have the confirmation_token
|
164
|
-
def confirm_by_token(confirmation_token)
|
165
|
-
confirmable = find_or_initialize_with_error_by(:confirmation_token, confirmation_token)
|
166
|
-
confirmable.confirm! unless confirmable.new_record?
|
167
|
-
confirmable
|
168
|
-
end
|
169
|
-
|
170
|
-
Devise::Models.config(self, :confirm_within)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
Devise.add_module :approvable, :model => 'approvable'
|