diff --git a/modpol/modules/child_org.lua b/modpol/modules/child_org.lua new file mode 100644 index 0000000..e76abf5 --- /dev/null +++ b/modpol/modules/child_org.lua @@ -0,0 +1,28 @@ +-- CHILD_ORG +-- Module that enables user to create child in current org + +-- Initial configuration +modpol.modules.child_org = {} +modpol.modules.child_org.name = "Create child org" + + +-- == REQUEST == + +-- gather data from initiator: child org name, comment + +-- function: modpol.modules.child_org.request + + + +-- == CONSENT == + +-- function: modpol.orgs:consent(process_id, result_function) +-- the result function should begin the completion process below + + + +-- == COMPLETION == + +-- if approved/if failed functions? + +-- function: modpol.modules.child_org.create(initiator, parent_org, child_org) diff --git a/modpol/modules/join_org.lua b/modpol/modules/join_org.lua new file mode 100644 index 0000000..e69de29 diff --git a/modpol/modules/leave_org.lua b/modpol/modules/leave_org.lua new file mode 100644 index 0000000..e69de29 diff --git a/modpol/modules/remove_org.lua b/modpol/modules/remove_org.lua new file mode 100644 index 0000000..e69de29 diff --git a/modpol/orgs/consent.lua b/modpol/orgs/consent.lua new file mode 100644 index 0000000..243b0b0 --- /dev/null +++ b/modpol/orgs/consent.lua @@ -0,0 +1,98 @@ +-- TODO: NEEDS TO BE REWRITTEN AS A LIBRARY NOT A MODULE + +modpol.orgs.consent = {} + +-- sets consent to its own callback +modpol.orgs.consent.__index = modpol.orgs.consent + +function temp_consent_process() + return { + type = "consent", + id = nil, + org_id = nil, + request_id = nil, + total_votes = 0, + majority_to_pass = 0.51, + votes_needed = nil, + votes_yes = {}, + votes_no = {} + } +end + +-- =============================================== +-- function to create a new consent process to resolve a pending process +function modpol.orgs.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.orgs.consent) + modpol.ocutil.log('Created new process #' .. id .. ' for request id #' .. request_id) + + 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) + end + + process.votes_needed = math.ceil(process.majority_to_pass * p_org:get_member_count()) + + return process +end + +-- ============================ +-- interact function for the consent module +-- input: user (string) +function modpol.orgs.consent:interact(user) + -- TODO this needs more context on the vote at hand + modpol.interactions.binary_poll_user( + user, "Do you consent?", + function(vote) + if vote == 'Yes' then + self:approve(user, true) + elseif vote == 'No' then + self:approve(user, false) + end + end) +end + +-- ====================================================== +-- function for users to vote on a pending request +function modpol.orgs.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) + 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 + + local p_org = modpol.orgs.get_org(self.org_id) + p_org:remove_pending_action(self.id, user) + + self:update_status() +end + +-- =================================================== +-- determines whether process has finished and resolves request if it has (unfinished) +function modpol.orgs.consent:update_status() + local process_org = modpol.orgs.get_org(self.org_id) + + if #self.votes_yes >= self.votes_needed then + modpol.ocutil.log('Request #' .. self.request_id .. ' passes') + process_org:resolve_request(self.request_id, true) + elseif #self.votes_no >= self.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/defer_to.lua b/modpol/orgs/defer_to.lua new file mode 100644 index 0000000..e69de29