From 37f1b48466c7391fda5d4845d1c14692fa3444f9 Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Tue, 8 Jun 2021 23:09:13 -0400 Subject: [PATCH 1/7] fixed issue with loading processes from memory --- modpol/modpol.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modpol/modpol.lua b/modpol/modpol.lua index 101443b..844c34a 100644 --- a/modpol/modpol.lua +++ b/modpol/modpol.lua @@ -78,9 +78,9 @@ if (modpol.orgs.array) then if type(org) == 'table' then setmetatable(org, modpol.orgs) -- sets process metatable on load - if type(org.processes) == 'table' then - for id, process in ipairs(org.processes) do - setmetatable(process, modpol.modules[process.type]) + for id, process in ipairs(org.processes) do + if type(process) == 'table' then + setmetatable(process, modpol.modules[process.type]) end end end From 189053419534eac410375949909159d3056cb654 Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Tue, 8 Jun 2021 23:09:54 -0400 Subject: [PATCH 2/7] added an actions table to processes, which lists the actions required of each user --- modpol/modules/consent.lua | 7 +++++++ modpol/tests/org_req_test.lua | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index 8c57765..18c3673 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -10,6 +10,7 @@ function temp_consent_process() type = "consent", org_id = nil, request_id = nil, + actions = {}, total_votes = 0, majority_to_pass = 0.51, votes_yes = {}, @@ -27,6 +28,12 @@ function modpol.modules.consent:new_process(request_id, org_id) setmetatable(process, modpol.modules.consent) modpol.ocutil.log('Created new process for request id #' .. request_id) + -- adding new pending action for all users in the org to vote on the request + local process_org = modpol.orgs.get_org(org_id) + for k, member in ipairs(process_org.members) do + process.actions[member] = {'approve'} + end + return process end diff --git a/modpol/tests/org_req_test.lua b/modpol/tests/org_req_test.lua index 000e617..b65c61b 100644 --- a/modpol/tests/org_req_test.lua +++ b/modpol/tests/org_req_test.lua @@ -33,13 +33,14 @@ new_request = { params = {"new_org"} } -request_id = modpol.instance:make_request(new_request) modpol.instance:add_member('luke') modpol.instance:add_member('josh') modpol.instance:add_member('nathan') +request_id = modpol.instance:make_request(new_request) + for id, process in ipairs(modpol.instance.processes) do - process:approve('luke', true) + -- process:approve('luke', true) process:approve('josh', true) end From f616136597feb5b6c833bb517fb6e6f25bbc5998 Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Sun, 13 Jun 2021 14:22:07 -0400 Subject: [PATCH 3/7] moving how pending actions work around, after some testing and discussion. reordered how new processes are created so that they have access to their own ids --- modpol/modules/consent.lua | 13 +++++-------- modpol/orgs/base.lua | 1 + modpol/orgs/requests.lua | 28 ++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index 18c3673..ff02e71 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -8,9 +8,9 @@ modpol.modules.consent.__index = modpol.modules.consent function temp_consent_process() return { type = "consent", + id = nil, org_id = nil, request_id = nil, - actions = {}, total_votes = 0, majority_to_pass = 0.51, votes_yes = {}, @@ -20,23 +20,20 @@ end -- =============================================== -- function to create a new consent process to resolve a pending process -function modpol.modules.consent:new_process(request_id, org_id) +function modpol.modules.consent:new_process(id, request_id, org_id) local process = temp_consent_process() + process.id = id process.request_id = request_id process.org_id = org_id setmetatable(process, modpol.modules.consent) modpol.ocutil.log('Created new process for request id #' .. request_id) - -- adding new pending action for all users in the org to vote on the request - local process_org = modpol.orgs.get_org(org_id) - for k, member in ipairs(process_org.members) do - process.actions[member] = {'approve'} - end - return process end + + -- ========================================= -- function to delete a process, called when process finishes function modpol.modules.consent:delete() diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua index 1a975a6..2b8fbf5 100644 --- a/modpol/orgs/base.lua +++ b/modpol/orgs/base.lua @@ -14,6 +14,7 @@ function temp_org() policies = {}, processes = {}, requests = {}, + pending = {}, members = {}, parent = nil, children = {} diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index 9b405ba..22d0e0b 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -13,10 +13,6 @@ function modpol.orgs:create_process(process_type, request_id) return end - -- retrieving requested module - local module = modpol.modules[process_type] - local new_process = module:new_process(request_id, self.id) - -- linear search for empty process slots (lazy deletion) for k, v in ipairs(self.processes) do if v == 'deleted' then @@ -28,17 +24,33 @@ function modpol.orgs:create_process(process_type, request_id) local index -- attempts to fill empty spots in list, otherwise appends to end if empty_index then - self.processes[empty_index] = new_process index = empty_index else - table.insert(self.processes, new_process) - index = #self.processes + index = #self.processes + 1 end - new_process.id = index + -- retrieving requested module + local module = modpol.modules[process_type] + local new_process = module:new_process(index, request_id, self.id) + + self.processes[index] = new_process + return index end +-- =========================== +-- adds a new pending action to the org's table +function modpol.orgs:add_pending_action(user, process_id, action) + self.pending[user][process_id] = action + + -- pending = { + -- ['lukvmil']={ + -- [1]='approve' + -- } + -- } + +end + -- =========================== -- compares to requests to see if they are identical function modpol.orgs.comp_req(req1, req2) From 2e6c8a5ee3377079b41f12bf0c1b8e76a9d1b39f Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Sun, 13 Jun 2021 14:26:54 -0400 Subject: [PATCH 4/7] added process id to log message --- modpol/modules/consent.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index ff02e71..edab92c 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -27,7 +27,7 @@ function modpol.modules.consent:new_process(id, request_id, org_id) process.org_id = org_id setmetatable(process, modpol.modules.consent) - modpol.ocutil.log('Created new process for request id #' .. request_id) + modpol.ocutil.log('Created new process #' .. id .. ' for request id #' .. request_id) return process end From 295cd983b80bda355c8b4b0325046642d48da121 Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Sun, 13 Jun 2021 15:06:47 -0400 Subject: [PATCH 5/7] added remove pending action function, now called in consent module when pending action is completed --- modpol/modules/consent.lua | 11 ++++++++++- modpol/orgs/requests.lua | 33 +++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index edab92c..cd7aade 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -29,11 +29,17 @@ function modpol.modules.consent:new_process(id, request_id, org_id) setmetatable(process, modpol.modules.consent) modpol.ocutil.log('Created new process #' .. id .. ' for request id #' .. request_id) + -- modpol.orgs.get_org(self.org_id):add_pending_action('luke', self.id, 'approve') + local p_org = modpol.orgs.get_org(org_id) + + for i, member in ipairs(p_org.members) do + p_org:add_pending_action(id, member, 'approve') + end + return process end - -- ========================================= -- function to delete a process, called when process finishes function modpol.modules.consent:delete() @@ -59,6 +65,9 @@ function modpol.modules.consent:approve(user, decision) end self.total_votes = self.total_votes + 1 + + local p_org = modpol.orgs.get_org(self.org_id) + p_org:remove_pending_action(self.id, user, "approve") self:update_status() end diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index 22d0e0b..e9399d0 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -40,17 +40,34 @@ end -- =========================== -- adds a new pending action to the org's table -function modpol.orgs:add_pending_action(user, process_id, action) - self.pending[user][process_id] = action - - -- pending = { - -- ['lukvmil']={ - -- [1]='approve' - -- } - -- } +function modpol.orgs:add_pending_action(process_id, user, action) + -- adds tables if they don't exist already + self.pending[user] = self.pending[user] or {} + self.pending[user][process_id] = self.pending[user][process_id] or {} + -- inserting actual action + table.insert(self.pending[user][process_id], action) + modpol.ocutil.log("Added pending action '" .. action .. "' to " .. user .. " in process #" .. process_id) end +-- ======================== +-- removes a pending action from the org's table +function modpol.orgs:remove_pending_action(process_id, user, action) + if self.pending[user] then + if self.pending[user][process_id] then + for i, a in pairs(self.pending[user][process_id]) do + if a == action then + self.pending[user][process_id][i] = nil + modpol.ocutil.log("Removed pending action '" .. action .. "' from " .. user .. " in process #" .. process_id) + return + end + end + end + end + modpol.ocutil.log("Could not remove pending action '" .. action .. "' from " .. user .. " in process #" .. process_id) +end + + -- =========================== -- compares to requests to see if they are identical function modpol.orgs.comp_req(req1, req2) From 6de2be011f6ae8c03845b37197de4fc0c7dd281c Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Mon, 14 Jun 2021 17:21:13 -0400 Subject: [PATCH 6/7] added a function to wipe all pending actions for dead processes, consent module now does this on close --- modpol/modules/consent.lua | 5 +---- modpol/orgs/requests.lua | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index cd7aade..5d82899 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -44,6 +44,7 @@ end -- function to delete a process, called when process finishes function modpol.modules.consent:delete() local process_org = modpol.orgs.get_org(self.org_id) + process_org:wipe_pending_actions(self.id) process_org.processes[self.id] = "deleted" modpol.ocutil.log('Deleted process #' .. self.id) end @@ -90,8 +91,4 @@ function modpol.modules.consent:update_status() else modpol.ocutil.log('Waiting for more votes...') end -end - -function modpol.modules.consent.pending_processes() - end \ No newline at end of file diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index e9399d0..ae941d1 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -67,6 +67,14 @@ function modpol.orgs:remove_pending_action(process_id, user, action) modpol.ocutil.log("Could not remove pending action '" .. action .. "' from " .. user .. " in process #" .. process_id) end +-- ===================== +-- removes all pending actions for a given process id from all users +function modpol.orgs:wipe_pending_actions(process_id) + for user in pairs(self.pending) do + self.pending[user][process_id] = nil + end + modpol.ocutil.log("Removed all pending actions for process #" .. process_id) +end -- =========================== -- compares to requests to see if they are identical From 12623ee4a2b80341d784607432ece41cc7ce63ab Mon Sep 17 00:00:00 2001 From: Luke Miller <millerluke1364@gmail.com> Date: Mon, 14 Jun 2021 17:32:59 -0400 Subject: [PATCH 7/7] documentation --- modpol/orgs/requests.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index ae941d1..4cd9012 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -53,8 +53,10 @@ end -- ======================== -- removes a pending action from the org's table function modpol.orgs:remove_pending_action(process_id, user, action) + -- cautiously checks if pending action exists before removing it if self.pending[user] then if self.pending[user][process_id] then + -- searching for action to remove for i, a in pairs(self.pending[user][process_id]) do if a == action then self.pending[user][process_id][i] = nil