def _search_parents(self, domain=[], order=None): self._check_parent_field() self.check_access_rights('read') if expression.is_false(self, domain): return [] query = self._where_calc(domain) self._apply_ir_rules(query, 'read') from_clause, where_clause, where_clause_arguments = query.get_sql() parent_where = where_clause and (" WHERE %s" % where_clause) or '' parent_query = 'SELECT "%s".id FROM ' % self._table + from_clause + parent_where no_parent_clause = '"{table}"."{field}" IS NULL'.format( table=self._table, field=self._parent_name) no_access_clause = '"{table}"."{field}" NOT IN ({query})'.format( table=self._table, field=self._parent_name, query=parent_query) parent_clause = '({0} OR {1})'.format(no_parent_clause, no_access_clause) order_by = self._generate_order_by(order, query) from_clause, where_clause, where_clause_params = query.get_sql() where_str = (where_clause and (" WHERE %s AND %s" % (where_clause, parent_clause)) or (" WHERE %s" % parent_clause)) 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()])
def _search_parents(self, domain=[], offset=0, limit=None, order=None, count=False): self._check_parent_field() self.check_access_rights("read") if expression.is_false(self, domain): return 0 if count else [] self._flush_search(domain, fields=[self._parent_name], order=order) query = self._where_calc(domain) self._apply_ir_rules(query, "read") from_clause, where_clause, where_clause_arguments = query.get_sql() parent_where = where_clause and ( " WHERE {}".format(where_clause)) or "" parent_query = ('SELECT "{}".id FROM '.format(self._table) + from_clause + parent_where) no_parent_clause = '"{table}"."{field}" IS NULL'.format( table=self._table, field=self._parent_name) no_access_clause = '"{table}"."{field}" NOT IN ({query})'.format( table=self._table, field=self._parent_name, query=parent_query) parent_clause = "({} OR {})".format(no_parent_clause, no_access_clause) order_by = self._generate_order_by(order, query) from_clause, where_clause, where_clause_params = query.get_sql() where_str = (where_clause and (" WHERE {} AND {}".format(where_clause, parent_clause)) or (" WHERE {}".format(parent_clause))) if count: query_str = "SELECT count(1) FROM " + from_clause + where_str self.env.cr.execute(query_str, where_clause_params + where_clause_arguments) return self.env.cr.fetchone()[0] limit_str = limit and " limit %d" % limit or "" offset_str = offset and " offset %d" % offset or "" query_str = ('SELECT "{}".id FROM '.format(self._table) + from_clause + where_str + order_by + limit_str + offset_str) self.env.cr.execute(query_str, where_clause_params + where_clause_arguments) return utils.uniquify_list([x[0] for x in self.env.cr.fetchall()])