Merge branch 'modules' into 'master'

Modules

See merge request medlabboulder/modpol!19
This commit is contained in:
Nathan Schneider 2021-04-26 04:35:24 +00:00
commit 06dd824f35
3 changed files with 109 additions and 43 deletions

View File

@ -71,9 +71,10 @@ dofile (topdir .. "/api.lua")
-- ===================================================================
-- Final checks
for id, org in ipairs(modpol.orgs.array) do
setmetatable(org, modpol.orgs)
if type(org) == 'table' then
setmetatable(org, modpol.orgs)
end
end
-- create instance if not present

View File

@ -7,6 +7,27 @@ modpol.orgs = modpol.orgs or
-- sets modpol.orgs as its own fallback
modpol.orgs.__index = modpol.orgs
function temp_org()
return {
id = nil,
name = nil,
policies = {},
processes = {},
requests = {},
request_count = 0,
members = {},
parent = nil,
children = {}
}
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)
@ -71,22 +92,14 @@ end
function modpol.orgs.init_instance()
local error_msg
if modpol.orgs.array[1] then
error_msg = 'Error: instance has already been initialized'
modpol.ocutil.log(error_msg)
return false, error_msg
modpol.ocutil.log('Error: instance has already been initialized')
return false
end
local instance = {
id = 1,
name = "instance",
policies = {},
members = {},
ledger = {},
parent = nil,
children = {},
properties = {},
old_names = {}
}
local instance = temp_org()
instance.id = 1
instance.name = "instance"
setmetatable(instance, modpol.orgs)
-- adding instance to org list
@ -114,14 +127,15 @@ function modpol.orgs:record(msg, entry_type)
if type(msg) == 'string' and not(modpol.ocutil.str_empty(msg)) then
entry.action_msg = msg
else
print('Error: msg must be a non empty string')
modpol.ocutil.log('Error: 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
print('Error: entry_type must be a non empty string')
modpol.ocutil.log('Error: entry_type must be a non empty string')
print(msg, entry_type)
return false
end
@ -138,33 +152,27 @@ end
-- ex: instance:add_org('town hall')
function modpol.orgs:add_org(name)
if self.id == nil then
error_msg = 'Error: add_org can only be called by another org'
modpol.ocutil.log(error_msg)
return false, error_msg
modpol.ocutil.log('Error: add_org can only be called by another org')
return false
end
if modpol.ocutil.str_empty(name) then
error_msg = 'Error: org name is required'
modpol.ocutil.log(error_msg)
return false, error_msg
modpol.ocutil.log('Error: org name is required')
return false
end
if modpol.orgs.get_org(name) then
error_msg = 'Error: org name is already being used'
modpol.ocutil.log(error_msg)
return false, error_msg
modpol.ocutil.log('Error: org name is already being used')
return false
end
-- creating the child sub org
modpol.orgs.count = modpol.orgs.count + 1
local child_org = {
id = modpol.orgs.count,
name = name,
policies = {},
members = {},
parent = self.id,
children = {},
}
local child_org = temp_org()
child_org.id = modpol.orgs.count
child_org.name = name
child_org.parent = self.id
setmetatable(child_org, modpol.orgs)
-- adding child id to list of children
@ -174,6 +182,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)
return child_org
end
@ -184,7 +193,8 @@ end
-- note: "reason" param was removed, can be added back
function modpol.orgs:delete()
if self.id == 1 then
return false, 'Error: cannot delete instance'
modpol.ocutil.log('Error: cannot delete instance')
return false
end
if #self.children > 0 then
@ -196,7 +206,7 @@ function modpol.orgs:delete()
end
modpol.orgs.array[self.id] = 'removed'
print('Removed ' .. self.name .. ': ' .. self.id)
modpol.ocutil.log('Removed ' .. self.name .. ': ' .. self.id)
self:record('Deleted ' .. self.name .. ' and all child orgs', 'del_org')
@ -224,7 +234,8 @@ function modpol.orgs:add_member(user)
-- adds to end if no empty spots
table.insert(self.members, user)
end
self.record('Added member ' .. user, 'add_member')
self:record('Added member ' .. user, 'add_member')
end
-- =======================================
@ -236,7 +247,7 @@ function modpol.orgs:remove_member(user)
if user_index then
self.members[user_index] = ''
end
self.record('Removed member ' .. user, 'del_member')
self:record('Removed member ' .. user, 'del_member')
end
-- ===========================================
@ -263,3 +274,57 @@ function modpol.orgs:list_member()
end
return str
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: request type is invalid")
return false
end
for k, v in ipairs(request.params) do
num_params = num_params - 1
end
if num_params ~= 0 then
modpol.ocutil.log("Error: 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")
return false
end
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

View File

@ -117,9 +117,9 @@ local load_orgs = function()
modpol.orgs = func()
-- this block resets the metatable after being loaded in so that the class functions work
for id, org in ipairs(modpol.orgs.array) do
setmetatable(org, modpol.orgs)
end
-- for id, org in ipairs(modpol.orgs.array) do
-- setmetatable(org, modpol.orgs)
-- end
local nn = modpol.ocutil.table_length (modpol.orgs.array)
local str = "entries"