first commit
This commit is contained in:
96
modules/company/model.py
Normal file
96
modules/company/model.py
Normal file
@@ -0,0 +1,96 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user