fine_print 1.4.1 → 2.0.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.
- checksums.yaml +4 -4
- data/README.md +9 -2
- data/Rakefile +0 -1
- data/app/assets/javascripts/fine_print/application.js +0 -1
- data/app/assets/stylesheets/fine_print/application.css +0 -1
- data/app/controllers/fine_print/application_controller.rb +9 -4
- data/app/controllers/fine_print/contracts_controller.rb +16 -12
- data/app/controllers/fine_print/home_controller.rb +5 -0
- data/app/controllers/fine_print/signatures_controller.rb +44 -2
- data/app/models/fine_print/contract.rb +17 -45
- data/app/models/fine_print/signature.rb +4 -3
- data/app/views/fine_print/contracts/_show.html.erb +11 -0
- data/app/views/fine_print/contracts/edit.html.erb +1 -1
- data/app/views/fine_print/contracts/index.html.erb +12 -14
- data/app/views/fine_print/contracts/new_version.html.erb +1 -1
- data/app/views/fine_print/contracts/show.html.erb +18 -29
- data/app/views/fine_print/signatures/_form.html.erb +21 -0
- data/app/views/fine_print/signatures/index.html.erb +3 -7
- data/app/views/fine_print/signatures/new.html.erb +13 -0
- data/config/initializers/fine_print.rb +36 -33
- data/config/routes.rb +5 -5
- data/db/migrate/0_install_fine_print.rb +2 -3
- data/lib/fine_print/controller_includes.rb +41 -67
- data/lib/fine_print/engine.rb +3 -0
- data/lib/fine_print/version.rb +1 -1
- data/lib/fine_print.rb +48 -57
- data/spec/controllers/contracts_controller_spec.rb +98 -98
- data/spec/controllers/home_controller_spec.rb +7 -5
- data/spec/controllers/signatures_controller_spec.rb +48 -19
- data/spec/dummy/app/models/dummy_user.rb +0 -1
- data/spec/dummy/config/initializers/fine_print.rb +2 -1
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +31970 -0
- data/spec/dummy/log/test.log +71587 -0
- data/spec/lib/fine_print/controller_includes_spec.rb +9 -14
- data/spec/lib/fine_print_spec.rb +15 -9
- data/spec/models/contract_spec.rb +17 -25
- data/spec/models/signature_spec.rb +4 -14
- data/spec/spec_helper.rb +1 -2
- metadata +33 -4
- data/app/views/fine_print/home/index.html.erb +0 -16
- data/lib/fine_print/security_transgression.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 229ff9376133bf2ec88be816ca6c0616cc3870c5
|
4
|
+
data.tar.gz: ba35f289d9cbf3f3405fa02eba2b87d6ec1f552d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a56e58821c884748ccd333fe9c9f87e7d16d393da9646069c39b02f1f81afbc883b74a4ab3ad3e919b4913f68feccd189089549ac00a0e7c998f1f9f18b4886
|
7
|
+
data.tar.gz: cd1acacfbf520bc35018053891830c15017a71517f0cbd7cac4cdceb251f7261173e4a1af59accb9779190bc4382c21aab63d0787e77fa6e0b08dc4065d24e8f
|
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# FinePrint
|
2
2
|
|
3
|
-
|
3
|
+
[](http://badge.fury.io/rb/fine_print)
|
4
|
+
[](https://travis-ci.org/lml/fine_print)
|
5
|
+
[](https://codeclimate.com/github/lml/fine_print)
|
6
|
+
|
7
|
+
FinePrint is a Rails engine in gem form that makes managing web site agreements (terms of use, privacy policy, etc) simple and easy.
|
4
8
|
|
5
9
|
As the meaning of 'agreement' can be somewhat ambiguous (meaning either the thing someone agrees to or the record of the agreement between that thing and the user), we call a set of terms a 'contract' and a user's agreement to that contract a 'signature'.
|
6
10
|
|
@@ -64,13 +68,16 @@ You can choose to check if users signed contracts either as a before_filter or i
|
|
64
68
|
|
65
69
|
### Option 1 - As a before_filter
|
66
70
|
|
67
|
-
If you choose to have FinePrint work like a before_filter, you can user the following
|
71
|
+
If you choose to have FinePrint work like a before_filter, you can user the following 3 class methods, which are automatically added to all of your controllers:
|
68
72
|
|
69
73
|
```rb
|
70
74
|
fine_print_get_signatures(contract_names..., options_hash)
|
75
|
+
fine_print_require_signatures(contract_names..., options_hash)
|
71
76
|
fine_print_skip_signatures(contract_names..., options_hash)
|
72
77
|
```
|
73
78
|
|
79
|
+
They work as follows:
|
80
|
+
- `fine_print_get_signatures` will redirect the user
|
74
81
|
To require that your users sign the most recent version of a contract, call
|
75
82
|
`fine_print_get_signatures` in your controller classes. It works just like a `before_filter` (in fact, it will add a `before_filter` for you).
|
76
83
|
|
data/Rakefile
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
module FinePrint
|
2
2
|
class ApplicationController < ActionController::Base
|
3
|
-
|
3
|
+
respond_to :html
|
4
|
+
|
5
|
+
before_filter :get_user, :can_manage
|
4
6
|
|
5
7
|
protected
|
6
8
|
|
7
|
-
def
|
8
|
-
user = FinePrint.current_user_proc
|
9
|
-
|
9
|
+
def get_user
|
10
|
+
@user = instance_exec &FinePrint.current_user_proc
|
11
|
+
end
|
12
|
+
|
13
|
+
def can_manage
|
14
|
+
with_interceptor { instance_exec @user, &FinePrint.can_manage_proc }
|
10
15
|
end
|
11
16
|
end
|
12
17
|
end
|
@@ -1,22 +1,17 @@
|
|
1
1
|
module FinePrint
|
2
2
|
class ContractsController < FinePrint::ApplicationController
|
3
3
|
include FinePrint::ApplicationHelper
|
4
|
+
|
4
5
|
before_filter :get_contract, :except => [:index, :new, :create]
|
5
6
|
|
6
7
|
def index
|
7
|
-
@contracts = Contract.all
|
8
|
-
end
|
9
|
-
|
10
|
-
def show
|
8
|
+
@contracts = Contract.includes(:signatures).all.to_a.group_by(&:name)
|
11
9
|
end
|
12
10
|
|
13
11
|
def new
|
14
12
|
@contract = Contract.new
|
15
13
|
end
|
16
|
-
|
17
|
-
def edit
|
18
|
-
end
|
19
|
-
|
14
|
+
|
20
15
|
def create
|
21
16
|
@contract = Contract.new
|
22
17
|
@contract.name = params[:contract][:name]
|
@@ -26,10 +21,19 @@ module FinePrint
|
|
26
21
|
if @contract.save
|
27
22
|
redirect_to @contract, :notice => 'Contract was successfully created.'
|
28
23
|
else
|
29
|
-
render :action => 'new'
|
24
|
+
render :action => 'new', :alert => merge_errors_for(@contract)
|
30
25
|
end
|
31
26
|
end
|
32
|
-
|
27
|
+
|
28
|
+
def show
|
29
|
+
end
|
30
|
+
|
31
|
+
def edit
|
32
|
+
@contract.no_signatures
|
33
|
+
redirect_to contracts_path, :alert => merge_errors_for(@contract) \
|
34
|
+
unless @contract.errors.empty?
|
35
|
+
end
|
36
|
+
|
33
37
|
def update
|
34
38
|
@contract.name = params[:contract][:name]
|
35
39
|
@contract.title = params[:contract][:title]
|
@@ -38,7 +42,7 @@ module FinePrint
|
|
38
42
|
if @contract.save
|
39
43
|
redirect_to @contract, :notice => 'Contract was successfully updated.'
|
40
44
|
else
|
41
|
-
render :action => 'edit'
|
45
|
+
render :action => 'edit', :alert => merge_errors_for(@contract)
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
@@ -67,7 +71,7 @@ module FinePrint
|
|
67
71
|
end
|
68
72
|
|
69
73
|
def new_version
|
70
|
-
@contract = @contract.
|
74
|
+
@contract = @contract.new_version
|
71
75
|
end
|
72
76
|
|
73
77
|
protected
|
@@ -1,14 +1,56 @@
|
|
1
1
|
module FinePrint
|
2
2
|
class SignaturesController < FinePrint::ApplicationController
|
3
|
+
include FinePrint::ApplicationHelper
|
4
|
+
|
5
|
+
acts_as_interceptor :override_url_options => true
|
6
|
+
|
7
|
+
skip_before_filter :can_manage, :only => [:new, :create]
|
8
|
+
before_filter :can_sign, :only => [:new, :create]
|
9
|
+
before_filter :get_contract, :only => [:index, :new, :create]
|
10
|
+
|
3
11
|
def index
|
4
|
-
@signatures =
|
12
|
+
@signatures = @contract.signatures
|
13
|
+
end
|
14
|
+
|
15
|
+
def new
|
16
|
+
@signature = Signature.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def create
|
20
|
+
@signature = Signature.new
|
21
|
+
|
22
|
+
unless params[:signature_accept]
|
23
|
+
@signature.errors.add(:contract, 'must be accepted to proceed')
|
24
|
+
render :action => 'new'
|
25
|
+
return
|
26
|
+
end
|
27
|
+
|
28
|
+
@signature.user = @user
|
29
|
+
@signature.contract = @contract
|
30
|
+
|
31
|
+
if @signature.save
|
32
|
+
redirect_back
|
33
|
+
else
|
34
|
+
render :action => 'new', :alert => merge_errors_for(@signature)
|
35
|
+
end
|
5
36
|
end
|
6
37
|
|
7
38
|
def destroy
|
8
39
|
@signature = Signature.find(params[:id])
|
9
40
|
|
10
41
|
@signature.destroy
|
11
|
-
redirect_to
|
42
|
+
redirect_to contract_signatures_path(@signature.contract),
|
43
|
+
:notice => 'Signature was successfully deleted.'
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
def can_sign
|
49
|
+
with_interceptor { instance_exec @user, &FinePrint.can_sign_proc }
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_contract
|
53
|
+
@contract = Contract.find(params[:contract_id])
|
12
54
|
end
|
13
55
|
end
|
14
56
|
end
|
@@ -1,45 +1,35 @@
|
|
1
1
|
module FinePrint
|
2
2
|
class Contract < ActiveRecord::Base
|
3
|
-
has_many :signatures, :inverse_of => :contract
|
3
|
+
has_many :signatures, :dependent => :destroy, :inverse_of => :contract
|
4
4
|
|
5
|
-
has_many :same_name, :class_name => 'Contract',
|
5
|
+
has_many :same_name, :class_name => 'Contract',
|
6
|
+
:primary_key => :name, :foreign_key => :name
|
6
7
|
|
7
8
|
before_validation :downcase_name
|
8
9
|
before_update :no_signatures
|
9
10
|
before_destroy :no_signatures
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
validates :name, :presence => true, :format => /\A[\w-]+\z/
|
13
|
+
validates :title, :presence => true
|
14
|
+
validates :content, :presence => true
|
15
|
+
validates :version, :uniqueness => {:scope => :name, :case_sensitive => false},
|
16
|
+
:allow_nil => true
|
14
17
|
|
15
|
-
default_scope { order
|
18
|
+
default_scope lambda { order{[name.asc, version.desc]} }
|
16
19
|
|
17
|
-
scope :published, lambda { where
|
18
|
-
scope :latest, lambda {
|
19
|
-
|
20
|
-
.group('fine_print_contracts.id')
|
21
|
-
.having(:version =>
|
22
|
-
arel_table.alias(:same_names_fine_print_contracts)[:version].maximum.tap{|mvq| mvq.alias = nil})
|
23
|
-
}
|
20
|
+
scope :published, lambda { where{version != nil} }
|
21
|
+
scope :latest, lambda { joins(:same_name).group{id}
|
22
|
+
.having{version == max(same_name.version)} }
|
24
23
|
|
25
24
|
def is_published?
|
26
25
|
!version.nil?
|
27
26
|
end
|
28
27
|
|
29
28
|
def is_latest?
|
30
|
-
is_published? &&
|
31
|
-
end
|
32
|
-
|
33
|
-
def sign(user)
|
34
|
-
FinePrint.sign_contract(self, user)
|
35
|
-
end
|
36
|
-
|
37
|
-
def signed_by?(user)
|
38
|
-
FinePrint.signed_contract?(self, user)
|
29
|
+
is_published? && self == same_name.published.first
|
39
30
|
end
|
40
31
|
|
41
32
|
def publish
|
42
|
-
no_signatures
|
43
33
|
errors.add(:base, 'Contract is already published') if is_published?
|
44
34
|
return false unless errors.empty?
|
45
35
|
|
@@ -48,7 +38,6 @@ module FinePrint
|
|
48
38
|
end
|
49
39
|
|
50
40
|
def unpublish
|
51
|
-
no_signatures
|
52
41
|
errors.add(:base, 'Contract is not the latest published version') unless is_latest?
|
53
42
|
return false unless errors.empty?
|
54
43
|
|
@@ -56,28 +45,11 @@ module FinePrint
|
|
56
45
|
save
|
57
46
|
end
|
58
47
|
|
59
|
-
def
|
60
|
-
Contract.where(:name => name, :version => nil).first ||
|
61
|
-
|
62
|
-
|
63
|
-
##################
|
64
|
-
# Access Control #
|
65
|
-
##################
|
66
|
-
|
67
|
-
def can_be_updated?
|
68
|
-
signatures.empty?
|
69
|
-
end
|
70
|
-
|
71
|
-
def can_be_published?
|
72
|
-
signatures.empty? && !is_published?
|
48
|
+
def new_version
|
49
|
+
Contract.where(:name => name, :version => nil).first || \
|
50
|
+
dup.tap{|contract| contract.version = nil}
|
73
51
|
end
|
74
52
|
|
75
|
-
def can_be_unpublished?
|
76
|
-
signatures.empty? && is_latest?
|
77
|
-
end
|
78
|
-
|
79
|
-
alias_method :can_be_destroyed?, :can_be_updated?
|
80
|
-
|
81
53
|
##############
|
82
54
|
# Validation #
|
83
55
|
##############
|
@@ -91,7 +63,7 @@ module FinePrint
|
|
91
63
|
protected
|
92
64
|
|
93
65
|
def downcase_name
|
94
|
-
self.name = name.downcase
|
66
|
+
self.name = name.try(:downcase)
|
95
67
|
end
|
96
68
|
end
|
97
69
|
end
|
@@ -3,10 +3,11 @@ module FinePrint
|
|
3
3
|
belongs_to :contract, :inverse_of => :signatures
|
4
4
|
belongs_to :user, :polymorphic => true
|
5
5
|
|
6
|
-
|
6
|
+
validate :contract_published, :on => :create
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
validates :contract, :presence => true,
|
9
|
+
:uniqueness => {:scope => [:user_type, :user_id]}
|
10
|
+
validates :user, :presence => true
|
10
11
|
|
11
12
|
default_scope { order(:contract_id, :user_type, :user_id) }
|
12
13
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Clients of this partial must provide the following variable:
|
2
|
+
contract %>
|
3
|
+
|
4
|
+
<h2 class='fine_print heading'><%= contract.title %> <%= @contract.version ? \
|
5
|
+
"(v.#{@contract.version})" : 'Draft' %></h2>
|
6
|
+
|
7
|
+
<h4 class='fine_print heading'>Last updated: <%= contract.updated_at %></h4>
|
8
|
+
|
9
|
+
<div class='fine_print contract'>
|
10
|
+
<pre><%= @contract.content.html_safe %></pre>
|
11
|
+
</div>
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
<div class='fine_print contract_index'>
|
4
4
|
|
5
|
-
<% @contracts.
|
5
|
+
<% @contracts.each do |name, contracts| %>
|
6
6
|
|
7
7
|
<%# Sort contracts by version number; unpublished contracts go at end by creation date %>
|
8
|
-
<% contracts = contracts.sort_by {|cc| cc.version || cc.created_at.to_i} %>
|
8
|
+
<% #contracts = contracts.sort_by {|cc| cc.version || cc.created_at.to_i} %>
|
9
9
|
|
10
10
|
<ul class='fine_print'>
|
11
11
|
<li><%= name %></li>
|
@@ -14,18 +14,17 @@
|
|
14
14
|
<% contracts.each do |contract| %>
|
15
15
|
<li><%= link_to contract.title, contract %>
|
16
16
|
(<%= contract.version.nil? ? 'draft' : "v.#{contract.version.to_s}" %>)
|
17
|
-
<% if contract.
|
17
|
+
<% if contract.signatures.empty? %>
|
18
18
|
[<%= link_to 'Edit', edit_contract_path(contract), :class => 'fine_print link' %>]
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<% elsif contract.can_be_unpublished? %>
|
25
|
-
[<%= link_to 'Unpublish', unpublish_contract_path(contract), :method => :put, :data => {:confirm => 'Are you sure you want to unpublish this contract?'} %>]
|
26
|
-
<% end %>
|
27
|
-
<% if contract.can_be_destroyed? %>
|
19
|
+
<% if contract.is_published? %>
|
20
|
+
[<%= link_to 'Unpublish', unpublish_contract_path(contract), :method => :put, :data => {:confirm => 'Are you sure you want to unpublish this contract?'} %>]
|
21
|
+
<% else %>
|
22
|
+
[<%= link_to 'Publish', publish_contract_path(contract), :method => :put, :data => {:confirm => 'Are you sure you want to publish this contract?'} %>]
|
23
|
+
<% end %>
|
28
24
|
[<%= link_to 'Delete', contract, :method => :delete, :data => {:confirm => 'Are you sure you wish to delete this contract?'}, :class => 'fine_print link' %>]
|
25
|
+
<% else %>
|
26
|
+
[<%= link_to 'New version', new_version_contract_path(contract), :method => :post %>]
|
27
|
+
[<%= link_to 'Signatures', contract_signatures_path(contract) %>]
|
29
28
|
<% end %>
|
30
29
|
</li>
|
31
30
|
<% end %>
|
@@ -36,8 +35,7 @@
|
|
36
35
|
<% end %>
|
37
36
|
|
38
37
|
<div class='fine_print links'>
|
39
|
-
<%= link_to 'New Contract', new_contract_path, :class => 'fine_print link' %>
|
40
|
-
<%= link_to 'Overview', root_path, :class => 'fine_print link' %>
|
38
|
+
<%= link_to 'New Contract', new_contract_path, :class => 'fine_print link' %>
|
41
39
|
</div>
|
42
40
|
|
43
41
|
</div>
|
@@ -1,33 +1,22 @@
|
|
1
1
|
<h1 class='fine_print heading'>Contract Details</h1>
|
2
2
|
|
3
|
-
<
|
4
|
-
<table class='fine_print left_heading'>
|
5
|
-
<tr>
|
6
|
-
<th>Name</th>
|
7
|
-
<td><%= @contract.name %></td>
|
8
|
-
</tr>
|
9
|
-
<tr>
|
10
|
-
<th>Title</th>
|
11
|
-
<td><%= @contract.title %></td>
|
12
|
-
</tr>
|
13
|
-
<tr>
|
14
|
-
<th>Version</th>
|
15
|
-
<td><%= @contract.version.nil? ? 'Draft' : @contract.version %></td>
|
16
|
-
</tr>
|
17
|
-
<tr>
|
18
|
-
<th>Updated at</th>
|
19
|
-
<td><%= @contract.updated_at %></td>
|
20
|
-
</tr>
|
21
|
-
<tr>
|
22
|
-
<th>Content</th>
|
23
|
-
<td><%= @contract.content.html_safe %></td>
|
24
|
-
</tr>
|
25
|
-
</table>
|
3
|
+
<h4 class='fine_print heading'>Name: <%= @contract.name %></h4>
|
26
4
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
<%= link_to '
|
32
|
-
|
5
|
+
<%= render :partial => 'show', :locals => {:contract => @contract} %>
|
6
|
+
|
7
|
+
<div class='fine_print links'>
|
8
|
+
<% if @contract.signatures.empty? %>
|
9
|
+
<%= link_to 'Edit', edit_contract_path(@contract), :class => 'fine_print link' %> |
|
10
|
+
<% if @contract.is_published? %>
|
11
|
+
<%= link_to 'Unpublish', unpublish_contract_path(@contract), :method => :put, :data => {:confirm => 'Are you sure you want to unpublish this contract?'} %>
|
12
|
+
<% else %>
|
13
|
+
<%= link_to 'Publish', publish_contract_path(@contract), :method => :put, :data => {:confirm => 'Are you sure you want to publish this contract?'} %> |
|
14
|
+
<% end %>
|
15
|
+
<%= link_to 'Delete', @contract, :method => :delete, :data => {:confirm => 'Are you sure you wish to delete this contract?'}, :class => 'fine_print link' %>
|
16
|
+
<% else %>
|
17
|
+
<%= link_to 'New version', new_version_contract_path(@contract), :method => :post %> |
|
18
|
+
<%= link_to 'Signatures', contract_signatures_path(@contract),
|
19
|
+
:class => 'fine_print link' %>
|
20
|
+
<% end %>
|
21
|
+
| <%= link_to 'List', contracts_path, :class => 'fine_print link' %>
|
33
22
|
</div>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= form_for([@contract, @signature], :html => {:class => 'fine_print'}) do |f| %>
|
2
|
+
<% if @signature.errors.any? %>
|
3
|
+
<div id='error_explanation' class='fine_print errors'>
|
4
|
+
<h4 class='fine_print heading'>Error:</h4>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @signature.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%= msg %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class='field'>
|
15
|
+
<%= f.label :accept, 'I have read and accept the terms above.', :class => 'fine_print' %>
|
16
|
+
<%= check_box_tag :signature_accept, :class => 'fine_print check_box' %>
|
17
|
+
</div>
|
18
|
+
<div class='actions'>
|
19
|
+
<%= f.submit 'I agree', :class => 'fine_print submit' %>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
@@ -1,12 +1,10 @@
|
|
1
|
-
<h1 class='fine_print heading'>
|
1
|
+
<h1 class='fine_print heading'>Signatures for <%= link_to "#{@contract.title} (v.#{@contract.version})", @contract %></h1>
|
2
2
|
|
3
3
|
<div class='fine_print signature_index'>
|
4
4
|
|
5
5
|
<table class='fine_print top_heading index'>
|
6
6
|
<tr class='fine_print heading-row'>
|
7
7
|
<th>User ID</th>
|
8
|
-
<th>Contract name</th>
|
9
|
-
<th>Contract version</th>
|
10
8
|
<th>Date accepted</th>
|
11
9
|
<th></th>
|
12
10
|
</tr>
|
@@ -14,8 +12,6 @@
|
|
14
12
|
<% @signatures.each do |signature| %>
|
15
13
|
<tr class='fine_print data-row <%= cycle('even', 'odd') %>'>
|
16
14
|
<td><%= signature.user.id %></td>
|
17
|
-
<td><%= signature.contract.name %></td>
|
18
|
-
<td><%= signature.contract.version %></td>
|
19
15
|
<td><%= signature.created_at %></td>
|
20
16
|
<td><%= link_to 'Terminate',
|
21
17
|
signature,
|
@@ -30,7 +26,7 @@
|
|
30
26
|
</table>
|
31
27
|
|
32
28
|
<div class='fine_print links'>
|
33
|
-
<%= link_to '
|
29
|
+
<%= link_to 'List', contracts_path, :class => 'fine_print link' %>
|
34
30
|
</div>
|
35
31
|
|
36
|
-
</div>
|
32
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<div class='fine_print contract'>
|
2
|
+
<%= render :partial => 'fine_print/contracts/show',
|
3
|
+
:locals => {:contract => @contract} %>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class='fine_print new_signature'>
|
7
|
+
<%= render 'form' %>
|
8
|
+
|
9
|
+
<div class='fine_print links'>
|
10
|
+
<%= without_interceptor { link_to 'I do not agree',
|
11
|
+
main_app.root_url, :class => 'fine_print link' } %>
|
12
|
+
</div>
|
13
|
+
</div>
|
@@ -1,41 +1,44 @@
|
|
1
1
|
# Change the settings below to suit your needs
|
2
2
|
# All options are initially set to their default values
|
3
3
|
FinePrint.configure do |config|
|
4
|
+
|
4
5
|
# Engine Configuration
|
5
6
|
|
6
|
-
# Proc called with a controller as
|
7
|
+
# Proc called with a controller as self.
|
7
8
|
# Returns the current user.
|
8
|
-
# Default: lambda {
|
9
|
-
config.current_user_proc = lambda {
|
10
|
-
|
11
|
-
# Proc called with a user as argument.
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
#
|
22
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
|
31
|
-
#
|
32
|
-
|
9
|
+
# Default: lambda { current_user }
|
10
|
+
config.current_user_proc = lambda { current_user }
|
11
|
+
|
12
|
+
# Proc called with a user as argument and a controller as self.
|
13
|
+
# This proc is called when a user tries to access FinePrint's controllers.
|
14
|
+
# Should raise and exception, render or redirect unless the user can manage contracts.
|
15
|
+
# Contract managers can create and edit agreements and terminate accepted agreements.
|
16
|
+
# The default does not allow anyone to manage contracts.
|
17
|
+
# Note: Proc must account for nil users, if current_user_proc returns nil.
|
18
|
+
# Default: lambda { |user| false || raise(ActionController::RoutingError, 'Not Found') }
|
19
|
+
config.can_manage_proc = lambda { |user| false || \
|
20
|
+
raise(ActionController::RoutingError, 'Not Found') }
|
21
|
+
|
22
|
+
# Proc called with a user as argument and a controller as self.
|
23
|
+
# This proc is called to check that the given user is allowed to sign contracts.
|
24
|
+
# Should raise and exception, render or redirect unless the user can sign contracts.
|
25
|
+
# You might want to redirect users to a login page if they are not signed in.
|
26
|
+
# The default renders 401 Unauthorized for nil users.
|
27
|
+
# Default: lambda { |user| !user.nil? || head(:unauthorized) }
|
28
|
+
config.can_sign_proc = lambda { |user| !user.nil? || head(:unauthorized) }
|
29
|
+
|
30
|
+
# Controller Configuration
|
31
|
+
|
32
|
+
# Proc called with a user and an array of contract ids as arguments and a controller as self.
|
33
|
+
# This proc is called when a user tries to access a resource protected by FinePrint,
|
34
|
+
# but has not signed all the required contracts.
|
35
|
+
# Should raise and exception, render or redirect the user.
|
36
|
+
# The `contract_ids` variable contains the contract ids that need to be signed.
|
37
|
+
# The default redirects users to FinePrint's contract signing views.
|
38
|
+
# The `fine_print_return` method can be used to return from a redirect made here.
|
39
|
+
# Default: lambda { |user, contract_ids| with_interceptor { redirect_to(
|
40
|
+
# fine_print.new_contract_signature_path(:contract_id => contract_ids.first)) } }
|
41
|
+
config.must_sign_proc = lambda { |user, contract_ids| redirect_to(
|
42
|
+
fine_print.new_contract_signature_path(:contract_id => contract_ids.first)) }
|
33
43
|
|
34
|
-
# Path to redirect users to when they need to agree to contract(s).
|
35
|
-
# A list of contract names that must be agreed to will be available in the `contract_param_name` parameter.
|
36
|
-
# Your code doesn't have to deal with all of them at once, e.g. you can get
|
37
|
-
# the user to agree to the first one and then they'll just eventually be
|
38
|
-
# redirected back to this page with the remaining contract names.
|
39
|
-
# Default: '/'
|
40
|
-
config.contract_redirect_path = '/'
|
41
44
|
end
|
data/config/routes.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
FinePrint::Engine.routes.draw do
|
2
|
+
root :to => 'home#index'
|
3
|
+
|
2
4
|
resources :contracts do
|
5
|
+
resources :signatures, :only => [:index, :new, :create, :destroy], :shallow => true
|
6
|
+
|
3
7
|
member do
|
4
|
-
|
8
|
+
post :new_version
|
5
9
|
put :publish
|
6
10
|
put :unpublish
|
7
11
|
end
|
8
12
|
end
|
9
|
-
|
10
|
-
resources :signatures, :only => [:index, :destroy]
|
11
|
-
|
12
|
-
root :to => 'home#index'
|
13
13
|
end
|