97 lines
3.4 KiB
Python
97 lines
3.4 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the toplevel of this
|
|
# repository contains the full copyright notices and license terms.
|
|
import functools
|
|
|
|
from trytond.model import MultiValueMixin, ValueMixin, fields
|
|
from trytond.pool import Pool
|
|
from trytond.pyson import Eval
|
|
from trytond.transaction import Transaction
|
|
|
|
__all__ = ['CompanyMultiValueMixin', 'CompanyValueMixin',
|
|
'set_employee', 'reset_employee', 'employee_field']
|
|
|
|
|
|
class CompanyMultiValueMixin(MultiValueMixin):
|
|
__slots__ = ()
|
|
|
|
def multivalue_records(self, field):
|
|
Value = self.multivalue_model(field)
|
|
records = super().multivalue_records(field)
|
|
if issubclass(Value, CompanyValueMixin):
|
|
# Sort to get record with empty company at the end
|
|
# and so give priority to record with company filled.
|
|
records = sorted(records, key=lambda r: r.company is None)
|
|
return records
|
|
|
|
def get_multivalue(self, name, **pattern):
|
|
Value = self.multivalue_model(name)
|
|
if issubclass(Value, CompanyValueMixin):
|
|
pattern.setdefault('company', Transaction().context.get('company'))
|
|
return super().get_multivalue(
|
|
name, **pattern)
|
|
|
|
def set_multivalue(self, name, value, save=True, **pattern):
|
|
Value = self.multivalue_model(name)
|
|
if issubclass(Value, CompanyValueMixin):
|
|
pattern.setdefault('company', Transaction().context.get('company'))
|
|
return super().set_multivalue(
|
|
name, value, save=save, **pattern)
|
|
|
|
|
|
class CompanyValueMixin(ValueMixin):
|
|
__slots__ = ()
|
|
company = fields.Many2One('company.company', "Company", ondelete='CASCADE')
|
|
|
|
|
|
def employee_field(string, states=None, company='company'):
|
|
if states is None:
|
|
states = ['done', 'cancel', 'cancelled']
|
|
return fields.Many2One(
|
|
'company.employee', string,
|
|
domain=[('company', '=', Eval(company, -1))],
|
|
states={
|
|
'readonly': Eval('state').in_(states),
|
|
})
|
|
|
|
|
|
def set_employee(field, company='company', when='after'):
|
|
def decorator(func):
|
|
@functools.wraps(func)
|
|
def wrapper(cls, records, *args, **kwargs):
|
|
pool = Pool()
|
|
User = pool.get('res.user')
|
|
user = User(Transaction().user)
|
|
|
|
if when == 'after':
|
|
result = func(cls, records, *args, **kwargs)
|
|
employee = user.employee
|
|
if employee:
|
|
emp_company = employee.company
|
|
cls.write(
|
|
[r for r in records
|
|
if not getattr(r, field)
|
|
and getattr(r, company) == emp_company], {
|
|
field: employee.id,
|
|
})
|
|
if when == 'before':
|
|
result = func(cls, records, *args, **kwargs)
|
|
return result
|
|
return wrapper
|
|
assert when in {'before', 'after'}
|
|
return decorator
|
|
|
|
|
|
def reset_employee(*fields, when='after'):
|
|
def decorator(func):
|
|
@functools.wraps(func)
|
|
def wrapper(cls, records, *args, **kwargs):
|
|
if when == 'after':
|
|
result = func(cls, records, *args, **kwargs)
|
|
cls.write(records, {f: None for f in fields})
|
|
if when == 'before':
|
|
result = func(cls, records, *args, **kwargs)
|
|
return result
|
|
return wrapper
|
|
assert when in {'before', 'after'}
|
|
return decorator
|