From 201fb98229491fbe0cb2303d243282e1b75371d6 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Mon, 26 Apr 2021 01:06:44 -0400 Subject: [PATCH 01/19] beginning to reimplement policy code --- modpol/orgs/orgs.lua | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index 43ba3cc..fb0170d 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -275,6 +275,42 @@ function modpol.orgs:list_member() return str end +-- ==================================== +-- adds a new policy to the policy table +-- must define the policy type, process associated with it, and whether the request must be made by an org member +function modpol.orgs:set_policy(policy_type, process, must_be_member) + local new_policy = { + process = process, + must_be_member = must_be_member + } + self.policies[policy_type] = policy +end + + +-- ================================ +-- +function modpol.orgs:create_process(request_id) + local new_process = { + object = "I am a process", + request_id = request_id + } + + -- linear search for empty process slots (lazy deletion) + for k, v in ipairs(self.processes) do + if v == 'deleted' then + local empty_index = k + break + do + end + + -- attempts to fill empty spots in list, otherwise appends to end + if empty_index then + self.processes[index] = new_process + else + table.insert(self.processes, new_process) + end +end + -- =========================== -- compares to requests to see if they are identical function modpol.orgs.comp_req(req1, req2) @@ -303,7 +339,8 @@ function modpol.orgs:make_request(request) modpol.ocutil.log("Error: request type is invalid") return false end - + + -- num_params should equal zero at the end if request.params matches the num of params for that type for k, v in ipairs(request.params) do num_params = num_params - 1 end @@ -321,6 +358,11 @@ function modpol.orgs:make_request(request) end end + local requested_policy = self.policies[request.type] + if requested_policy then + + end + -- use lazy deletion here, not very clean -- table.insert(self.requests, request) self.request_count = self.request_count + 1 From 37c7f337a74995ead23d99c13877aa8464730bc5 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Mon, 26 Apr 2021 16:35:42 -0400 Subject: [PATCH 02/19] added lazy deletion for requests, bug fix for processes --- modpol/orgs/orgs.lua | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index fb0170d..e320981 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -14,7 +14,6 @@ function temp_org() policies = {}, processes = {}, requests = {}, - request_count = 0, members = {}, parent = nil, children = {} @@ -288,7 +287,7 @@ end -- ================================ --- +-- creates a new process linked to a request id function modpol.orgs:create_process(request_id) local new_process = { object = "I am a process", @@ -305,7 +304,7 @@ function modpol.orgs:create_process(request_id) -- attempts to fill empty spots in list, otherwise appends to end if empty_index then - self.processes[index] = new_process + self.processes[empty_index] = new_process else table.insert(self.processes, new_process) end @@ -369,4 +368,23 @@ function modpol.orgs:make_request(request) self.requests[self.request_count] = request return self.request_count + -- linear search for empty process slots (lazy deletion) + for k, v in ipairs(self.requests) do + if v == 'deleted' then + local empty_index = k + break + do + end + + -- attempts to fill empty spots in list, otherwise appends to end + if empty_index then + self.requests[empty_index] = request + return empty_index + else + table.insert(self.requests, request) + -- finds end of list to return current request's id + local count = 0 + for k, v in ipairs(t) do count = count + 1 end + return count + end end \ No newline at end of file From 83b158eb3c57b1867578048d7f7bc58d0b86411d Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Mon, 26 Apr 2021 16:46:43 -0400 Subject: [PATCH 03/19] fixed early end statement in make_request --- modpol/orgs/orgs.lua | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index e320981..d376dea 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -299,7 +299,7 @@ function modpol.orgs:create_process(request_id) if v == 'deleted' then local empty_index = k break - do + end end -- attempts to fill empty spots in list, otherwise appends to end @@ -358,22 +358,16 @@ function modpol.orgs:make_request(request) end local requested_policy = self.policies[request.type] - if requested_policy then + -- if requested_policy then - end - - -- use lazy deletion here, not very clean - -- table.insert(self.requests, request) - self.request_count = self.request_count + 1 - self.requests[self.request_count] = request - return self.request_count + -- end -- linear search for empty process slots (lazy deletion) for k, v in ipairs(self.requests) do if v == 'deleted' then local empty_index = k break - do + end end -- attempts to fill empty spots in list, otherwise appends to end @@ -384,7 +378,9 @@ function modpol.orgs:make_request(request) table.insert(self.requests, request) -- finds end of list to return current request's id local count = 0 - for k, v in ipairs(t) do count = count + 1 end + for k, v in ipairs(t) do + count = count + 1 + end return count end end \ No newline at end of file From 018638471175d07b6add8ef2ff6718cb6759ccf2 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Tue, 27 Apr 2021 00:48:31 -0400 Subject: [PATCH 04/19] make_request now checks policy table, however set_policy function currently not working --- modpol/orgs/orgs.lua | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index d376dea..3b21f8b 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -357,10 +357,14 @@ function modpol.orgs:make_request(request) end end + -- checking to see if user is able to make request local requested_policy = self.policies[request.type] - -- if requested_policy then - - -- end + if requested_policy then + if requested_policy.must_be_member and not self:has_member(request.user) then + modpol.ocutil.log("Error: user must be org member to make this request") + return false + end + end -- linear search for empty process slots (lazy deletion) for k, v in ipairs(self.requests) do @@ -371,16 +375,20 @@ function modpol.orgs:make_request(request) end -- attempts to fill empty spots in list, otherwise appends to end + local request_id = nil if empty_index then self.requests[empty_index] = request - return empty_index + request_id = empty_index else table.insert(self.requests, request) -- finds end of list to return current request's id local count = 0 - for k, v in ipairs(t) do + for k, v in ipairs(self.requests) do count = count + 1 end - return count + request_id = count end + modpol.ocutil.log("Request made") + + return request_id end \ No newline at end of file From 919e7524d2ef60de15d555bf13479a2f90e3307e Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Tue, 27 Apr 2021 01:00:49 -0400 Subject: [PATCH 05/19] starting to add some test cases --- modpol/tests/org_basic_test.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 modpol/tests/org_basic_test.lua diff --git a/modpol/tests/org_basic_test.lua b/modpol/tests/org_basic_test.lua new file mode 100644 index 0000000..96e112d --- /dev/null +++ b/modpol/tests/org_basic_test.lua @@ -0,0 +1,10 @@ +dofile("../modpol.lua") + +print('\nRemoving existing orgs') +modpol.orgs.reset() + +print('\nCreating an org called "test_org"') +test_org = modpol.instance:add_org('test_org') + +print('\nTrying to create an org with the same name') +duplicate = modpol.instance:add_org('test_org') \ No newline at end of file From f09b6845c2c37b42f69eca8dd97626f4e438ab45 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Tue, 27 Apr 2021 13:41:51 -0400 Subject: [PATCH 06/19] fixed bug where orgs.reset() would break the orgs.array list --- modpol/orgs/orgs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index 3b21f8b..dfb4171 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -78,7 +78,7 @@ end function modpol.orgs.reset() for id, org in ipairs(modpol.orgs.array) do if id > 1 then - modpol.orgs.array[id] = nil + modpol.orgs.array[id] = "removed" end end From 58458efd8e9fdfa1bf3eb0a03e94f25f7b8d53c5 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Tue, 27 Apr 2021 14:04:25 -0400 Subject: [PATCH 07/19] added more information to error messages --- modpol/orgs/orgs.lua | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index dfb4171..507210b 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -91,7 +91,7 @@ end function modpol.orgs.init_instance() local error_msg if modpol.orgs.array[1] then - modpol.ocutil.log('Error: instance has already been initialized') + modpol.ocutil.log('Error in orgs.init_instance -> instance has already been initialized') return false end @@ -126,14 +126,14 @@ function modpol.orgs:record(msg, entry_type) if type(msg) == 'string' and not(modpol.ocutil.str_empty(msg)) then entry.action_msg = msg else - modpol.ocutil.log('Error: msg must be a non empty string') + modpol.ocutil.log('Error in ' .. self.name .. ':record -> msg must be a non empty string') return false end if type(entry_type) == 'string' and not(modpol.ocutil.str_empty(entry_type)) then entry.entry_type = entry_type else - modpol.ocutil.log('Error: entry_type must be a non empty string') + modpol.ocutil.log('Error in ' .. self.name .. ':record -> entry_type must be a non empty string') print(msg, entry_type) return false end @@ -151,17 +151,17 @@ end -- ex: instance:add_org('town hall') function modpol.orgs:add_org(name) if self.id == nil then - modpol.ocutil.log('Error: add_org can only be called by another org') + modpol.ocutil.log('Error in ' .. self.name .. ':add_org -> add_org can only be called by another org') return false end if modpol.ocutil.str_empty(name) then - modpol.ocutil.log('Error: org name is required') + modpol.ocutil.log('Error in ' .. self.name .. ':add_org -> org name is required') return false end if modpol.orgs.get_org(name) then - modpol.ocutil.log('Error: org name is already being used') + modpol.ocutil.log('Error in ' .. self.name .. ':add_org -> org name is already being used') return false end @@ -192,7 +192,7 @@ end -- note: "reason" param was removed, can be added back function modpol.orgs:delete() if self.id == 1 then - modpol.ocutil.log('Error: cannot delete instance') + modpol.ocutil.log('Error in ' .. self.name .. ':delete -> cannot delete instance') return false end @@ -335,7 +335,7 @@ function modpol.orgs:make_request(request) local num_params = modpol.orgs.request_params[request.type] if num_params == nil then - modpol.ocutil.log("Error: request type is invalid") + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request type is invalid') return false end @@ -345,14 +345,14 @@ function modpol.orgs:make_request(request) end if num_params ~= 0 then - modpol.ocutil.log("Error: request has invalid number of parameters") + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request has invalid number of parameters') return false end -- checking to see if identical request already exists for k, v in ipairs(self.requests) do if self.comp_req(request, v) == true then - modpol.ocutil.log("Error: request has already been made") + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request has already been made') return false end end @@ -361,7 +361,7 @@ function modpol.orgs:make_request(request) local requested_policy = self.policies[request.type] if requested_policy then if requested_policy.must_be_member and not self:has_member(request.user) then - modpol.ocutil.log("Error: user must be org member to make this request") + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> user must be org member to make this request') return false end end From 3348dcfe192a18c41b80f13789877666a8b13584 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Wed, 28 Apr 2021 00:45:39 -0400 Subject: [PATCH 08/19] added duplicate user error in add_member --- modpol/orgs/orgs.lua | 6 ++++++ modpol/tests/org_basic_test.lua | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index 507210b..e22cbc1 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -225,6 +225,12 @@ end -- =========================================== -- adds a user to an org function modpol.orgs:add_member(user) + for id, name in ipairs(self.members) do + if user == name then + modpol.ocutil.log('Error in' .. self.name .. ':add_member -> user already in org') + return false + end + end -- trys to fill in empty spots first local empty_index = self:get_member_index('') if empty_index then diff --git a/modpol/tests/org_basic_test.lua b/modpol/tests/org_basic_test.lua index 96e112d..f6762c2 100644 --- a/modpol/tests/org_basic_test.lua +++ b/modpol/tests/org_basic_test.lua @@ -7,4 +7,17 @@ print('\nCreating an org called "test_org"') test_org = modpol.instance:add_org('test_org') print('\nTrying to create an org with the same name') -duplicate = modpol.instance:add_org('test_org') \ No newline at end of file +duplicate = modpol.instance:add_org('test_org') + +print('\nAdding user "luke" to test_org') +test_org:add_member('luke') + +print('\nTrying to add duplicate user to test_org') +test_org:add_member('luke') + +print('\nRemoving user "luke" from test_org') +test_org:remove_member('luke') + +print('\nTrying to remove user "luke" from empty member list') +test_org:remove_member('luke') + From c975f114b3335ab3a41aa4d94f72be7c55c3fe6f Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sun, 2 May 2021 10:40:10 -0400 Subject: [PATCH 09/19] added more success/error messages --- modpol/orgs/orgs.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/orgs.lua index e22cbc1..650a194 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/orgs.lua @@ -82,6 +82,7 @@ function modpol.orgs.reset() end end + modpol.ocutil.log('Reset all orgs') modpol.orgs:record('Resetting all orgs', 'org_reset') end @@ -104,6 +105,7 @@ function modpol.orgs.init_instance() -- adding instance to org list modpol.orgs.array[1] = instance + modpol.ocutil.log('Initialized the instance org') modpol.orgs:record('Initialized the instance org', 'create_instance') return instance @@ -181,7 +183,7 @@ function modpol.orgs:add_org(name) modpol.orgs.array[child_org.id] = child_org self:record('created sub org ' .. name, 'add_org') - modpol.ocutil.log('Created sub org ' .. name) + modpol.ocutil.log('Created ' .. name .. ' (suborg of ' .. self.name .. ')') return child_org end @@ -205,7 +207,7 @@ function modpol.orgs:delete() end modpol.orgs.array[self.id] = 'removed' - modpol.ocutil.log('Removed ' .. self.name .. ': ' .. self.id) + modpol.ocutil.log('Deleted org ' .. self.name .. ': ' .. self.id) self:record('Deleted ' .. self.name .. ' and all child orgs', 'del_org') @@ -227,7 +229,7 @@ end function modpol.orgs:add_member(user) for id, name in ipairs(self.members) do if user == name then - modpol.ocutil.log('Error in' .. self.name .. ':add_member -> user already in org') + modpol.ocutil.log('Error in ' .. self.name .. ':add_member -> user already in org') return false end end @@ -239,6 +241,8 @@ function modpol.orgs:add_member(user) -- adds to end if no empty spots table.insert(self.members, user) end + + modpol.ocutil.log('Added member ' .. user .. ' to ' .. self.name) self:record('Added member ' .. user, 'add_member') end @@ -251,7 +255,10 @@ function modpol.orgs:remove_member(user) user_index = self:get_member_index(user) if user_index then self.members[user_index] = '' + else + modpol.ocutil.log('Error in ' .. self.name .. ':remove_member -> user not in org') end + modpol.ocutil.log('Removed member ' .. user .. ' from ' .. self.name) self:record('Removed member ' .. user, 'del_member') end From 10f6adc5446ca8b007a19ddd1a7a535a8233d91c Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sun, 2 May 2021 22:38:27 -0400 Subject: [PATCH 10/19] split up orgs file --- modpol/api.lua | 3 +- modpol/orgs/{orgs.lua => base.lua} | 113 ----------------------------- modpol/orgs/requests.lua | 113 +++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 114 deletions(-) rename modpol/orgs/{orgs.lua => base.lua} (70%) create mode 100644 modpol/orgs/requests.lua diff --git a/modpol/api.lua b/modpol/api.lua index d2be724..41b34d6 100644 --- a/modpol/api.lua +++ b/modpol/api.lua @@ -6,7 +6,8 @@ local localdir = modpol.topdir dofile (localdir .. "/users/users.lua") --orgs -dofile (localdir .. "/orgs/orgs.lua") +dofile (localdir .. "/orgs/base.lua") +dofile (localdir .. "/orgs/requests.lua") --interactions dofile (localdir .. "/interactions/interactions.lua") diff --git a/modpol/orgs/orgs.lua b/modpol/orgs/base.lua similarity index 70% rename from modpol/orgs/orgs.lua rename to modpol/orgs/base.lua index 650a194..7fc1f30 100644 --- a/modpol/orgs/orgs.lua +++ b/modpol/orgs/base.lua @@ -20,13 +20,6 @@ function temp_org() } end -modpol.orgs.request_params = { - add_org = 1, - delete = 0, - add_member = 1, - remove_member = 1 -} - -- ================================================== -- returns org when given its id or name function modpol.orgs.get_org(arg) @@ -299,109 +292,3 @@ function modpol.orgs:set_policy(policy_type, process, must_be_member) end --- ================================ --- creates a new process linked to a request id -function modpol.orgs:create_process(request_id) - local new_process = { - object = "I am a process", - request_id = request_id - } - - -- linear search for empty process slots (lazy deletion) - for k, v in ipairs(self.processes) do - if v == 'deleted' then - local empty_index = k - break - end - end - - -- attempts to fill empty spots in list, otherwise appends to end - if empty_index then - self.processes[empty_index] = new_process - else - table.insert(self.processes, new_process) - end -end - --- =========================== --- compares to requests to see if they are identical -function modpol.orgs.comp_req(req1, req2) - -- compares request type - if req1.type ~= req2.type then - return false - else - -- comparing parameters - -- we can assume the number of params is the same as this is checked in the make_request func - for k, v in ipairs(req1.params) do - if v ~= req2.params[k] then - return false - end - end - end - return true -end - --- ================================ --- tries to make a request to the org -function modpol.orgs:make_request(request) - -- makes sure the request has the valid number of parameters - local num_params = modpol.orgs.request_params[request.type] - - if num_params == nil then - modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request type is invalid') - return false - end - - -- num_params should equal zero at the end if request.params matches the num of params for that type - for k, v in ipairs(request.params) do - num_params = num_params - 1 - end - - if num_params ~= 0 then - modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request has invalid number of parameters') - return false - end - - -- checking to see if identical request already exists - for k, v in ipairs(self.requests) do - if self.comp_req(request, v) == true then - modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request has already been made') - return false - end - end - - -- checking to see if user is able to make request - local requested_policy = self.policies[request.type] - if requested_policy then - if requested_policy.must_be_member and not self:has_member(request.user) then - modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> user must be org member to make this request') - return false - end - end - - -- linear search for empty process slots (lazy deletion) - for k, v in ipairs(self.requests) do - if v == 'deleted' then - local empty_index = k - break - end - end - - -- attempts to fill empty spots in list, otherwise appends to end - local request_id = nil - if empty_index then - self.requests[empty_index] = request - request_id = empty_index - else - table.insert(self.requests, request) - -- finds end of list to return current request's id - local count = 0 - for k, v in ipairs(self.requests) do - count = count + 1 - end - request_id = count - end - modpol.ocutil.log("Request made") - - return request_id -end \ No newline at end of file diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua new file mode 100644 index 0000000..322e3ec --- /dev/null +++ b/modpol/orgs/requests.lua @@ -0,0 +1,113 @@ +modpol.orgs.request_params = { + add_org = 1, + delete = 0, + add_member = 1, + remove_member = 1 +} + +-- ================================ +-- creates a new process linked to a request id +function modpol.orgs:create_process(request_id) + local new_process = { + object = "I am a process", + request_id = request_id + } + + -- linear search for empty process slots (lazy deletion) + for k, v in ipairs(self.processes) do + if v == 'deleted' then + local empty_index = k + break + end + end + + -- attempts to fill empty spots in list, otherwise appends to end + if empty_index then + self.processes[empty_index] = new_process + else + table.insert(self.processes, new_process) + end +end + +-- =========================== +-- compares to requests to see if they are identical +function modpol.orgs.comp_req(req1, req2) + -- compares request type + if req1.type ~= req2.type then + return false + else + -- comparing parameters + -- we can assume the number of params is the same as this is checked in the make_request func + for k, v in ipairs(req1.params) do + if v ~= req2.params[k] then + return false + end + end + end + return true +end + +-- ================================ +-- tries to make a request to the org +function modpol.orgs:make_request(request) + -- makes sure the request has the valid number of parameters + local num_params = modpol.orgs.request_params[request.type] + + if num_params == nil then + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request type is invalid') + return false + end + + -- num_params should equal zero at the end if request.params matches the num of params for that type + for k, v in ipairs(request.params) do + num_params = num_params - 1 + end + + if num_params ~= 0 then + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request has invalid number of parameters') + return false + end + + -- checking to see if identical request already exists + for k, v in ipairs(self.requests) do + if self.comp_req(request, v) == true then + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> request has already been made') + return false + end + end + + -- checking to see if user is able to make request + local requested_policy = self.policies[request.type] + if requested_policy then + if requested_policy.must_be_member and not self:has_member(request.user) then + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> user must be org member to make this request') + return false + end + end + + -- linear search for empty process slots (lazy deletion) + for k, v in ipairs(self.requests) do + if v == 'deleted' then + local empty_index = k + break + end + end + + -- attempts to fill empty spots in list, otherwise appends to end + local request_id = nil + if empty_index then + self.requests[empty_index] = request + request_id = empty_index + else + table.insert(self.requests, request) + -- finds end of list to return current request's id + local count = 0 + for k, v in ipairs(self.requests) do + count = count + 1 + end + request_id = count + end + modpol.ocutil.log("Request made") + + return request_id +end \ No newline at end of file From 358aacba0ad3f08b68e6968f5daf06bea70e60a5 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sun, 2 May 2021 23:18:03 -0400 Subject: [PATCH 11/19] small fixes in requests system, working towards process support --- modpol/modules/consent.lua | 0 modpol/modules/defer_to.lua | 0 modpol/orgs/base.lua | 3 ++- modpol/orgs/requests.lua | 35 +++++++++++++++++++++++++++++++---- modpol/tests/org_req_test.lua | 19 +++++++++++++++++++ 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 modpol/modules/consent.lua create mode 100644 modpol/modules/defer_to.lua create mode 100644 modpol/tests/org_req_test.lua diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua new file mode 100644 index 0000000..e69de29 diff --git a/modpol/modules/defer_to.lua b/modpol/modules/defer_to.lua new file mode 100644 index 0000000..e69de29 diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua index 7fc1f30..37315ad 100644 --- a/modpol/orgs/base.lua +++ b/modpol/orgs/base.lua @@ -288,7 +288,8 @@ function modpol.orgs:set_policy(policy_type, process, must_be_member) process = process, must_be_member = must_be_member } - self.policies[policy_type] = policy + self.policies[policy_type] = new_policy + modpol.ocutil.log('Added policy for ' .. policy_type .. ' in ' .. self.name) end diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index 322e3ec..39c07ab 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -47,6 +47,20 @@ function modpol.orgs.comp_req(req1, req2) return true end +-- =============================== +-- returns string of all active requests +function modpol.orgs:list_request() + local str + for id, req in ipairs(self.requests) do + if str then + str = str .. '\n' .. req.type .. ' (' .. req.user .. ') ' + else + str = req.type .. ' (' .. req.user .. ') ' + end + end + return str +end + -- ================================ -- tries to make a request to the org function modpol.orgs:make_request(request) @@ -78,13 +92,25 @@ function modpol.orgs:make_request(request) -- checking to see if user is able to make request local requested_policy = self.policies[request.type] - if requested_policy then - if requested_policy.must_be_member and not self:has_member(request.user) then - modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> user must be org member to make this request') + local parent_policy = modpol.orgs.get_org(self.parent).policies[request.type] + + -- tries to use org's policy table, defers to parent otherwise + if not requested_policy then + modpol.ocutil.log(request.type .. 'policy not found, deferring to parent org') + requested_policy = parent_policy + + if not parent_policy then + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> parent policy undefined') return false end end + -- make sure user is allowed to make request + if requested_policy.must_be_member and not self:has_member(request.user) then + modpol.ocutil.log('Error in ' .. self.name .. ':make_request -> user must be org member to make this request') + return false + end + -- linear search for empty process slots (lazy deletion) for k, v in ipairs(self.requests) do if v == 'deleted' then @@ -110,4 +136,5 @@ function modpol.orgs:make_request(request) modpol.ocutil.log("Request made") return request_id -end \ No newline at end of file +end + diff --git a/modpol/tests/org_req_test.lua b/modpol/tests/org_req_test.lua new file mode 100644 index 0000000..17875b3 --- /dev/null +++ b/modpol/tests/org_req_test.lua @@ -0,0 +1,19 @@ +dofile('../modpol.lua'); + +modpol.orgs.reset() + +test_org = modpol.instance:add_org('test_org') + +test_org:set_policy("add_member", nil, false); + +new_request = { + user = "lukvmil", + type = "add_member", + params = {"lukvmil"} +} + +request_id = test_org:make_request(new_request) +request_id = test_org:make_request(new_request) + +print(test_org:list_request()) +test_org:create_process(request_id) \ No newline at end of file From 68d8da7290fa5a6d06f9d58bb8886eaba7cdbf5e Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sun, 2 May 2021 23:34:05 -0400 Subject: [PATCH 12/19] drafting consent module --- modpol/modules/consent.lua | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index e69de29..bfbad19 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -0,0 +1,37 @@ +rough_idea = { -- a lot of these might want to call org functions instead of being hard coded + type = "consent", + org_id = 5, -- may be needed for defer_to, process sent to a diff org + request_id = 1, -- callback to request + total_votes = 2, + to_pass = 3, -- could default to majority, but could set super majority + eligible_voters = 5, + timeout = 234235325, -- timestamp when vote ends + votes_yes = { + "lukvmil" + }, + votes_no = { + "nathan" + } +} + +function modules.consent.cast_vote(user, decision, org_id, process_id) + local org = modpol.orgs.get_org(org_id) + local process = org:get_process(process_id) + if decision == "yes" then + table.insert(process.votes_yes, user) + elseif decision == "no" then + table.insert(process.votes_no, user) + else + return false + + process.total_votes = process.total_votes + 1 + call_vote_check(process) -- some call to determine if the vote has reached an end condition +end + +function modules.consent.call_vote_check(process) + if votes_yes > to_pass then + call_success() + elseif votes_no > to_pass then + call_failure() + end +end \ No newline at end of file From e22b143a6aae3fc45f7c3570f9bafbb21e212e6c Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Wed, 5 May 2021 23:56:19 -0400 Subject: [PATCH 13/19] failsafe for empty orgs.array --- modpol/modpol.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modpol/modpol.lua b/modpol/modpol.lua index d220ed5..6c35d62 100644 --- a/modpol/modpol.lua +++ b/modpol/modpol.lua @@ -71,9 +71,17 @@ dofile (topdir .. "/api.lua") -- =================================================================== -- Final checks -for id, org in ipairs(modpol.orgs.array) do - if type(org) == 'table' then - setmetatable(org, modpol.orgs) + +-- sets org metatable on load +if (modpol.orgs.array) then + for id, org in ipairs(modpol.orgs.array) do + if type(org) == 'table' then + setmetatable(org, modpol.orgs) + end + -- sets process metatable on load + for id, process in ipairs(org.processes) do + setmetatable(process, org.modules[process.type]) + end end end From fb0bb4f04948747c9e3711f486a0062b9481017d Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Thu, 6 May 2021 00:36:30 -0400 Subject: [PATCH 14/19] starting to bring consent module online --- modpol/modules/consent.lua | 70 ++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index bfbad19..9a6b060 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -1,37 +1,55 @@ -rough_idea = { -- a lot of these might want to call org functions instead of being hard coded +modpol.modules.consent = { type = "consent", - org_id = 5, -- may be needed for defer_to, process sent to a diff org - request_id = 1, -- callback to request - total_votes = 2, - to_pass = 3, -- could default to majority, but could set super majority - eligible_voters = 5, - timeout = 234235325, -- timestamp when vote ends - votes_yes = { - "lukvmil" - }, - votes_no = { - "nathan" - } } -function modules.consent.cast_vote(user, decision, org_id, process_id) - local org = modpol.orgs.get_org(org_id) - local process = org:get_process(process_id) - if decision == "yes" then - table.insert(process.votes_yes, user) - elseif decision == "no" then - table.insert(process.votes_no, user) - else - return false - - process.total_votes = process.total_votes + 1 - call_vote_check(process) -- some call to determine if the vote has reached an end condition +-- sets consent to its own callback +modpol.modules.consent.__index = modpol.modules.consent + +function temp_consent_process() + return { + org_id = nil, + request_id = nil, + total_votes = nil, + votes_yes = {}, + votes_no = {} + } end +-- =============================================== +-- function to create a new consent process to resolve a pending process +function modpol.modules.consent.new_process(request_id, org_id) + local process = temp_consent_process() + process.request_id = request_id + process.org_id = org_id + + setmetatable(process, modpol.modules.consent) + + modpol.ocutil.log('Created new process for request id') + + return temp_consent_process +end + +-- ====================================================== +-- function for users to vote on a pending request +function modpol.modules.consent:approve(user, decision) + if decision then + table.insert(self.votes_yes, user) + modpol.ocutil.log('User ' .. user .. ' voted yes on request #' .. self.request_id) + else + table.insert(self.votes_no, user) + modpol.ocutil.log('User ' .. user .. ' voted no on request #' .. self.request_id) + + self.total_votes = self.total_votes + 1 + +end + +-- =================================================== +-- determines whether process has finished and resolves request if it has (unfinished) function modules.consent.call_vote_check(process) if votes_yes > to_pass then call_success() elseif votes_no > to_pass then call_failure() end -end \ No newline at end of file +end + From a7ba7605d3a4ea6eae963903e345e5d53b0768b8 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Thu, 6 May 2021 01:05:57 -0400 Subject: [PATCH 15/19] proccesses are working now! --- modpol/api.lua | 5 ++++- modpol/modpol.lua | 8 ++++---- modpol/modules/consent.lua | 26 ++++++++++++++------------ modpol/orgs/requests.lua | 16 +++++++++++----- modpol/tests/org_req_test.lua | 6 +++--- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/modpol/api.lua b/modpol/api.lua index 41b34d6..cae289f 100644 --- a/modpol/api.lua +++ b/modpol/api.lua @@ -13,4 +13,7 @@ dofile (localdir .. "/orgs/requests.lua") dofile (localdir .. "/interactions/interactions.lua") -- messaging functions -dofile (localdir .. "/processes/processes.lua") \ No newline at end of file +dofile (localdir .. "/processes/processes.lua") + +--modules +dofile (localdir .. "/modules/consent.lua") \ No newline at end of file diff --git a/modpol/modpol.lua b/modpol/modpol.lua index 6c35d62..21ce509 100644 --- a/modpol/modpol.lua +++ b/modpol/modpol.lua @@ -77,10 +77,10 @@ if (modpol.orgs.array) then for id, org in ipairs(modpol.orgs.array) do if type(org) == 'table' then setmetatable(org, modpol.orgs) - end - -- sets process metatable on load - for id, process in ipairs(org.processes) do - setmetatable(process, org.modules[process.type]) + -- sets process metatable on load + for id, process in ipairs(org.processes) do + setmetatable(process, org.modules[process.type]) + end end end end diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index 9a6b060..1704050 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -1,3 +1,5 @@ +modpol.modules = modpol.modules or {} + modpol.modules.consent = { type = "consent", } @@ -9,7 +11,7 @@ function temp_consent_process() return { org_id = nil, request_id = nil, - total_votes = nil, + total_votes = 0, votes_yes = {}, votes_no = {} } @@ -17,16 +19,15 @@ 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(request_id, org_id) local process = temp_consent_process() 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) - modpol.ocutil.log('Created new process for request id') - - return temp_consent_process + return process end -- ====================================================== @@ -38,6 +39,7 @@ function modpol.modules.consent:approve(user, decision) else table.insert(self.votes_no, user) modpol.ocutil.log('User ' .. user .. ' voted no on request #' .. self.request_id) + end self.total_votes = self.total_votes + 1 @@ -45,11 +47,11 @@ end -- =================================================== -- determines whether process has finished and resolves request if it has (unfinished) -function modules.consent.call_vote_check(process) - if votes_yes > to_pass then - call_success() - elseif votes_no > to_pass then - call_failure() - end -end +-- function modpol.modules.consent.call_vote_check(process) +-- if votes_yes > to_pass then +-- call_success() +-- elseif votes_no > to_pass then +-- call_failure() +-- end +-- end diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index 39c07ab..1ff255a 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -7,11 +7,15 @@ modpol.orgs.request_params = { -- ================================ -- creates a new process linked to a request id -function modpol.orgs:create_process(request_id) - local new_process = { - object = "I am a process", - request_id = request_id - } +function modpol.orgs:create_process(process_type, request_id) + if not modpol.modules[process_type] then + modpol.ocutil.log('Process type "' .. process_type .. '" does not exist') + 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 @@ -24,8 +28,10 @@ function modpol.orgs:create_process(request_id) -- attempts to fill empty spots in list, otherwise appends to end if empty_index then self.processes[empty_index] = new_process + return empty_index else table.insert(self.processes, new_process) + return #self.processes end end diff --git a/modpol/tests/org_req_test.lua b/modpol/tests/org_req_test.lua index 17875b3..6696db6 100644 --- a/modpol/tests/org_req_test.lua +++ b/modpol/tests/org_req_test.lua @@ -12,8 +12,8 @@ new_request = { params = {"lukvmil"} } -request_id = test_org:make_request(new_request) request_id = test_org:make_request(new_request) -print(test_org:list_request()) -test_org:create_process(request_id) \ No newline at end of file +process_id = test_org:create_process("consent", request_id) +process = test_org.processes[process_id] +process:approve("luke", true) \ No newline at end of file From 797d0bebb88843171c823f913da82a3625ebac49 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Thu, 6 May 2021 14:13:02 -0400 Subject: [PATCH 16/19] significant progress! a working process from beginning to end can be seen in test/org_req_test.lua --- modpol/modpol.lua | 3 ++- modpol/modules/consent.lua | 29 ++++++++++++++++++++++------- modpol/orgs/base.lua | 15 ++++++++++++++- modpol/orgs/requests.lua | 22 ++++++++++++++++++++++ modpol/tests/org_req_test.lua | 9 ++++++--- 5 files changed, 66 insertions(+), 12 deletions(-) diff --git a/modpol/modpol.lua b/modpol/modpol.lua index 21ce509..0edf03c 100644 --- a/modpol/modpol.lua +++ b/modpol/modpol.lua @@ -78,8 +78,9 @@ if (modpol.orgs.array) then if type(org) == 'table' then setmetatable(org, modpol.orgs) -- sets process metatable on load + print(org.modules) for id, process in ipairs(org.processes) do - setmetatable(process, org.modules[process.type]) + setmetatable(process, modpol.modules[process.type]) end end end diff --git a/modpol/modules/consent.lua b/modpol/modules/consent.lua index 1704050..001ae2f 100644 --- a/modpol/modules/consent.lua +++ b/modpol/modules/consent.lua @@ -12,6 +12,7 @@ function temp_consent_process() org_id = nil, request_id = nil, total_votes = 0, + majority_to_pass = 0.51, votes_yes = {}, votes_no = {} } @@ -33,6 +34,11 @@ end -- ====================================================== -- function for users to vote on a pending request function modpol.modules.consent:approve(user, decision) + if not modpol.orgs.get_org(self.org_id):has_member(user) then + modpol.ocutil.log('Error in consent:approve -> user not a member of the org') + return + end + if decision then table.insert(self.votes_yes, user) modpol.ocutil.log('User ' .. user .. ' voted yes on request #' .. self.request_id) @@ -43,15 +49,24 @@ function modpol.modules.consent:approve(user, decision) self.total_votes = self.total_votes + 1 + self:update_status() end -- =================================================== -- determines whether process has finished and resolves request if it has (unfinished) --- function modpol.modules.consent.call_vote_check(process) --- if votes_yes > to_pass then --- call_success() --- elseif votes_no > to_pass then --- call_failure() --- end --- end +function modpol.modules.consent:update_status() + local process_org = modpol.orgs.get_org(self.org_id) + local eligible_voters = process_org:get_member_count() + local votes_needed = math.ceil(self.majority_to_pass * eligible_voters) + + if #self.votes_yes >= votes_needed then + modpol.ocutil.log('Request #' .. self.request_id .. ' passes') + process_org:resolve_request(self.request_id, true) + elseif #self.votes_no >= votes_needed then + modpol.ocutil.log('Request #' .. self.request_id .. ' fails to pass') + process_org:resolve_request(self.request_id, false) + else + modpol.ocutil.log('Waiting for more votes...') + end +end diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua index 37315ad..28cf136 100644 --- a/modpol/orgs/base.lua +++ b/modpol/orgs/base.lua @@ -271,7 +271,8 @@ end function modpol.orgs:list_member() local str for k, v in ipairs(self.members) do - if str then + -- checking to see if member name is valid + if str and str ~= '' then str = str .. '\n' .. v else str = v @@ -280,6 +281,18 @@ function modpol.orgs:list_member() return str end +-- ============================== +-- because member list uses lazy deletion, using #org.members will not show an accurate number +function modpol.orgs:get_member_count() + local count = 0 + for k, v in ipairs(self.members) do + -- the empty string represents a deleted member in the members list + if v ~= '' then + count = count + 1 + end + end + return count +end -- ==================================== -- adds a new policy to the policy table -- must define the policy type, process associated with it, and whether the request must be made by an org member diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index 1ff255a..f79820d 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -67,6 +67,28 @@ function modpol.orgs:list_request() return str end +-- =============================== +-- if the request was approved, the associated function is called, otherwise it is deleted +function modpol.orgs:resolve_request(request_id, approve) + if approve then + local request = self.requests[request_id] + local p = request.params + + if request.type == "add_org" then + self:add_org(p[1]) + elseif request.type == "delete" then + self:delete() + elseif request.type == "add_member" then + self:add_member(p[1]) + elseif request.type == "remove_member" then + self:remove_member(p[1]) + end + + end + + self.requests[request_id] = "deleted" +end + -- ================================ -- tries to make a request to the org function modpol.orgs:make_request(request) diff --git a/modpol/tests/org_req_test.lua b/modpol/tests/org_req_test.lua index 6696db6..08d1812 100644 --- a/modpol/tests/org_req_test.lua +++ b/modpol/tests/org_req_test.lua @@ -3,17 +3,20 @@ dofile('../modpol.lua'); modpol.orgs.reset() test_org = modpol.instance:add_org('test_org') +test_org:add_member('luke') +test_org:add_member('nathan') test_org:set_policy("add_member", nil, false); new_request = { - user = "lukvmil", + user = "josh", type = "add_member", - params = {"lukvmil"} + params = {"josh"} } request_id = test_org:make_request(new_request) process_id = test_org:create_process("consent", request_id) process = test_org.processes[process_id] -process:approve("luke", true) \ No newline at end of file +process:approve("luke", true) +process:approve("nathan", true) \ No newline at end of file From 3b35817d5b59537a37bfa5f1e840e59aec49df78 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sat, 8 May 2021 12:18:13 -0400 Subject: [PATCH 17/19] make_request now automatically launches a process --- modpol/orgs/base.lua | 4 ++-- modpol/orgs/requests.lua | 8 ++++++-- modpol/tests/org_req_test.lua | 14 +++++++++----- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua index 28cf136..e581f1d 100644 --- a/modpol/orgs/base.lua +++ b/modpol/orgs/base.lua @@ -296,9 +296,9 @@ end -- ==================================== -- adds a new policy to the policy table -- must define the policy type, process associated with it, and whether the request must be made by an org member -function modpol.orgs:set_policy(policy_type, process, must_be_member) +function modpol.orgs:set_policy(policy_type, process_type, must_be_member) local new_policy = { - process = process, + process_type = process_type, must_be_member = must_be_member } self.policies[policy_type] = new_policy diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index f79820d..97a2ee8 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -161,8 +161,12 @@ function modpol.orgs:make_request(request) end request_id = count end - modpol.ocutil.log("Request made") + modpol.ocutil.log("Request made by " .. request.user .. " to " .. request.type) - return request_id + -- launching process tied to this request + local process_id = self:create_process(requested_policy.process_type, request_id) + + -- returns process id of processes launched by this request + return process_id end diff --git a/modpol/tests/org_req_test.lua b/modpol/tests/org_req_test.lua index 08d1812..55678eb 100644 --- a/modpol/tests/org_req_test.lua +++ b/modpol/tests/org_req_test.lua @@ -6,7 +6,7 @@ test_org = modpol.instance:add_org('test_org') test_org:add_member('luke') test_org:add_member('nathan') -test_org:set_policy("add_member", nil, false); +test_org:set_policy("add_member", "consent", false); new_request = { user = "josh", @@ -16,7 +16,11 @@ new_request = { request_id = test_org:make_request(new_request) -process_id = test_org:create_process("consent", request_id) -process = test_org.processes[process_id] -process:approve("luke", true) -process:approve("nathan", true) \ No newline at end of file +-- process_id = test_org:create_process("consent", request_id) +for id, process in ipairs(test_org.processes) do + process:approve('luke', true) + process:approve('nathan', true) +end +-- process = test_org.processes[process_id] +-- process:approve("luke", true) +-- process:approve("nathan", true) \ No newline at end of file From 23f6455a8991ceb9aa90fae2754bf6d45f08449c Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sat, 8 May 2021 12:24:57 -0400 Subject: [PATCH 18/19] removed strange message --- modpol/modpol.lua | 1 - modpol/orgs/base.lua | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modpol/modpol.lua b/modpol/modpol.lua index 0edf03c..db132d5 100644 --- a/modpol/modpol.lua +++ b/modpol/modpol.lua @@ -78,7 +78,6 @@ if (modpol.orgs.array) then if type(org) == 'table' then setmetatable(org, modpol.orgs) -- sets process metatable on load - print(org.modules) for id, process in ipairs(org.processes) do setmetatable(process, modpol.modules[process.type]) end diff --git a/modpol/orgs/base.lua b/modpol/orgs/base.lua index e581f1d..9ed5b86 100644 --- a/modpol/orgs/base.lua +++ b/modpol/orgs/base.lua @@ -129,7 +129,7 @@ function modpol.orgs:record(msg, entry_type) entry.entry_type = entry_type else modpol.ocutil.log('Error in ' .. self.name .. ':record -> entry_type must be a non empty string') - print(msg, entry_type) + modpol.ocutil.log(msg, entry_type) return false end @@ -194,7 +194,7 @@ function modpol.orgs:delete() if #self.children > 0 then for i, child_id in pairs(self.children) do local child = modpol.orgs.get_org(child_id) - print(child_id, child) + modpol.ocutil.log(child_id, child) child:delete() end end From ac8bb432e0f295fe9e95dd251bb4e4b5de6a2a06 Mon Sep 17 00:00:00 2001 From: Luke Miller Date: Sun, 9 May 2021 17:43:24 -0400 Subject: [PATCH 19/19] fixing lazy deletion check --- modpol/orgs/requests.lua | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/modpol/orgs/requests.lua b/modpol/orgs/requests.lua index 97a2ee8..d18c2f1 100644 --- a/modpol/orgs/requests.lua +++ b/modpol/orgs/requests.lua @@ -58,10 +58,12 @@ end function modpol.orgs:list_request() local str for id, req in ipairs(self.requests) do - if str then - str = str .. '\n' .. req.type .. ' (' .. req.user .. ') ' - else - str = req.type .. ' (' .. req.user .. ') ' + if req ~= "deleted" then + if str then + str = str .. '\n' .. req.type .. ' (' .. req.user .. ') ' + else + str = req.type .. ' (' .. req.user .. ') ' + end end end return str @@ -74,15 +76,20 @@ function modpol.orgs:resolve_request(request_id, approve) local request = self.requests[request_id] local p = request.params - if request.type == "add_org" then - self:add_org(p[1]) - elseif request.type == "delete" then - self:delete() - elseif request.type == "add_member" then - self:add_member(p[1]) - elseif request.type == "remove_member" then - self:remove_member(p[1]) - end + -- there's probably a way to clean this up, the issue is the varying number of commands + -- ex: self['add_member'](self, 'member_name') + -- not sure if this is safe, more testing to do + self[request.type](self, p[1], p[2], p[3]) + + -- if request.type == "add_org" then + -- self:add_org(p[1]) + -- elseif request.type == "delete" then + -- self:delete() + -- elseif request.type == "add_member" then + -- self:add_member(p[1]) + -- elseif request.type == "remove_member" then + -- self:remove_member(p[1]) + -- end end @@ -124,7 +131,7 @@ function modpol.orgs:make_request(request) -- tries to use org's policy table, defers to parent otherwise if not requested_policy then - modpol.ocutil.log(request.type .. 'policy not found, deferring to parent org') + modpol.ocutil.log(request.type .. ' policy not found, deferring to parent org') requested_policy = parent_policy if not parent_policy then