1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- -- 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
|