Skip to content
Snippets Groups Projects
Commit 443dcda2 authored by Malay Khamar's avatar Malay Khamar Committed by Victor Feyens
Browse files

[FIX] (*_)sale(_*): sale report inheritance.


Provide a hook for clean specification of additional fields, without
relying on risky default dict method parameters.

Use the existing `_group_by_sale` to cleanly add additional
"group by" information.

Backport of 9c7bdb95

closes odoo/odoo#107702

Signed-off-by: default avatarVictor Feyens (vfe) <vfe@odoo.com>
Co-authored-by: default avatarVictor Feyens <vfe@odoo.com>
parent e2d154e8
No related branches found
No related tags found
No related merge requests found
......@@ -107,7 +107,8 @@ class SaleReport(models.Model):
if not fields:
fields = {}
res = super()._query(with_clause, fields, groupby, from_clause)
sale_fields = self._select_additional_fields(fields)
current = '(SELECT %s FROM %s GROUP BY %s)' % \
(self._select_pos(fields), self._from_pos(), self._group_by_pos())
(self._select_pos(sale_fields), self._from_pos(), self._group_by_pos())
return '%s UNION ALL %s' % (res, current)
......@@ -144,12 +144,23 @@ class SaleReport(models.Model):
""" % (groupby)
return groupby_
def _select_additional_fields(self, fields):
"""Hook to return additional fields SQL specification for select part of the table query.
:param dict fields: additional fields info provided by _query overrides (old API), prefer overriding
_select_additional_fields instead.
:returns: mapping field -> SQL computation of the field
:rtype: dict
"""
return fields
def _query(self, with_clause='', fields=None, groupby='', from_clause=''):
if not fields:
fields = {}
sale_report_fields = self._select_additional_fields(fields)
with_ = ("WITH %s" % with_clause) if with_clause else ""
return '%s (SELECT %s FROM %s WHERE l.display_type IS NULL GROUP BY %s)' % \
(with_, self._select_sale(fields), self._from_sale(from_clause), self._group_by_sale(groupby))
(with_, self._select_sale(sale_report_fields), self._from_sale(from_clause), self._group_by_sale(groupby))
def init(self):
# self._table = sale_report
......
......@@ -9,6 +9,6 @@ class SaleReport(models.Model):
margin = fields.Float('Margin')
def _query(self, with_clause='', fields={}, groupby='', from_clause=''):
def _select_additional_fields(self, fields):
fields['margin'] = ", SUM(l.margin / CASE COALESCE(s.currency_rate, 0) WHEN 0 THEN 1.0 ELSE s.currency_rate END) AS margin"
return super(SaleReport, self)._query(with_clause, fields, groupby, from_clause)
return super()._select_additional_fields(fields)
......@@ -9,7 +9,11 @@ class SaleReport(models.Model):
warehouse_id = fields.Many2one('stock.warehouse', 'Warehouse', readonly=True)
def _query(self, with_clause='', fields={}, groupby='', from_clause=''):
def _group_by_sale(self, groupby=''):
res = super()._group_by_sale(groupby)
res += """, s.warehouse_id"""
return res
def _select_additional_fields(self, fields):
fields['warehouse_id'] = ", s.warehouse_id as warehouse_id"
groupby += ', s.warehouse_id'
return super(SaleReport, self)._query(with_clause, fields, groupby, from_clause)
return super()._select_additional_fields(fields)
......@@ -8,7 +8,11 @@ class SaleReport(models.Model):
website_id = fields.Many2one('website', readonly=True)
def _query(self, with_clause='', fields={}, groupby='', from_clause=''):
def _group_by_sale(self, groupby=''):
res = super()._group_by_sale(groupby)
res += """,s.website_id"""
return res
def _select_additional_fields(self, fields):
fields['website_id'] = ", s.website_id as website_id"
groupby += ', s.website_id'
return super(SaleReport, self)._query(with_clause, fields, groupby, from_clause)
return super()._select_additional_fields(fields)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment