# HG changeset patch # User Sergi Almacellas Abellana Add company domain issue5104 review19141003 Index: trytond/trytond/modules/analytic_account/account.py =================================================================== --- a/trytond/trytond/modules/analytic_account/account.py +++ b/trytond/trytond/modules/analytic_account/account.py @@ -8,7 +8,7 @@ from trytond import backend from trytond.model import ModelView, ModelSQL, fields, Unique from trytond.wizard import Wizard, StateView, StateAction, Button -from trytond.pyson import Eval, PYSONEncoder +from trytond.pyson import Eval, If, PYSONEncoder, PYSONDecoder from trytond.transaction import Transaction from trytond.pool import Pool @@ -22,7 +22,7 @@ name = fields.Char('Name', required=True, translate=True, select=True) code = fields.Char('Code', select=True) active = fields.Boolean('Active', select=True) - company = fields.Many2One('company.company', 'Company') + company = fields.Many2One('company.company', 'Company', required=True) currency = fields.Many2One('currency.currency', 'Currency', required=True) currency_digits = fields.Function(fields.Integer('Currency Digits'), 'on_change_with_currency_digits') @@ -311,19 +311,26 @@ __name__ = 'analytic.account.entry' origin = fields.Reference('Origin', selection='get_origin', select=True) root = fields.Many2One('analytic_account.account', 'Root Analytic', - domain=[('type', '=', 'root')]) + domain=[ + ('company', '=', Eval('company')), + ('type', '=', 'root'), + ], + depends=['company']) account = fields.Many2One('analytic_account.account', 'Account', ondelete='RESTRICT', states={ 'required': Eval('required', False), }, domain=[ + ('company', '=', Eval('company')), ('root', '=', Eval('root')), ('type', '=', 'normal'), ], - depends=['root', 'required']) + depends=['root', 'required', 'company']) required = fields.Function(fields.Boolean('Required'), 'on_change_with_required') + company = fields.Function(fields.Many2One('company.company', 'Company'), + 'on_change_with_company', searcher='search_company') @classmethod def __register__(cls, module_name): @@ -386,12 +393,27 @@ return self.root.mandatory return False + @classmethod + def default_company(cls): + return Transaction().context.get('company') + + def on_change_with_company(self, name=None): + return Transaction().context.get('company') + + @classmethod + def search_company(cls, name, clause): + raise NotImplementedError() + class AnalyticMixin(ModelSQL): analytic_accounts = fields.One2Many('analytic.account.entry', 'origin', 'Analytic Accounts', size=Eval('analytic_accounts_size', 0), + domain=[ + ('company', If(Eval('context', {}).contains('company'), '=', '!='), + Eval('context', {}).get('company', -1)), + ], depends=['analytic_accounts_size']) analytic_accounts_size = fields.Function(fields.Integer( 'Analytic Accounts Size'), 'get_analytic_accounts_size') @@ -427,13 +449,19 @@ where=entry.selection == selection_id)) handler.drop_column('analytic_accounts') - @staticmethod - def default_analytic_accounts(): + @classmethod + def analytic_accounts_domain(cls): + return PYSONDecoder(Transaction().context).decode( + PYSONEncoder().encode(cls.analytic_accounts.domain)) + + @classmethod + def default_analytic_accounts(cls): pool = Pool() AnalyticAccount = pool.get('analytic_account.account') accounts = [] - root_accounts = AnalyticAccount.search([ + root_accounts = AnalyticAccount.search( + cls.analytic_accounts_domain() + [ ('parent', '=', None), ]) for account in root_accounts: @@ -443,11 +471,14 @@ }) return accounts - @staticmethod - def default_analytic_accounts_size(): + @classmethod + def default_analytic_accounts_size(cls): pool = Pool() AnalyticAccount = pool.get('analytic_account.account') - return len(AnalyticAccount.search([('type', '=', 'root')])) + return len(AnalyticAccount.search( + cls.analytic_accounts_domain() + [ + ('type', '=', 'root'), + ])) @classmethod def get_analytic_accounts_size(cls, records, name): @@ -464,12 +495,17 @@ "Check that all mandatory root entries are defined in entries" pool = Pool() Account = pool.get('analytic_account.account') - mandatory_roots = {a for a in Account.search([ + all_mandatory_roots = {a for a in Account.search([ ('type', '=', 'root'), ('mandatory', '=', True), ])} for analytic in analytics: analytic_roots = {e.root for e in analytic.analytic_accounts} + companies = {e.company for e in analytic.analytic_accounts} + mandatory_roots = set() + for mandatory in all_mandatory_roots: + if mandatory.company in companies: + mandatory_roots.add(mandatory) if not mandatory_roots <= analytic_roots: cls.raise_user_error('root_account', { 'name': analytic.rec_name,