| rev | line source | 
| bsw@241 | 1 Unit = mondelefant.new_class() | 
| bsw@241 | 2 Unit.table = 'unit' | 
| bsw@241 | 3 | 
| bsw@241 | 4 Unit:add_reference{ | 
| bsw@241 | 5   mode          = '1m', | 
| bsw@241 | 6   to            = "Area", | 
| bsw@241 | 7   this_key      = 'id', | 
| bsw@241 | 8   that_key      = 'unit_id', | 
| bsw@241 | 9   ref           = 'areas', | 
| bsw/jbe@1309 | 10   back_ref      = 'unit', | 
| bsw/jbe@1309 | 11   default_order = "area.name, area.id" | 
| bsw@241 | 12 } | 
| bsw@241 | 13 | 
| bsw@281 | 14 Unit:add_reference{ | 
| bsw@281 | 15   mode                  = 'mm', | 
| bsw@281 | 16   to                    = "Member", | 
| bsw@281 | 17   this_key              = 'id', | 
| bsw@281 | 18   that_key              = 'id', | 
| bsw@281 | 19   connected_by_table    = 'privilege', | 
| bsw@281 | 20   connected_by_this_key = 'unit_id', | 
| bsw@281 | 21   connected_by_that_key = 'member_id', | 
| bsw@281 | 22   ref                   = 'members' | 
| bsw@281 | 23 } | 
| bsw@281 | 24 | 
| bsw@525 | 25 Unit:add_reference{ | 
| bsw@525 | 26   mode               = "11", | 
| bsw@525 | 27   to                 = mondelefant.class_prototype, | 
| bsw@525 | 28   this_key           = "id", | 
| bsw@525 | 29   that_key           = "unit_id", | 
| bsw@525 | 30   ref                = "delegation_info", | 
| bsw@525 | 31   back_ref           = "unit", | 
| bsw@525 | 32   selector_generator = function(list, options) | 
| bsw@525 | 33     assert(options.member_id, "member_id mandatory for delegation_info") | 
| bsw@525 | 34     local ids = { sep = ", " } | 
| bsw@525 | 35     for i, object in ipairs(list) do | 
| bsw@525 | 36       local id = object.id | 
| bsw@525 | 37       if id ~= nil then | 
| bsw@525 | 38         ids[#ids+1] = {"?", id} | 
| bsw@525 | 39       end | 
| bsw@525 | 40     end | 
| bsw@525 | 41     local sub_selector = Unit:get_db_conn():new_selector() | 
| bsw@525 | 42     if #ids == 0 then | 
| bsw@525 | 43       return sub_selector:empty_list_mode() | 
| bsw@525 | 44     end | 
| bsw@525 | 45     sub_selector:from("unit") | 
| bsw@525 | 46     sub_selector:add_field("unit.id", "unit_id") | 
| bsw@529 | 47     sub_selector:add_field{ '(delegation_info(?, unit.id, null, null, ?)).*', options.member_id, options.trustee_id } | 
| bsw@525 | 48     sub_selector:add_where{ 'unit.id IN ($)', ids } | 
| bsw@525 | 49 | 
| bsw@525 | 50     local selector = Unit:get_db_conn():new_selector() | 
| bsw@525 | 51     selector:add_from(sub_selector, "delegation_info") | 
| bsw@525 | 52     selector:left_join("member", "first_trustee", "first_trustee.id = delegation_info.first_trustee_id") | 
| bsw@525 | 53     selector:left_join("member", "other_trustee", "other_trustee.id = delegation_info.other_trustee_id") | 
| bsw@525 | 54     selector:add_field("delegation_info.*") | 
| bsw@525 | 55     selector:add_field("first_trustee.name", "first_trustee_name") | 
| bsw@525 | 56     selector:add_field("other_trustee.name", "other_trustee_name") | 
| bsw@525 | 57     return selector | 
| bsw@525 | 58   end | 
| bsw@525 | 59 } | 
| bsw@525 | 60 | 
| bsw@529 | 61 function Unit.list:load_delegation_info_once_for_member_id(member_id, trustee_id) | 
| bsw@525 | 62   if self._delegation_info_loaded_for_member_id ~= member_id then | 
| bsw@529 | 63     self:load("delegation_info", { member_id = member_id, trustee_id = trustee_id }) | 
| bsw@525 | 64     for i, unit in ipairs(self) do | 
| bsw@525 | 65       unit._delegation_info_loaded_for_member_id = member_id | 
| bsw@525 | 66     end | 
| bsw@525 | 67     self._delegation_info_loaded_for_member_id = member_id | 
| bsw@525 | 68   end | 
| bsw@525 | 69 end | 
| bsw@525 | 70 | 
| bsw@529 | 71 function Unit.object:load_delegation_info_once_for_member_id(member_id, trustee_id) | 
| bsw@525 | 72   if self._delegation_info_loaded_for_member_id ~= member_id then | 
| bsw@525 | 73     self:load("delegation_info", { member_id = member_id }) | 
| bsw@525 | 74     self._delegation_info_loaded_for_member_id = member_id | 
| bsw@525 | 75   end | 
| bsw@525 | 76 end | 
| bsw@525 | 77 | 
| bsw@525 | 78 | 
| bsw@525 | 79 | 
| bsw@1145 | 80 local function recursive_add_child_units(units, parent_unit) | 
| bsw@286 | 81   parent_unit.childs = {} | 
| bsw@286 | 82   for i, unit in ipairs(units) do | 
| bsw@286 | 83     if unit.parent_id == parent_unit.id then | 
| bsw@286 | 84       parent_unit.childs[#(parent_unit.childs)+1] = unit | 
| bsw@286 | 85       recursive_add_child_units(units, unit) | 
| bsw@286 | 86     end | 
| bsw@286 | 87   end | 
| bsw@286 | 88 end | 
| bsw@286 | 89 | 
| bsw@1145 | 90 local function recursive_get_child_units(units, parent_unit, depth) | 
| bsw@286 | 91   for i, unit in ipairs(parent_unit.childs) do | 
| bsw@286 | 92     unit.depth = depth | 
| bsw@286 | 93     units[#units+1] = unit | 
| bsw@286 | 94     recursive_get_child_units(units, unit, depth + 1) | 
| bsw@286 | 95   end | 
| bsw@286 | 96 end | 
| bsw@241 | 97 | 
| bsw@831 | 98 function Unit:get_flattened_tree(args) | 
| bsw@831 | 99   local units_selector = Unit:new_selector() | 
| bsw@831 | 100     :add_order_by("name") | 
| bsw@831 | 101   if not args or not args.include_inactive then | 
| bsw@831 | 102     units_selector:add_where("active") | 
| bsw@831 | 103   end | 
| bsw@1504 | 104   if not args or not args.include_hidden then | 
| bsw@1504 | 105     units_selector:add_where("attr->'hidden' ISNULL OR NOT (attr->'hidden' = 'true')") | 
| bsw@1504 | 106   end | 
| bsw@831 | 107   local units = units_selector:exec() | 
| bsw@286 | 108   local unit_tree = {} | 
| bsw@286 | 109   for i, unit in ipairs(units) do | 
| bsw@286 | 110     if not unit.parent_id then | 
| bsw@286 | 111       unit_tree[#unit_tree+1] = unit | 
| bsw@286 | 112       recursive_add_child_units(units, unit) | 
| bsw@286 | 113     end | 
| bsw@286 | 114   end | 
| bsw@286 | 115   local depth = 1 | 
| bsw@286 | 116   local units = {} | 
| bsw@286 | 117   for i, unit in ipairs(unit_tree) do | 
| bsw@286 | 118     unit.depth = depth | 
| bsw@286 | 119     units[#units+1] = unit | 
| bsw@286 | 120     recursive_get_child_units(units, unit, depth + 1) | 
| bsw@286 | 121   end | 
| bsw@286 | 122   return units | 
| bsw@241 | 123 end |