Files
tradon/modules/marketing_campaign/sale_reporting.py
2026-03-14 09:42:12 +00:00

111 lines
3.8 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from sql import Column, Literal
from trytond.i18n import lazy_gettext
from trytond.model import ModelView, fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
try:
from trytond.modules.sale.sale_reporting import Abstract
from trytond.modules.sale.sale_reporting import Context as BaseContext
except ImportError:
Abstract = object
BaseContext = object
from .marketing import MarketingCampaignMixin
class AbstractMarketingCampaign:
__slots__ = ()
@classmethod
def _marketing_campaign_fields(cls):
pool = Pool()
Context = pool.get('sale.reporting.context')
if hasattr(Context, 'marketing_campaign_fields'):
yield from Context.marketing_campaign_fields()
@classmethod
def _sale_line_columns(cls, line, sale):
return super()._sale_line_columns(line, sale) + [
Column(sale, fname).as_(fname)
for fname in cls._marketing_campaign_fields()]
@classmethod
def _pos_sale_line_columns(cls, line, point, sale, currency):
return super()._pos_sale_line_columns(line, point, sale, currency) + [
Column(sale, fname).as_(fname)
for fname in cls._marketing_campaign_fields()]
@classmethod
def _where(cls, tables, withs):
context = Transaction().context
where = super()._where(tables, withs)
line = tables['line']
for fname in cls._marketing_campaign_fields():
value = context.get(fname)
if value:
where &= Column(line, fname) == value
return where
class Context(MarketingCampaignMixin, metaclass=PoolMeta):
__name__ = 'sale.reporting.context'
@classmethod
def default_get(
cls, fields_names=None, with_rec_name=True, with_default=True):
transaction = Transaction()
context = transaction.context
default = super().default_get(
fields_names=fields_names,
with_rec_name=with_rec_name,
with_default=with_default)
for fname in cls.marketing_campaign_fields():
if isinstance(context.get(fname), (int, float)):
default.setdefault(fname, int(context[fname]))
return default
class MarketingContext(BaseContext):
__name__ = 'sale.reporting.marketing.context'
group_by_marketing_campaign = fields.Boolean(
lazy_gettext('marketing_campaign.msg_marketing_campaign'))
group_by_marketing_medium = fields.Boolean(
lazy_gettext('marketing_campaign.msg_marketing_medium'))
group_by_marketing_source = fields.Boolean(
lazy_gettext('marketing_campaign.msg_marketing_source'))
class Marketing(MarketingCampaignMixin, ModelView, Abstract):
__name__ = 'sale.reporting.marketing'
@classmethod
def _columns(cls, tables, withs):
context = Transaction().context
line = tables['line']
return super()._columns(tables, withs) + [
(Column(line, fname)
if context.get('group_by_%s' % fname)
else Literal(None)).as_(fname)
for fname in cls._marketing_campaign_fields()]
@classmethod
def _group_by(cls, tables, withs):
context = Transaction().context
line = tables['line']
return super()._group_by(tables, withs) + [
Column(line, fname).as_(fname)
for fname in cls._marketing_campaign_fields()
if context.get('group_by_%s' % fname)]
def get_rec_name(self, name):
return ', '.join(
getattr(self, fname).rec_name
for fname in self._marketing_campaign_fields()
if getattr(self, fname))