dcidev_approval 0.0.2
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 +7 -0
- data/README.md +1 -0
- data/lib/dcidev_approval.rb +158 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b89d5bed50149b2067004980c70e15f4a4dd63eb4af17c18bbcb1f9a40fe592e
|
4
|
+
data.tar.gz: 4fd39a2c3f38e2635c40035d4d2dcd07f524e74a742f3ca4018153edab7cb4cb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a4f1bf7253a23ed2b65a839d3f572f148430fc561c1eec01496cf83ec05d0f2056310c470bbd56fdd044faefe8c263b8704377ffc9be84c431140f7be24abf0c
|
7
|
+
data.tar.gz: f9d5add77f39eb625a564eddf8c33a6a9977ed2ec3f913fa7712527fe9f051c74bafbbaa5b76e266850b076fb6f95e1a98e50bcedb3d1ff8042553f11b573d7a
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
dcidev_approval
|
@@ -0,0 +1,158 @@
|
|
1
|
+
module DcidevApproval
|
2
|
+
def self.included base
|
3
|
+
base.send :include, InstanceMethods
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module InstanceMethods
|
8
|
+
|
9
|
+
def changes_present?(changes)
|
10
|
+
present = false
|
11
|
+
changes.each do |k, v|
|
12
|
+
begin
|
13
|
+
if eval("self.#{k}") != v
|
14
|
+
present = true
|
15
|
+
break
|
16
|
+
end
|
17
|
+
rescue => _
|
18
|
+
end
|
19
|
+
end
|
20
|
+
return present
|
21
|
+
end
|
22
|
+
|
23
|
+
def waiting_approval?
|
24
|
+
%w[pending_update pending_delete].include?(self.change_status) || self.status == "waiting"
|
25
|
+
end
|
26
|
+
|
27
|
+
def pending_insert?
|
28
|
+
self.change_status.nil? && %w[waiting rejected].include?(self.status)
|
29
|
+
end
|
30
|
+
|
31
|
+
def pending_update?
|
32
|
+
self.change_status == "pending_update"
|
33
|
+
end
|
34
|
+
|
35
|
+
def pending_delete?
|
36
|
+
self.change_status == "pending_delete"
|
37
|
+
end
|
38
|
+
|
39
|
+
def last_modified_by
|
40
|
+
# p self.audit_trail
|
41
|
+
if self.try(:change_status).present? && self.try(:change_status) == 'pending_delete'
|
42
|
+
log = self.activity_logs.where("activity LIKE '%delete%'").limit(1).order(created_at: :desc).try(:first)
|
43
|
+
else
|
44
|
+
log = self.activity_logs.where("activity LIKE '%edit%'").limit(1).order(created_at: :desc).try(:first)
|
45
|
+
end
|
46
|
+
{
|
47
|
+
modified_by: log.present? ? log.try(:agent).try(:name).to_s + " (#{log.try(:agent).try(:username).to_s}[#{log.try(:agent).try(:roles).try(:first).try(:name)}])" : nil,
|
48
|
+
modified_at: log.present? ? log.try(:created_at) || self.try(:updated_at) || self.try(:created_at) : nil
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def created_by
|
53
|
+
log = self.activity_logs.try(:first)
|
54
|
+
{
|
55
|
+
created_by: log.present? && log.try(:agent).try(:name).present? ? log.try(:agent).try(:name).to_s + " (#{log.try(:agent).try(:username).to_s}[#{log.try(:agent).try(:roles).try(:first).try(:name)}])" : "System",
|
56
|
+
created_at: self.try(:created_at) || log.try(:created_at)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def last_approved_by
|
61
|
+
last_approve = self.activity_logs.where("activity LIKE '%approv%'").limit(1).order(created_at: :desc).try(:first)
|
62
|
+
last_entry = self.activity_logs.last
|
63
|
+
{
|
64
|
+
approved_by: last_approve.try(:id) == last_entry.try(:id) ? last_approve.try(:agent).try(:name) : nil,
|
65
|
+
approved_at: last_approve.try(:id) == last_entry.try(:id) ? last_approve.try(:created_at) : nil
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def approve_changes(params, agent, request)
|
70
|
+
|
71
|
+
if self.change_status.nil? && %w[waiting rejected].include?(self.status)
|
72
|
+
raise self.errors.full_messages.join(", ") unless self.update(status: :approved, data_changes: nil, change_status: nil)
|
73
|
+
# ActivityLog.write("Approve insert to #{self.class.to_s}", request, agent, menu, self) if params.log
|
74
|
+
# self.delay(queue: "reorder_#{self.id}", priority: 0).reorder if self.class.column_names.include?("view_order")
|
75
|
+
|
76
|
+
end
|
77
|
+
if self.change_status == "pending_update"
|
78
|
+
raise self.errors.full_messages.join(", ") unless self.update_by_params(self.data_changes, false)
|
79
|
+
raise self.errors.full_messages.join(", ") unless self.update(status: :approved, data_changes: nil, change_status: nil)
|
80
|
+
# ActivityLog.write("Approve update to #{self.class.to_s}", request, agent, menu, self) if params.log
|
81
|
+
# self.delay(queue: "reorder_#{self.id}", priority: 0).reorder if self.class.column_names.include?("view_order")
|
82
|
+
|
83
|
+
elsif self.change_status == "pending_delete"
|
84
|
+
raise self.errors.full_messages.join(", ") unless self.update(change_status: nil, data_changes: nil)
|
85
|
+
ActiveRecord::Base.transaction do
|
86
|
+
# ActivityLog.write("Approve delete to #{self.class.to_s}", request, agent, menu, self) if params.log
|
87
|
+
self.try(:destroy)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def delete_changes(params, agent, request)
|
93
|
+
# return unless %w[pending_update pending_delete].include? self.change_status
|
94
|
+
raise self.errors.full_messages.join(", ") unless self.update(data_changes: nil, change_status: nil, status: self.status == "waiting" ? :rejected : :approved)
|
95
|
+
# ActivityLog.write("Reject changes to #{self.class.to_s}", request, agent, menu, self) if params.log
|
96
|
+
end
|
97
|
+
|
98
|
+
def edit_data(params, agent, request, bypass = true, &block)
|
99
|
+
raise "data still waiting for approval" if self.waiting_approval?
|
100
|
+
if bypass
|
101
|
+
raise self.errors.full_messages.join(", ") unless self.update_by_params(params, false)
|
102
|
+
# ActivityLog.write("Edit #{self.class.to_s}", request, agent, menu, self) if params.log
|
103
|
+
else
|
104
|
+
if self.changes_present?(params)
|
105
|
+
ActiveRecord::Base.transaction do
|
106
|
+
data = (agent.is_admin? || self.status == "waiting") ? params : { change_status: :pending_update, data_changes: agent.is_admin? ? nil : params }
|
107
|
+
raise self.errors.full_messages.join(", ") unless self.update_by_params(data, false)
|
108
|
+
end
|
109
|
+
# ActivityLog.write("#{agent.is_admin? ? nil : "Request "}Edit #{self.class.to_s}", request, agent, menu, self) if params.log
|
110
|
+
end
|
111
|
+
end
|
112
|
+
yield true
|
113
|
+
end
|
114
|
+
|
115
|
+
def approval(params, agent, request)
|
116
|
+
if params.status == "approved"
|
117
|
+
self.approve_changes(params, agent, request)
|
118
|
+
elsif params.status == "rejected"
|
119
|
+
self.delete_changes(params, agent, request)
|
120
|
+
end
|
121
|
+
yield true
|
122
|
+
end
|
123
|
+
|
124
|
+
def delete_data(params, agent, request, bypass = true)
|
125
|
+
raise "data still waiting for approval" if self.waiting_approval?
|
126
|
+
if bypass || agent.is_admin?
|
127
|
+
ActiveRecord::Base.transaction do
|
128
|
+
# ActivityLog.write("Delete #{self.class.to_s}", request, agent, menu, self) if params.log
|
129
|
+
raise self.errors.full_messages.join(", ") unless self.destroy
|
130
|
+
end
|
131
|
+
else
|
132
|
+
raise self.errors.full_messages.join(", ") unless self.update(change_status: :pending_delete)
|
133
|
+
# ActivityLog.write("Request Delete #{self.class.to_s}", request, agent, menu, self) if params.log
|
134
|
+
end
|
135
|
+
yield true
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
module ClassMethods
|
140
|
+
def create_data(params, agent, request, bypass = true)
|
141
|
+
if bypass
|
142
|
+
ActiveRecord::Base.transaction do
|
143
|
+
data = params.merge!({ status: :approved })
|
144
|
+
d = self.new_from_params(data)
|
145
|
+
raise d.errors.full_messages.join(", ") unless d.save
|
146
|
+
# ActivityLog.write("#{agent.is_admin? ? nil : "Request "} Add #{self.to_s}", request, agent, menu, d) if params.log
|
147
|
+
end
|
148
|
+
else
|
149
|
+
d = self.new_from_params(params)
|
150
|
+
d.status = agent.is_admin? ? :approved : :waiting
|
151
|
+
raise d.errors.full_messages.join(", ") unless d.save
|
152
|
+
# ActivityLog.write("Add #{self.to_s}", request, agent, menu, d) if params.log
|
153
|
+
end
|
154
|
+
yield d
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dcidev_approval
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Punto Damar P
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-01-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dcidev_active_record
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Testing phase
|
28
|
+
email:
|
29
|
+
- punto@privyid.tech
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- lib/dcidev_approval.rb
|
36
|
+
homepage:
|
37
|
+
licenses: []
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.0.6
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: Logic for implementing record changes approval
|
58
|
+
test_files: []
|