| 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@241 | 10   back_ref      = 'unit' | 
| bsw@241 | 11 } | 
| bsw@241 | 12 | 
| bsw@281 | 13 Unit:add_reference{ | 
| bsw@281 | 14   mode                  = 'mm', | 
| bsw@281 | 15   to                    = "Member", | 
| bsw@281 | 16   this_key              = 'id', | 
| bsw@281 | 17   that_key              = 'id', | 
| bsw@281 | 18   connected_by_table    = 'privilege', | 
| bsw@281 | 19   connected_by_this_key = 'unit_id', | 
| bsw@281 | 20   connected_by_that_key = 'member_id', | 
| bsw@281 | 21   ref                   = 'members' | 
| bsw@281 | 22 } | 
| bsw@281 | 23 | 
| bsw@286 | 24 function recursive_add_child_units(units, parent_unit) | 
| bsw@286 | 25   parent_unit.childs = {} | 
| bsw@286 | 26   for i, unit in ipairs(units) do | 
| bsw@286 | 27     if unit.parent_id == parent_unit.id then | 
| bsw@286 | 28       parent_unit.childs[#(parent_unit.childs)+1] = unit | 
| bsw@286 | 29       recursive_add_child_units(units, unit) | 
| bsw@286 | 30     end | 
| bsw@286 | 31   end | 
| bsw@286 | 32 end | 
| bsw@286 | 33 | 
| bsw@286 | 34 function recursive_get_child_units(units, parent_unit, depth) | 
| bsw@286 | 35   for i, unit in ipairs(parent_unit.childs) do | 
| bsw@286 | 36     unit.depth = depth | 
| bsw@286 | 37     units[#units+1] = unit | 
| bsw@286 | 38     recursive_get_child_units(units, unit, depth + 1) | 
| bsw@286 | 39   end | 
| bsw@286 | 40 end | 
| bsw@241 | 41 | 
| bsw@286 | 42 function Unit:get_flattened_tree() | 
| bsw@286 | 43   local units = Unit:new_selector():add_order_by("name"):exec() | 
| bsw@286 | 44   local unit_tree = {} | 
| bsw@286 | 45   for i, unit in ipairs(units) do | 
| bsw@286 | 46     if not unit.parent_id then | 
| bsw@286 | 47       unit_tree[#unit_tree+1] = unit | 
| bsw@286 | 48       recursive_add_child_units(units, unit) | 
| bsw@286 | 49     end | 
| bsw@286 | 50   end | 
| bsw@286 | 51   local depth = 1 | 
| bsw@286 | 52   local units = {} | 
| bsw@286 | 53   for i, unit in ipairs(unit_tree) do | 
| bsw@286 | 54     unit.depth = depth | 
| bsw@286 | 55     units[#units+1] = unit | 
| bsw@286 | 56     recursive_get_child_units(units, unit, depth + 1) | 
| bsw@286 | 57   end | 
| bsw@286 | 58   return units | 
| bsw@241 | 59 end |