diff --git a/muk_utils/models/base.py b/muk_utils/models/base.py index 6a1f562..8fa554d 100644 --- a/muk_utils/models/base.py +++ b/muk_utils/models/base.py @@ -30,6 +30,20 @@ class Base(models.AbstractModel): _inherit = 'base' + #---------------------------------------------------------- + # Helper Methods + #---------------------------------------------------------- + + def _check_parent_field(self): + if self._parent_name not in self._fields: + raise TypeError("The parent (%s) field does not exist." % self._parent_name) + + + def _build_search_childs_domain(self, parent_id, domain=[]): + self._check_parent_field() + parent_domain = [[self._parent_name, '=', parent_id]] + return expression.AND(parent_domain, domain) if domain else parent_domain + #---------------------------------------------------------- # Hierarchy Methods #---------------------------------------------------------- @@ -63,11 +77,12 @@ class Base(models.AbstractModel): return result index = {vals['id']: vals for vals in result} return [index[record.id] for record in records if record.id in index] - + + + @api.model def _search_parents(self, domain=[], order=None): - if self._parent_name not in self._fields: - raise TypeError("The parent (%s) field does not exist." % self._parent_name) + self._check_parent_field() self.check_access_rights('read') if expression.is_false(self, domain): return [] @@ -100,4 +115,35 @@ class Base(models.AbstractModel): query_str = 'SELECT "%s".id FROM ' % self._table + from_clause + where_str + order_by complete_where_clause_params = where_clause_params + where_clause_arguments self._cr.execute(query_str, complete_where_clause_params) - return utils.uniquify_list([x[0] for x in self._cr.fetchall()]) \ No newline at end of file + return utils.uniquify_list([x[0] for x in self._cr.fetchall()]) + + @api.model + def search_childs(self, parent_id, domain=[], offset=0, limit=None, order=None, count=False): + """ This method finds the direct child elements of the parent record for a given search query. + + :param parent_id: the integer representing the ID of the parent record + :param domain: a search domain (default: empty list) + :param offset: the number of results to ignore (default: none) + :param limit: maximum number of records to return (default: all) + :param order: a string to define the sort order of the query (default: none) + :param count: counts and returns the number of matching records (default: False) + :returns: the top level elements for the given search query + """ + domain = self._build_search_childs_domain(parent_id, domain=domain) + return self.search(domain, offset=offset, limit=limit, order=order, count=count) + + @api.model + def search_read_childs(self, parent_id, domain=[], fields=None, offset=0, limit=None, order=None): + """ This method finds the direct child elements of the parent record for a given search query. + + :param parent_id: the integer representing the ID of the parent record + :param domain: a search domain (default: empty list) + :param fields: a list of fields to read (default: all fields of the model) + :param offset: the number of results to ignore (default: none) + :param limit: maximum number of records to return (default: all) + :param order: a string to define the sort order of the query (default: none) + :returns: the top level elements for the given search query + """ + domain = self._build_search_childs_domain(parent_id, domain=domain) + return self.search_read(domain=domain, fields=fields, offset=offset, limit=limit, order=order) + \ No newline at end of file