approval 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/approval/config.rb +2 -5
- data/lib/approval/engine.rb +4 -5
- data/lib/approval/version.rb +1 -1
- data/lib/approval.rb +6 -3
- data/lib/generators/approval/install_generator.rb +3 -35
- data/lib/generators/approval/templates/{initializer.rb → initializer.rb.tt} +0 -0
- metadata +5 -24
- data/lib/approval/mixins/resource.rb +0 -28
- data/lib/approval/mixins/user.rb +0 -36
- data/lib/approval/mixins.rb +0 -19
- data/lib/approval/models/approval/comment.rb +0 -15
- data/lib/approval/models/approval/item.rb +0 -66
- data/lib/approval/models/approval/request.rb +0 -46
- data/lib/approval/models/approval/request_form/base.rb +0 -45
- data/lib/approval/models/approval/request_form/create.rb +0 -21
- data/lib/approval/models/approval/request_form/destroy.rb +0 -21
- data/lib/approval/models/approval/request_form/update.rb +0 -22
- data/lib/approval/models/approval/request_form.rb +0 -4
- data/lib/approval/models/approval/respond_form/approve.rb +0 -19
- data/lib/approval/models/approval/respond_form/base.rb +0 -42
- data/lib/approval/models/approval/respond_form/cancel.rb +0 -16
- data/lib/approval/models/approval/respond_form/reject.rb +0 -18
- data/lib/approval/models/approval/respond_form.rb +0 -4
- data/lib/generators/approval/templates/create_approval_comments.rb.tt +0 -14
- data/lib/generators/approval/templates/create_approval_items.rb.tt +0 -17
- data/lib/generators/approval/templates/create_approval_requests.rb.tt +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d170c89efb6ba5bbe4ce8133d3a147c2be3ed08f01565d6b4108a4f2adce5d3b
|
4
|
+
data.tar.gz: e9b81099a7b01e3c43ff49c68d81ac5924189234d6c24fe314726abd736538e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5444fc5b21bff736ea8a1459f24b6e79dac72f88748911fcdc94c464502c59b33691867e6bfa8d79f782ef0fcb297ce888d58295c9a37976371130cea8efec99
|
7
|
+
data.tar.gz: 01fb588b9092d6ed0515ef34e83e0ab545ae8b3ffb529b687909a54e7ed18613f8574d9c85913af5e249a8f2f82e47cd04b398082d83710672d96b7190e0f2c3
|
data/lib/approval/config.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
module Approval
|
2
2
|
class Config
|
3
|
-
attr_accessor
|
4
|
-
|
5
|
-
:comment_maximum,
|
6
|
-
:permit_to_respond_to_own_request,
|
7
|
-
)
|
3
|
+
attr_accessor :user_class_name, :comment_maximum,
|
4
|
+
:permit_to_respond_to_own_request
|
8
5
|
|
9
6
|
def initialize
|
10
7
|
@user_class_name = "User"
|
data/lib/approval/engine.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
+
require "rails"
|
2
|
+
|
1
3
|
module Approval
|
2
4
|
class Engine < ::Rails::Engine
|
3
|
-
|
4
|
-
|
5
|
-
initializer "approval" do
|
5
|
+
initializer "approval.mixins" do
|
6
6
|
ActiveSupport.on_load :active_record do
|
7
|
-
|
8
|
-
ActiveRecord::Base.include ::Approval::Mixins
|
7
|
+
extend ::Approval::Mixins
|
9
8
|
end
|
10
9
|
end
|
11
10
|
|
data/lib/approval/version.rb
CHANGED
data/lib/approval.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Approval
|
2
2
|
def self.config
|
3
|
-
@
|
3
|
+
@config ||= Config.new
|
4
4
|
end
|
5
5
|
|
6
6
|
def self.configure
|
@@ -9,8 +9,11 @@ module Approval
|
|
9
9
|
|
10
10
|
def self.init!
|
11
11
|
user_model = Approval.config.user_class_name.safe_constantize
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
if user_model
|
14
|
+
::Approval::Request.define_user_association
|
15
|
+
::Approval::Comment.define_user_association
|
16
|
+
end
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
@@ -1,45 +1,13 @@
|
|
1
|
-
require "rails/generators"
|
2
|
-
require "rails/generators/active_record"
|
3
|
-
|
4
1
|
module Approval
|
5
|
-
class InstallGenerator <
|
6
|
-
include ::Rails::Generators::Migration
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
7
3
|
source_root File.expand_path("templates", __dir__)
|
8
4
|
|
9
|
-
class << self
|
10
|
-
def next_migration_number(dirname)
|
11
|
-
::ActiveRecord::Generators::Base.next_migration_number(dirname)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
5
|
def create_migration_file
|
16
|
-
|
17
|
-
add_migration_file("create_approval_comments")
|
18
|
-
add_migration_file("create_approval_items")
|
6
|
+
rake "approval_engine:install:migrations"
|
19
7
|
end
|
20
8
|
|
21
9
|
def create_initializer
|
22
|
-
copy_file
|
10
|
+
copy_file "initializer.rb.tt", "config/initializers/approval.rb"
|
23
11
|
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def add_migration_file(template)
|
28
|
-
migration_dir = File.expand_path("db/migrate")
|
29
|
-
|
30
|
-
if self.class.migration_exists?(migration_dir, template)
|
31
|
-
::Kernel.warn "Migration already exists: #{template}"
|
32
|
-
else
|
33
|
-
migration_template("#{template}.rb.tt", "db/migrate/#{template}.rb", migration_version: migration_version)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def migration_version
|
38
|
-
major = ActiveRecord::VERSION::MAJOR
|
39
|
-
|
40
|
-
if major >= 5
|
41
|
-
"[#{major}.#{ActiveRecord::VERSION::MINOR}]"
|
42
|
-
end
|
43
|
-
end
|
44
12
|
end
|
45
13
|
end
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: approval
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshiyuki Hirano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -37,29 +37,10 @@ files:
|
|
37
37
|
- lib/approval.rb
|
38
38
|
- lib/approval/config.rb
|
39
39
|
- lib/approval/engine.rb
|
40
|
-
- lib/approval/mixins.rb
|
41
|
-
- lib/approval/mixins/resource.rb
|
42
|
-
- lib/approval/mixins/user.rb
|
43
|
-
- lib/approval/models/approval/comment.rb
|
44
|
-
- lib/approval/models/approval/item.rb
|
45
|
-
- lib/approval/models/approval/request.rb
|
46
|
-
- lib/approval/models/approval/request_form.rb
|
47
|
-
- lib/approval/models/approval/request_form/base.rb
|
48
|
-
- lib/approval/models/approval/request_form/create.rb
|
49
|
-
- lib/approval/models/approval/request_form/destroy.rb
|
50
|
-
- lib/approval/models/approval/request_form/update.rb
|
51
|
-
- lib/approval/models/approval/respond_form.rb
|
52
|
-
- lib/approval/models/approval/respond_form/approve.rb
|
53
|
-
- lib/approval/models/approval/respond_form/base.rb
|
54
|
-
- lib/approval/models/approval/respond_form/cancel.rb
|
55
|
-
- lib/approval/models/approval/respond_form/reject.rb
|
56
40
|
- lib/approval/version.rb
|
57
41
|
- lib/generators/approval/USAGE
|
58
42
|
- lib/generators/approval/install_generator.rb
|
59
|
-
- lib/generators/approval/templates/
|
60
|
-
- lib/generators/approval/templates/create_approval_items.rb.tt
|
61
|
-
- lib/generators/approval/templates/create_approval_requests.rb.tt
|
62
|
-
- lib/generators/approval/templates/initializer.rb
|
43
|
+
- lib/generators/approval/templates/initializer.rb.tt
|
63
44
|
homepage: https://github.com/yhirano55/approval
|
64
45
|
licenses:
|
65
46
|
- MIT
|
@@ -72,7 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
72
53
|
requirements:
|
73
54
|
- - ">="
|
74
55
|
- !ruby/object:Gem::Version
|
75
|
-
version: 2.2.
|
56
|
+
version: 2.2.2
|
76
57
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
58
|
requirements:
|
78
59
|
- - ">="
|
@@ -80,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
61
|
version: '0'
|
81
62
|
requirements: []
|
82
63
|
rubyforge_project:
|
83
|
-
rubygems_version: 2.6
|
64
|
+
rubygems_version: 2.7.6
|
84
65
|
signing_key:
|
85
66
|
specification_version: 4
|
86
67
|
summary: Approval flow for Rails
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module Mixins
|
3
|
-
module Resource
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
class_attribute :approval_ignore_fields
|
8
|
-
self.approval_ignore_fields = %w[id created_at updated_at]
|
9
|
-
|
10
|
-
has_many :approval_items, class_name: :"Approval::Item", as: :resource
|
11
|
-
end
|
12
|
-
|
13
|
-
class_methods do
|
14
|
-
def assign_ignore_fields(ignore_fields = [])
|
15
|
-
self.approval_ignore_fields = approval_ignore_fields.concat(ignore_fields).map(&:to_s).uniq
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def create_params_for_approval
|
20
|
-
attributes.except(*approval_ignore_fields).compact
|
21
|
-
end
|
22
|
-
|
23
|
-
def update_params_for_approval
|
24
|
-
changes.except(*approval_ignore_fields).each_with_object({}) { |(k, v), h| h[k] = v.last }.compact
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/lib/approval/mixins/user.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module Mixins
|
3
|
-
module User
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
has_many :approval_requests, class_name: :"Approval::Request", foreign_key: :request_user_id
|
8
|
-
has_many :approval_comments, class_name: :"Approval::Comment", foreign_key: :user_id
|
9
|
-
end
|
10
|
-
|
11
|
-
def request_for_create(records, reason:)
|
12
|
-
Approval::RequestForm::Create.new(user: self, reason: reason, records: records)
|
13
|
-
end
|
14
|
-
|
15
|
-
def request_for_update(records, reason:)
|
16
|
-
Approval::RequestForm::Update.new(user: self, reason: reason, records: records)
|
17
|
-
end
|
18
|
-
|
19
|
-
def request_for_destroy(records, reason:)
|
20
|
-
Approval::RequestForm::Destroy.new(user: self, reason: reason, records: records)
|
21
|
-
end
|
22
|
-
|
23
|
-
def cancel_request(request, reason:)
|
24
|
-
Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
|
25
|
-
end
|
26
|
-
|
27
|
-
def approve_request(request, reason:)
|
28
|
-
Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
|
29
|
-
end
|
30
|
-
|
31
|
-
def reject_request(request, reason:)
|
32
|
-
Approval::RespondForm::Reject.new(user: self, reason: reason, request: request)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/approval/mixins.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module Mixins
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
class_methods do
|
6
|
-
def acts_as_approval_resource(ignore_fields: [])
|
7
|
-
include ::Approval::Mixins::Resource
|
8
|
-
assign_ignore_fields(ignore_fields)
|
9
|
-
end
|
10
|
-
|
11
|
-
def acts_as_approval_user
|
12
|
-
include ::Approval::Mixins::User
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
require "approval/mixins/resource"
|
19
|
-
require "approval/mixins/user"
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
class Comment < ::ActiveRecord::Base
|
3
|
-
self.table_name_prefix = "approval_".freeze
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def define_user_association
|
7
|
-
belongs_to :user, class_name: Approval.config.user_class_name
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
belongs_to :request, class_name: :"Approval::Request", inverse_of: :comments
|
12
|
-
|
13
|
-
validates :content, presence: true, length: { maximum: Approval.config.comment_maximum }
|
14
|
-
end
|
15
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
class Item < ::ActiveRecord::Base
|
3
|
-
class UnexistResource < StandardError; end
|
4
|
-
|
5
|
-
EVENTS = %w[create update destroy].freeze
|
6
|
-
|
7
|
-
self.table_name_prefix = "approval_".freeze
|
8
|
-
|
9
|
-
belongs_to :request, class_name: :"Approval::Request", inverse_of: :items
|
10
|
-
belongs_to :resource, polymorphic: true, optional: true
|
11
|
-
|
12
|
-
serialize :params, Hash
|
13
|
-
|
14
|
-
with_options presence: true do
|
15
|
-
validates :resource_id, unless: :create_event?
|
16
|
-
validates :resource_type
|
17
|
-
validates :event, inclusion: { in: EVENTS }
|
18
|
-
validates :params, if: :update_event?
|
19
|
-
end
|
20
|
-
|
21
|
-
validate :ensure_resource_be_valid
|
22
|
-
|
23
|
-
EVENTS.each do |event_name|
|
24
|
-
define_method "#{event_name}_event?" do
|
25
|
-
event_name.to_s == event.to_s
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def apply
|
30
|
-
case event
|
31
|
-
when "create"
|
32
|
-
resource_model.create!(params).tap do |created_resource|
|
33
|
-
update!(resource_id: created_resource.id)
|
34
|
-
end
|
35
|
-
when "update"
|
36
|
-
raise UnexistResource unless resource
|
37
|
-
resource.update!(params)
|
38
|
-
when "destroy"
|
39
|
-
raise UnexistResource unless resource
|
40
|
-
resource.destroy
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def resource_model
|
47
|
-
@_resource_model ||= resource_type.to_s.safe_constantize
|
48
|
-
end
|
49
|
-
|
50
|
-
def ensure_resource_be_valid
|
51
|
-
return if resource_model.nil? || destroy_event?
|
52
|
-
record = if resource_id.present?
|
53
|
-
resource_model.find(resource_id).tap { |m| m.assign_attributes(params) }
|
54
|
-
else
|
55
|
-
resource_model.new(params || {})
|
56
|
-
end
|
57
|
-
|
58
|
-
unless record.valid?
|
59
|
-
errors.add(:base, :invalid)
|
60
|
-
record.errors.full_messages.each do |message|
|
61
|
-
request.errors.add(:base, message)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
class Request < ::ActiveRecord::Base
|
3
|
-
self.table_name_prefix = "approval_".freeze
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def define_user_association
|
7
|
-
with_options class_name: Approval.config.user_class_name do
|
8
|
-
belongs_to :request_user
|
9
|
-
belongs_to :respond_user, optional: true
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
with_options dependent: :destroy, inverse_of: :request do
|
15
|
-
has_many :comments, class_name: "::Approval::Comment"
|
16
|
-
has_many :items, class_name: "::Approval::Item"
|
17
|
-
end
|
18
|
-
|
19
|
-
enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3 }
|
20
|
-
|
21
|
-
scope :recently, -> { order(id: :desc) }
|
22
|
-
|
23
|
-
with_options presence: true do
|
24
|
-
validates :state
|
25
|
-
validates :respond_user, unless: :pending?
|
26
|
-
validates :comments
|
27
|
-
validates :items
|
28
|
-
end
|
29
|
-
|
30
|
-
validates_associated :comments
|
31
|
-
validates_associated :items
|
32
|
-
|
33
|
-
validate :ensure_state_was_pending
|
34
|
-
|
35
|
-
before_create do
|
36
|
-
self.requested_at = Time.current
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def ensure_state_was_pending
|
42
|
-
return unless persisted?
|
43
|
-
errors.add(:base, :already_performed) if state_was != "pending"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RequestForm
|
3
|
-
class Base
|
4
|
-
include ::ActiveModel::Model
|
5
|
-
|
6
|
-
attr_accessor :user, :reason, :records
|
7
|
-
|
8
|
-
def initialize(user:, reason:, records:)
|
9
|
-
@user = user
|
10
|
-
@reason = reason
|
11
|
-
@records = records
|
12
|
-
end
|
13
|
-
|
14
|
-
with_options presence: true do
|
15
|
-
validates :user
|
16
|
-
validates :reason, length: { maximum: Approval.config.comment_maximum }
|
17
|
-
validates :records
|
18
|
-
end
|
19
|
-
|
20
|
-
def save
|
21
|
-
return false unless valid?
|
22
|
-
prepare(&:save)
|
23
|
-
end
|
24
|
-
|
25
|
-
def save!
|
26
|
-
raise ::ActiveRecord::RecordInvalid unless valid?
|
27
|
-
prepare(&:save!)
|
28
|
-
end
|
29
|
-
|
30
|
-
def request
|
31
|
-
@request ||= user.approval_requests.new
|
32
|
-
end
|
33
|
-
|
34
|
-
def error_full_messages
|
35
|
-
[errors, request.errors].flat_map(&:full_messages)
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def prepare
|
41
|
-
raise NotImplementedError, "you must implement #{self.class}##{__method__}"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RequestForm
|
3
|
-
class Create < Base
|
4
|
-
private
|
5
|
-
|
6
|
-
def prepare
|
7
|
-
::Approval::Request.transaction do
|
8
|
-
request.comments.new(user_id: user.id, content: reason)
|
9
|
-
Array(records).each do |record|
|
10
|
-
request.items.new(
|
11
|
-
event: "create",
|
12
|
-
resource_type: record.class.to_s,
|
13
|
-
params: record.create_params_for_approval,
|
14
|
-
)
|
15
|
-
end
|
16
|
-
yield(request)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RequestForm
|
3
|
-
class Destroy < Base
|
4
|
-
private
|
5
|
-
|
6
|
-
def prepare
|
7
|
-
::Approval::Request.transaction do
|
8
|
-
request.comments.new(user_id: user.id, content: reason)
|
9
|
-
Array(records).each do |record|
|
10
|
-
request.items.new(
|
11
|
-
event: "destroy",
|
12
|
-
resource_type: record.class.to_s,
|
13
|
-
resource_id: record.id,
|
14
|
-
)
|
15
|
-
end
|
16
|
-
yield(request)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RequestForm
|
3
|
-
class Update < Base
|
4
|
-
private
|
5
|
-
|
6
|
-
def prepare
|
7
|
-
::Approval::Request.transaction do
|
8
|
-
request.comments.new(user_id: user.id, content: reason)
|
9
|
-
Array(records).each do |record|
|
10
|
-
request.items.new(
|
11
|
-
event: "update",
|
12
|
-
resource_type: record.class.to_s,
|
13
|
-
resource_id: record.id,
|
14
|
-
params: record.update_params_for_approval,
|
15
|
-
)
|
16
|
-
end
|
17
|
-
yield(request)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RespondForm
|
3
|
-
class Approve < Base
|
4
|
-
validate :ensure_user_cannot_respond_to_my_request
|
5
|
-
|
6
|
-
private
|
7
|
-
|
8
|
-
def prepare
|
9
|
-
::Approval::Request.transaction do
|
10
|
-
request.lock!
|
11
|
-
request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
|
12
|
-
request.comments.new(user_id: user.id, content: reason)
|
13
|
-
request.items.each(&:apply)
|
14
|
-
yield(request)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RespondForm
|
3
|
-
class Base
|
4
|
-
include ::ActiveModel::Model
|
5
|
-
|
6
|
-
attr_accessor :user, :reason, :request
|
7
|
-
|
8
|
-
def initialize(user:, reason:, request:)
|
9
|
-
@user = user
|
10
|
-
@reason = reason
|
11
|
-
@request = request
|
12
|
-
end
|
13
|
-
|
14
|
-
with_options presence: true do
|
15
|
-
validates :user
|
16
|
-
validates :reason, length: { maximum: Approval.config.comment_maximum }
|
17
|
-
validates :request
|
18
|
-
end
|
19
|
-
|
20
|
-
def save
|
21
|
-
return false unless valid?
|
22
|
-
prepare(&:save)
|
23
|
-
end
|
24
|
-
|
25
|
-
def save!
|
26
|
-
raise ::ActiveRecord::RecordInvalid unless valid?
|
27
|
-
prepare(&:save!)
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def prepare
|
33
|
-
raise NotImplementedError, "you must implement #{self.class}##{__method__}"
|
34
|
-
end
|
35
|
-
|
36
|
-
def ensure_user_cannot_respond_to_my_request
|
37
|
-
return if Approval.config.permit_to_respond_to_own_request?
|
38
|
-
errors.add(:user, :cannot_respond_to_own_request) if user.try(:id) == request.request_user_id
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RespondForm
|
3
|
-
class Cancel < Base
|
4
|
-
private
|
5
|
-
|
6
|
-
def prepare
|
7
|
-
::Approval::Request.transaction do
|
8
|
-
request.lock!
|
9
|
-
request.assign_attributes(state: :cancelled, cancelled_at: Time.current, respond_user_id: user.id)
|
10
|
-
request.comments.new(user_id: user.id, content: reason)
|
11
|
-
yield(request)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Approval
|
2
|
-
module RespondForm
|
3
|
-
class Reject < Base
|
4
|
-
validate :ensure_user_cannot_respond_to_my_request
|
5
|
-
|
6
|
-
private
|
7
|
-
|
8
|
-
def prepare
|
9
|
-
::Approval::Request.transaction do
|
10
|
-
request.lock!
|
11
|
-
request.assign_attributes(state: :rejected, rejected_at: Time.current, respond_user_id: user.id)
|
12
|
-
request.comments.new(user_id: user.id, content: reason)
|
13
|
-
yield(request)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class CreateApprovalComments < ActiveRecord::Migration<%= migration_version %>
|
2
|
-
def change
|
3
|
-
create_table :approval_comments do |t|
|
4
|
-
t.integer :request_id, null: false
|
5
|
-
t.integer :user_id, null: false
|
6
|
-
t.text :content, null: false
|
7
|
-
|
8
|
-
t.timestamps
|
9
|
-
|
10
|
-
t.index :request_id
|
11
|
-
t.index :user_id
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class CreateApprovalItems < ActiveRecord::Migration<%= migration_version %>
|
2
|
-
def change
|
3
|
-
create_table :approval_items do |t|
|
4
|
-
t.integer :request_id, null: false
|
5
|
-
t.integer :resource_id
|
6
|
-
t.string :resource_type, null: false
|
7
|
-
t.string :event, null: false
|
8
|
-
t.text :params
|
9
|
-
|
10
|
-
t.timestamps
|
11
|
-
|
12
|
-
t.index :request_id
|
13
|
-
end
|
14
|
-
|
15
|
-
add_index :approval_items, [:resource_id, :resource_type]
|
16
|
-
end
|
17
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
class CreateApprovalRequests < ActiveRecord::Migration<%= migration_version %>
|
2
|
-
def change
|
3
|
-
create_table :approval_requests do |t|
|
4
|
-
t.integer :request_user_id, null: false
|
5
|
-
t.integer :respond_user_id
|
6
|
-
t.integer :state, null: false, limit: 1, default: 0
|
7
|
-
t.datetime :requested_at, null: false
|
8
|
-
t.datetime :cancelled_at
|
9
|
-
t.datetime :approved_at
|
10
|
-
t.datetime :rejected_at
|
11
|
-
|
12
|
-
t.timestamps
|
13
|
-
|
14
|
-
t.index :request_user_id
|
15
|
-
t.index :respond_user_id
|
16
|
-
t.index :state
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|