summaryrefslogtreecommitdiff
path: root/odoo/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/models.py')
-rw-r--r--odoo/models.py56
1 files changed, 22 insertions, 34 deletions
diff --git a/odoo/models.py b/odoo/models.py
index 99486832526..5eb58b7aad4 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -2362,11 +2362,13 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
"""
inherits_field = current_model._inherits[parent_model_name]
parent_model = self.env[parent_model_name]
- parent_alias, parent_alias_statement = query.add_join((current_model._table, parent_model._table, inherits_field, 'id', inherits_field), implicit=True)
+ parent_alias = query.left_join(
+ current_model._table, inherits_field, parent_model._table, 'id', inherits_field,
+ )
return parent_alias
@api.model
- def _inherits_join_calc(self, alias, fname, query, implicit=True, outer=False):
+ def _inherits_join_calc(self, alias, fname, query):
"""
Adds missing table select and join clause(s) to ``query`` for reaching
the field coming from an '_inherits' parent table (no duplicates).
@@ -2383,9 +2385,8 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
parent_model = self.env[field.related_field.model_name]
parent_fname = field.related[0]
# JOIN parent_model._table AS parent_alias ON alias.parent_fname = parent_alias.id
- parent_alias, _ = query.add_join(
- (alias, parent_model._table, parent_fname, 'id', parent_fname),
- implicit=implicit, outer=outer,
+ parent_alias = query.left_join(
+ alias, parent_fname, parent_model._table, 'id', parent_fname,
)
model, alias, field = parent_model, parent_alias, field.related_field
# handle the case where the field is translated
@@ -3057,8 +3058,7 @@ Fields:
cr, user, context, su = env.args
# make a query object for selecting ids, and apply security rules to it
- param_ids = object()
- query = Query(['"%s"' % self._table], ['"%s".id IN %%s' % self._table], [param_ids])
+ query = Query(self.env.cr, self._table)
self._apply_ir_rules(query, 'read')
# the query may involve several tables: we need fully-qualified names
@@ -3073,17 +3073,13 @@ Fields:
# selected fields are: 'id' followed by fields_pre
qual_names = [qualify(name) for name in [self._fields['id']] + fields_pre]
- # determine the actual query to execute
- from_clause, where_clause, params = query.get_sql()
- query_str = "SELECT %s FROM %s WHERE %s" % (",".join(qual_names), from_clause, where_clause)
-
- # fetch one list of record values per field
- param_pos = params.index(param_ids)
+ # determine the actual query to execute (last parameter is added below)
+ query.add_where('"%s".id IN %%s' % self._table)
+ query_str, params = query.select(*qual_names)
result = []
for sub_ids in cr.split_for_in_conditions(self.ids):
- params[param_pos] = tuple(sub_ids)
- cr.execute(query_str, params)
+ cr.execute(query_str, params + [sub_ids])
result += cr.fetchall()
else:
self.check_access_rule('read')
@@ -3325,21 +3321,18 @@ Fields:
if not self._ids:
return self
- quoted_table = '"%s"' % self._table
- query = Query([quoted_table])
+ query = Query(self._cr, self._table)
self._apply_ir_rules(query, operation)
if not query.where_clause:
return self
# detemine ids in database that satisfy ir.rules
valid_ids = set()
- from_clause, where_clause, where_params = query.get_sql()
- query_str = "SELECT {}.id FROM {} WHERE {} AND {}.id IN %s".format(
- quoted_table, from_clause, where_clause, quoted_table,
- )
+ query.add_where(f'"{self._table}".id IN %s')
+ query_str, params = query.select()
self._flush_search([])
for sub_ids in self._cr.split_for_in_conditions(self.ids):
- self._cr.execute(query_str, where_params + [sub_ids])
+ self._cr.execute(query_str, params + [sub_ids])
valid_ids.update(row[0] for row in self._cr.fetchall())
# return new ids without origin and ids with origin in valid_ids
@@ -4160,7 +4153,7 @@ Fields:
if domain:
return expression.expression(domain, self).query
else:
- return Query(['"%s"' % self._table])
+ return Query(self.env.cr, self._table)
def _check_qorder(self, word):
if not regex_order.match(word):
@@ -4203,10 +4196,8 @@ Fields:
:return: the qualified field name (or expression) to use for ``field``
"""
if self.env.lang:
- alias, alias_statement = query.add_join(
- (table_alias, 'ir_translation', 'id', 'res_id', field),
- implicit=False,
- outer=True,
+ alias = query.left_join(
+ table_alias, 'id', 'ir_translation', 'res_id', field,
extra='"{rhs}"."type" = \'model\' AND "{rhs}"."name" = %s AND "{rhs}"."lang" = %s AND "{rhs}"."value" != %s',
extra_params=["%s,%s" % (self._name, field), self.env.lang, ""],
)
@@ -4246,8 +4237,7 @@ Fields:
# Join the dest m2o table if it's not joined yet. We use [LEFT] OUTER join here
# as we don't want to exclude results that have NULL values for the m2o
- join = (alias, dest_model._table, order_field, 'id', order_field)
- dest_alias, _ = query.add_join(join, implicit=False, outer=True)
+ dest_alias = query.left_join(alias, order_field, dest_model._table, 'id', order_field)
return dest_model._generate_order_by_inner(dest_alias, m2o_order, query,
reverse_direction, seen)
@@ -4281,7 +4271,7 @@ Fields:
seen.add(key)
order_by_elements += self._generate_m2o_order_by(alias, order_field, query, do_reverse, seen)
elif field.store and field.column_type:
- qualifield_name = self._inherits_join_calc(alias, order_field, query, implicit=False, outer=True)
+ qualifield_name = self._inherits_join_calc(alias, order_field, query)
if field.type == 'boolean':
qualifield_name = "COALESCE(%s, false)" % qualifield_name
order_by_elements.append("%s %s" % (qualifield_name, order_direction))
@@ -4402,10 +4392,8 @@ Fields:
if count:
# Ignore order, limit and offset when just counting, they don't make sense and could
# hurt performance
- from_clause, where_clause, where_clause_params = query.get_sql()
- where_str = where_clause and (" WHERE %s" % where_clause) or ''
- query_str = 'SELECT count(1) FROM ' + from_clause + where_str
- self._cr.execute(query_str, where_clause_params)
+ query_str, params = query.select("count(1)")
+ self._cr.execute(query_str, params)
res = self._cr.fetchone()
return res[0]