adding to org dashboard, added check to make sure user is actually able to interact with process, set votes needed at process creation to prevent a stalemate if a user joins after

This commit is contained in:
Luke Miller 2021-08-16 16:25:42 -04:00
parent a6963ed84f
commit 76db1ea87f
3 changed files with 90 additions and 33 deletions

View File

@ -31,14 +31,14 @@ function modpol.interactions.dashboard(user)
end
end
print()
print('Users: ' .. table.concat(all_users, ', '))
print('All users: ' .. table.concat(all_users, ', '))
print()
print('Access which org?')
local sel = io.read()
local sel_org = modpol.orgs.array[tonumber(sel)]
print()
local sel_org = modpol.orgs.array[tonumber(sel)].name
if not sel_org then return end
@ -49,45 +49,94 @@ end
-- Function: modpol.interactions.org_dashboard
-- Params: user (string), org_name (string)
-- Output: Displays a menu of org-specific commands to the user
function modpol.interactions.org_dashboard(user, org)
function modpol.interactions.org_dashboard(user, org_name)
local org = modpol.orgs.get_org(org_name)
if not org then return nil end
local parent = ""
if org.id == 1 then
parent = "none"
else
parent = modpol.orgs.get_org(org.parent).name
end
local children = {}
for k,v in ipairs(org.children) do
local this_child = modpol.orgs.get_org(v)
table.insert(children, this_child.name)
end
local processes = {}
for k,v in ipairs(org.processes) do
print(k, v)
local this_request = org.requests[v.request_id]
if type(this_request) == "table" then
local active = ''
if org.pending[user] then
if org.pending[user][v.id] then
active = '*'
end
end
local req_str = "[" .. v.id .. "] " ..
active .. this_request.type
if this_request.params[1] then
req_str = req_str ": " ..
table.concat(this_request.params, ", ")
end
local req_str = v.id .. " (" .. this_request.type .. " -> " .. table.concat(this_request.params, ", ") .. ")" .. active
table.insert(processes, req_str)
end
local process_msg = #org.processes .. " total"
if org.pending[user] then
process_msg = process_msg .. " (" .. #org.pending[user] .. " pending)"
else
process_msg = process_msg .. " (0 pending)"
end
-- set up output
print("Org: " .. org_name)
print("Parent: " .. parent)
print("Members: " .. table.concat(org.members, ", "))
print("Children: " .. table.concat(children, ", "))
print("Processes: " .. table.concat(processes, ", "))
print("Processes: " .. process_msg)
print()
print("Commands: (L)eave, (J)oin, (P)rocesses, (A)dd child, (D)elete org")
print('Interact with which process?')
local sel = io.read()
local process = org.processes[tonumber(sel)]
if not process then return end
process:interact(user)
print()
if sel == 'l' or sel == 'L' then
org:remove_member(user)
elseif sel == 'j' or sel == 'J' then
org:make_request({user=user, type="add_member", params={user}})
elseif sel == 'a' or sel == 'A' then
print("What should the new org be named?")
local new_org_name = io.read()
org:make_request({user=user, type="add_org", params={new_org_name}})
elseif sel == 'd' or sel == 'D' then
org:make_request({user=user, type="delete", params={}})
elseif sel == 'p' or sel == 'P' then
local processes = {}
print("All processes: (* indicates pending action)")
for k,v in ipairs(org.processes) do
local this_request = org.requests[v.request_id]
if type(this_request) == "table" then
local active = ''
if org.pending[user] then
if org.pending[user][v.id] then
active = '*'
end
end
local req_str = "[" .. v.id .. "] " ..
active .. this_request.type
if this_request.params[1] then
req_str = req_str .. ": " ..
table.concat(this_request.params, ", ")
end
print(req_str)
end
end
print()
print("Interact with which one?")
local to_interact = io.read()
local process = org.processes[tonumber(to_interact)]
if not process then return end
if org:has_pending_actions(user) then
if org.pending[user][process.id] then
process:interact(user)
end
end
end
end
-- Function: modpol.interactions.policy_dashboard

View File

@ -0,0 +1,7 @@
dofile("../modpol.lua")
print("Log in as which user?")
local username = io.read()
print()
modpol.interactions.dashboard(username)

View File

@ -13,6 +13,7 @@ function temp_consent_process()
request_id = nil,
total_votes = 0,
majority_to_pass = 0.51,
votes_needed = nil,
votes_yes = {},
votes_no = {}
}
@ -35,6 +36,8 @@ function modpol.modules.consent:new_process(id, request_id, org_id)
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
@ -82,13 +85,11 @@ end
-- determines whether process has finished and resolves request if it has (unfinished)
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
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 >= votes_needed then
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