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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/lib/dcidev_approval.rb +158 -0
  4. 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: []