bsw/jbe@0: Area = mondelefant.new_class() bsw/jbe@0: Area.table = 'area' bsw/jbe@0: bsw/jbe@0: Area:add_reference{ bsw@262: mode = 'm1', bsw@262: to = "Unit", bsw@262: this_key = 'unit_id', bsw@262: that_key = 'id', bsw@262: ref = 'unit', bsw@262: } bsw@262: bsw@262: Area:add_reference{ bsw/jbe@0: mode = '1m', bsw/jbe@0: to = "Issue", bsw/jbe@0: this_key = 'id', bsw/jbe@0: that_key = 'area_id', bsw/jbe@0: ref = 'issues', bsw/jbe@0: back_ref = 'area' bsw/jbe@0: } bsw/jbe@0: bsw/jbe@0: Area:add_reference{ bsw/jbe@0: mode = '1m', bsw/jbe@0: to = "Membership", bsw/jbe@0: this_key = 'id', bsw/jbe@0: that_key = 'area_id', bsw/jbe@0: ref = 'memberships', bsw/jbe@0: back_ref = 'area' bsw/jbe@0: } bsw/jbe@0: bsw/jbe@0: Area:add_reference{ bsw@2: mode = '1m', bsw@2: to = "Delegation", bsw@2: this_key = 'id', bsw@2: that_key = 'area_id', bsw@2: ref = 'delegations', bsw@2: back_ref = 'area' bsw@2: } bsw@2: bsw@2: Area:add_reference{ bsw/jbe@0: mode = 'mm', bsw/jbe@0: to = "Member", bsw/jbe@0: this_key = 'id', bsw/jbe@0: that_key = 'id', bsw/jbe@0: connected_by_table = 'membership', bsw/jbe@0: connected_by_this_key = 'area_id', bsw/jbe@0: connected_by_that_key = 'member_id', bsw/jbe@0: ref = 'members' bsw/jbe@0: } bsw@7: bsw@7: Area:add_reference{ bsw@7: mode = 'mm', bsw@7: to = "Policy", bsw@7: this_key = 'id', bsw@7: that_key = 'id', bsw@7: connected_by_table = 'allowed_policy', bsw@7: connected_by_this_key = 'area_id', bsw@7: connected_by_that_key = 'policy_id', bsw@7: ref = 'allowed_policies' bsw@7: } bsw@7: bsw@525: Area:add_reference{ bsw@525: mode = "11", bsw@525: to = mondelefant.class_prototype, bsw@525: this_key = "id", bsw@525: that_key = "area_id", bsw@525: ref = "delegation_info", bsw@525: back_ref = "area", bsw@525: selector_generator = function(list, options) bsw@525: assert(options.member_id, "member_id mandatory for delegation_info") bsw@525: local ids = { sep = ", " } bsw@525: for i, object in ipairs(list) do bsw@525: local id = object.id bsw@525: if id ~= nil then bsw@525: ids[#ids+1] = {"?", id} bsw@525: end bsw@525: end bsw@525: local sub_selector = Area:get_db_conn():new_selector() bsw@525: if #ids == 0 then bsw@525: return sub_selector:empty_list_mode() bsw@525: end bsw@525: sub_selector:from("area") bsw@525: sub_selector:add_field("area.id", "area_id") bsw@529: sub_selector:add_field{ '(delegation_info(?, null, area.id, null, ?)).*', options.member_id, options.trustee_id } bsw@525: sub_selector:add_where{ 'area.id IN ($)', ids } bsw@525: bsw@525: local selector = Area:get_db_conn():new_selector() bsw@525: selector:add_from(sub_selector, "delegation_info") bsw@525: selector:left_join("member", "first_trustee", "first_trustee.id = delegation_info.first_trustee_id") bsw@525: selector:left_join("member", "other_trustee", "other_trustee.id = delegation_info.other_trustee_id") bsw@525: selector:add_field("delegation_info.*") bsw@525: selector:add_field("first_trustee.name", "first_trustee_name") bsw@525: selector:add_field("other_trustee.name", "other_trustee_name") bsw@525: return selector bsw@525: end bsw@525: } bsw@525: bsw@529: function Area.list:load_delegation_info_once_for_member_id(member_id, trustee_id) bsw@525: if self._delegation_info_loaded_for_member_id ~= member_id then bsw@529: self:load("delegation_info", { member_id = member_id, trustee_id = trustee_id }) bsw@525: for i, area in ipairs(self) do bsw@525: area._delegation_info_loaded_for_member_id = member_id bsw@525: end bsw@525: self._delegation_info_loaded_for_member_id = member_id bsw@525: end bsw@525: end bsw@525: bsw@529: function Area.object:load_delegation_info_once_for_member_id(member_id, trustee_id) bsw@525: if self._delegation_info_loaded_for_member_id ~= member_id then bsw@529: self:load("delegation_info", { member_id = member_id, trustee_id = trustee_id }) bsw@525: self._delegation_info_loaded_for_member_id = member_id bsw@525: end bsw@525: end bsw@525: bsw@7: function Area.object_get:default_policy() bsw@7: return Policy:new_selector() bsw@7: :join("allowed_policy", nil, "allowed_policy.policy_id = policy.id") bsw@7: :add_where{ "allowed_policy.area_id = ? AND allowed_policy.default_policy", self.id } bsw@10: :optional_object_mode() bsw@7: :exec() bsw@7: end bsw@7: bsw@193: function Area:build_selector(args) bsw@193: local selector = Area:new_selector() bsw@193: if args.active ~= nil then bsw@274: selector:add_where{ "area.active = ?", args.active } bsw@193: end bsw@241: if args.unit_id ~= nil then bsw@274: selector:add_where{ "area.unit_id = ?", args.unit_id } bsw@241: end bsw@193: return selector bsw@193: end bsw@262: bsw@262: function Area.object_get:name_with_unit_name() bsw@264: if not config.single_unit_id then bsw@280: return self.unit.name .. ", " .. self.name bsw@264: else bsw@264: return self.name bsw@262: end bsw@262: end