change_policy.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. --- change_policy
  2. -- @module change_policy
  3. local change_policy = {
  4. name = "Change policy",
  5. slug = "change_policy",
  6. desc = "Change a policy in a module",
  7. hide = false;
  8. }
  9. change_policy.data = {
  10. result = nil
  11. }
  12. change_policy.config = {
  13. approval = "none"
  14. }
  15. --- Change modules initiate
  16. -- @function change_policy:initiate
  17. -- @param result Callback if this module is embedded in other modules
  18. function change_policy:initiate(result)
  19. -- prepare module options
  20. local available_modules = {}
  21. for k,org_mod in pairs(self.org.modules) do
  22. if not org_mod.hide then
  23. available_modules[org_mod.slug] = modpol.util.copy_table(org_mod)
  24. end end
  25. local modules_list = {}
  26. local modules_count = 0
  27. for k,v in pairs(available_modules) do
  28. table.insert(modules_list,v.slug)
  29. modules_count = modules_count + 1
  30. end
  31. -- abort if no modules to remove
  32. if modules_count == 0 then
  33. modpol.interactions.message(
  34. self.initiator, "Org has no modules")
  35. modpol.interactions.org_dashboard(
  36. self.initiator, self.org.id)
  37. if self.data.result then self.data.result() end
  38. self.org:delete_process(self.id)
  39. return
  40. end
  41. table.sort(modules_list)
  42. -- now ask which to remove
  43. modpol.interactions.dropdown_query(
  44. self.initiator, "Choose a module to change policies for:",
  45. modules_list,
  46. function(mod_choice)
  47. local this_module = self.org.modules[mod_choice]
  48. local module_policies = this_module.config
  49. local policy_list = {}
  50. for k,v in pairs(module_policies) do
  51. table.insert(policy_list, k)
  52. end
  53. if #policy_list == 0 then
  54. -- No policies; abort
  55. modpol.interactions.message(
  56. self.initiator, "Module has no policy options")
  57. modpol.interactions.org_dashboard(
  58. self.initiator, self.org.id)
  59. if self.data.result then self.data.result() end
  60. self.org:delete_process(self.id)
  61. return
  62. end
  63. modpol.interactions.dropdown_query(
  64. self.initiator, "Choose a policy to change:",
  65. policy_list,
  66. function(policy_choice)
  67. modpol.interactions.text_query(
  68. self.initiator,
  69. "Use carefully!\n" ..
  70. "Current " .. policy_choice .. " value: " ..
  71. tostring(self.org.modules[mod_choice][policy_choice])
  72. .. "\nChange value to:",
  73. function(policy_input)
  74. self:approve_change(
  75. mod_choice,
  76. policy_choice,
  77. policy_input)
  78. end
  79. )
  80. end
  81. )
  82. end
  83. )
  84. end
  85. --- Propose a change.
  86. -- Type "add" or "remove"
  87. -- @function change_policy:approve_change
  88. -- @param module (string) slug of module
  89. -- @param policy (string) policy slug
  90. -- @param input (string) input content
  91. function change_policy:approve_change(module_slug, policy, input)
  92. -- NEED TO ADD APPROVAL CODE for consent, etc.
  93. modpol.interactions.message(
  94. self.initiator,
  95. "Updating " .. policy .. " policy on module " ..
  96. module_slug .. " with: " .. input)
  97. self.org.modules[module_slug].config[policy] = input
  98. modpol.interactions.org_dashboard(
  99. self.initiator, self.org.id)
  100. if self.data.result then self.data.result() end
  101. self.org:delete_process(self.id)
  102. return
  103. end
  104. modpol.modules.change_policy = change_policy