Files
tryton/common.py
T

181 lines
6.2 KiB
Python
Raw Normal View History

2018-08-31 14:58:05 +02:00
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime
from sql import Literal
2018-08-31 14:58:05 +02:00
from sql.conditionals import Coalesce
from trytond.model import Model, fields
from trytond.pool import Pool
2021-12-11 17:58:41 +01:00
from trytond.pyson import Bool, Eval, If
2018-08-31 14:58:05 +02:00
from trytond.transaction import Transaction
class PeriodMixin(Model):
start_date = fields.Date(
"Start Date",
domain=[
If(Eval('start_date') & Eval('end_date'),
('start_date', '<=', Eval('end_date')),
()),
])
2018-08-31 14:58:05 +02:00
end_date = fields.Date(
"End Date",
domain=[
If(Eval('start_date') & Eval('end_date'),
('end_date', '>=', Eval('start_date')),
()),
])
2018-08-31 14:58:05 +02:00
@classmethod
def __setup__(cls):
super().__setup__()
if (hasattr(cls, 'parent')
and hasattr(cls, 'childs')
and hasattr(cls, 'company')):
cls.parent.domain = [
('company', '=', Eval('company', 0)),
2018-08-31 14:58:05 +02:00
['OR',
If(Bool(Eval('start_date')),
('start_date', '>=', Eval('start_date', None)),
()),
('start_date', '=', None),
],
['OR',
If(Bool(Eval('end_date')),
('end_date', '<=', Eval('end_date', None)),
()),
('end_date', '=', None),
],
]
cls.parent.depends.update({'company', 'start_date', 'end_date'})
2018-08-31 14:58:05 +02:00
cls.childs.domain = [
('company', '=', Eval('company', 0)),
2018-08-31 14:58:05 +02:00
If(Bool(Eval('start_date')),
('start_date', '>=', Eval('start_date', None)),
()),
If(Bool(Eval('end_date')),
('end_date', '<=', Eval('end_date', None)),
()),
]
cls.childs.depends.update({'company', 'start_date', 'end_date'})
2018-08-31 14:58:05 +02:00
class ActivePeriodMixin(PeriodMixin):
active = fields.Function(fields.Boolean("Active"), 'on_change_with_active')
2018-08-31 14:58:05 +02:00
@classmethod
def _active_dates(cls):
pool = Pool()
Date = pool.get('ir.date')
FiscalYear = pool.get('account.fiscalyear')
Period = pool.get('account.period')
context = Transaction().context
today = Date.today()
date = context.get('date')
from_date, to_date = context.get('from_date'), context.get('to_date')
period_ids = context.get('periods')
fiscalyear_id = context.get('fiscalyear')
if date:
fiscalyears = FiscalYear.search([
('start_date', '<=', date),
('end_date', '>=', date),
])
elif from_date or to_date:
domain = []
if from_date:
domain.append(('end_date', '>=', from_date))
if to_date:
domain.append(('start_date', '<=', to_date))
fiscalyears = FiscalYear.search(domain)
elif period_ids:
periods = Period.browse(period_ids)
fiscalyears = list(set(p.fiscalyear for p in periods))
elif fiscalyear_id:
fiscalyears = FiscalYear.browse([fiscalyear_id])
else:
fiscalyears = FiscalYear.search([
('start_date', '<=', today),
('end_date', '>=', today),
], limit=1)
if not fiscalyears:
return (from_date or date or today, to_date or date or today)
return (
min(f.start_date for f in fiscalyears),
max(f.end_date for f in fiscalyears))
@classmethod
def default_active(cls):
return True
@fields.depends('start_date', 'end_date')
def on_change_with_active(self, name=None):
2018-08-31 14:58:05 +02:00
from_date, to_date = self._active_dates()
start_date = self.start_date or datetime.date.min
end_date = self.end_date or datetime.date.max
return (start_date <= to_date <= end_date
or start_date <= from_date <= end_date
or (from_date <= start_date and end_date <= to_date))
@classmethod
def domain_active(cls, domain, tables):
table, _ = tables[None]
2018-08-31 14:58:05 +02:00
_, operator, value = domain
from_date, to_date = cls._active_dates()
start_date = Coalesce(table.start_date, datetime.date.min)
end_date = Coalesce(table.end_date, datetime.date.max)
2022-05-31 23:46:14 +02:00
expression = (((start_date <= to_date) & (end_date >= to_date))
2018-08-31 14:58:05 +02:00
| ((start_date <= from_date) & (end_date >= from_date))
| ((start_date >= from_date) & (end_date <= to_date)))
2022-05-31 23:46:14 +02:00
if operator in {'=', '!='}:
if (operator == '=') != value:
expression = ~expression
elif operator in {'in', 'not in'}:
if True in value and False not in value:
pass
elif False in value and True not in value:
expression = ~expression
else:
expression = Literal(True)
else:
expression = Literal(True)
return expression
2022-07-18 00:04:04 +02:00
class ContextCompanyMixin(Model):
context_company = fields.Function(fields.Boolean("Context Company"),
'get_context_company')
def get_context_company(self, name):
context = Transaction().context
return self.company.id == context.get('company')
@classmethod
def domain_context_company(cls, domain, tables):
context = Transaction().context
table, _ = tables[None]
_, operator, value = domain
expression = table.company == context.get('company')
if operator in {'=', '!='}:
if (operator == '=') != value:
expression = ~expression
elif operator in {'in', 'not in'}:
if True in value and False not in value:
pass
elif False in value and True not in value:
expression = ~expression
else:
expression = Literal(True)
else:
expression = Literal(True)
return expression