diff --git a/CHANGELOG b/CHANGELOG index 22426bdb70..1ffe67b1fa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add test on context of company multivalue target fields * Use report header for CompanyReport Version 5.8.0 - 2020-11-02 diff --git a/company.py b/company.py index 78fdcb2181..159e0a6eb4 100644 --- a/company.py +++ b/company.py @@ -55,6 +55,10 @@ class Employee(ModelSQL, ModelView): 'Employee' __name__ = 'company.employee' party = fields.Many2One('party.party', 'Party', required=True, + context={ + 'company': Eval('company', -1), + }, + depends=['company'], help="The party which represents the employee.") company = fields.Many2One('company.company', 'Company', required=True, help="The company to which the employee belongs.") diff --git a/party.py b/party.py index 5468279bc5..34ef92f197 100644 --- a/party.py +++ b/party.py @@ -2,6 +2,7 @@ # this repository contains the full copyright notices and license terms. from trytond import backend from trytond.pool import PoolMeta, Pool +from trytond.pyson import Eval from trytond.tools.multivalue import migrate_property from trytond.transaction import Transaction @@ -39,6 +40,13 @@ class Party(CompanyMultiValueMixin, metaclass=PoolMeta): class PartyLang(CompanyValueMixin, metaclass=PoolMeta): __name__ = 'party.party.lang' + @classmethod + def __setup__(cls): + super().__setup__() + cls.party.context['company'] = Eval('company', -1) + if 'company' not in cls.party.depends: + cls.party.depends.append('company') + @classmethod def __register__(cls, module_name): exist = backend.TableHandler.table_exist(cls._table) diff --git a/tests/__init__.py b/tests/__init__.py index 12e1dd30a6..531f4832ed 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -4,12 +4,12 @@ try: from trytond.modules.company.tests.test_company import ( suite, create_company, set_company, create_employee, - PartyCompanyCheckEraseMixin) + PartyCompanyCheckEraseMixin, CompanyMultiValueTestMixin) except ImportError: from .test_company import ( suite, create_company, set_company, create_employee, - PartyCompanyCheckEraseMixin) + PartyCompanyCheckEraseMixin, CompanyMultiValueTestMixin) __all__ = [ 'suite', 'create_company', 'set_company', 'create_employee', - 'PartyCompanyCheckEraseMixin'] + 'PartyCompanyCheckEraseMixin', 'CompanyMultiValueTestMixin'] diff --git a/tests/test_company.py b/tests/test_company.py index 2af17c489e..94b014c269 100644 --- a/tests/test_company.py +++ b/tests/test_company.py @@ -6,11 +6,13 @@ from contextlib import contextmanager import trytond.tests.test_tryton from trytond.tests.test_tryton import ModuleTestCase, with_transaction from trytond.transaction import Transaction -from trytond.pool import Pool +from trytond.pool import Pool, isregisteredby from trytond.modules.currency.tests import create_currency, add_currency_rate from trytond.modules.party.tests import PartyCheckEraseMixin +from ..model import CompanyMultiValueMixin + def create_company(name='Dunder Mifflin', currency=None): pool = Pool() @@ -63,7 +65,42 @@ class PartyCompanyCheckEraseMixin(PartyCheckEraseMixin): return super().setup_check_erase_party() -class CompanyTestCase(PartyCompanyCheckEraseMixin, ModuleTestCase): +class CompanyMultiValueTestMixin: + + @with_transaction() + def test_company_multivalue_context(self): + "Test context of company multivalue target" + pool = Pool() + Company = pool.get('company.company') + for mname, model in pool.iterobject(): + if (not isregisteredby(model, self.module) + or issubclass(model, Company)): + continue + company = None + for fname, field in model._fields.items(): + if (field._type == 'many2one' + and issubclass(field.get_target(), Company)): + company = fname + break + else: + continue + for fname, field in model._fields.items(): + if not hasattr(field, 'get_target'): + continue + Target = field.get_target() + if not issubclass(Target, CompanyMultiValueMixin): + continue + if company in model._fields: + self.assertIn( + 'company', list(field.context.keys()), + msg="Missing '%s' value as company " + 'in "%s"."%s" context' % ( + company, mname, fname)) + + +class CompanyTestCase( + PartyCompanyCheckEraseMixin, CompanyMultiValueTestMixin, + ModuleTestCase): 'Test Company module' module = 'company'