Skip to content

Commit

Permalink
Merge pull request #374 from acsone/ForgeFlow-13.0-mis_builder-fix-mu…
Browse files Browse the repository at this point in the history
…lticompany

[13.0] multi company improvements
  • Loading branch information
sbidoul authored Sep 30, 2021
2 parents a86d51c + d039e4e commit d5821bd
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 25 deletions.
38 changes: 26 additions & 12 deletions mis_builder/models/mis_report_instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -521,22 +521,22 @@ def _compute_pivot_date(self):
)
company_id = fields.Many2one(
comodel_name="res.company",
string="Company",
string="Allowed company",
default=lambda self: self.env.company,
required=True,
required=False,
)
multi_company = fields.Boolean(
string="Multiple companies",
help="Check if you wish to specify "
"children companies to be searched for data.",
help="Check if you wish to specify several companies to be searched for data.",
default=False,
)
company_ids = fields.Many2many(
comodel_name="res.company",
string="Companies",
string="Allowed companies",
help="Select companies for which data will be searched.",
)
query_company_ids = fields.Many2many(
string="Effective companies",
comodel_name="res.company",
compute="_compute_query_company_ids",
help="Companies for which data will be searched.",
Expand Down Expand Up @@ -572,22 +572,36 @@ def _compute_pivot_date(self):
)
hide_analytic_filters = fields.Boolean(default=True)

@api.onchange("company_id", "multi_company")
@api.onchange("multi_company")
def _onchange_company(self):
if self.company_id and self.multi_company:
self.company_ids = self.env["res.company"].search(
[("id", "child_of", self.company_id.id)]
)
if self.multi_company:
self.company_ids |= self.company_id
self.company_id = False
else:
prev = self.company_ids.ids
company = False
if self.env.company.id in prev:
company = self.env.company
else:
for c_id in prev:
if c_id in self.env.companies.ids:
company = self.env["res.company"].browse(c_id)
break

self.company_id = company
self.company_ids = False

@api.depends("multi_company", "company_id", "company_ids")
@api.depends_context("allowed_company_ids")
def _compute_query_company_ids(self):
for rec in self:
if rec.multi_company:
rec.query_company_ids = rec.company_ids or rec.company_id
if not rec.company_ids:
rec.query_company_ids = self.env.companies
else:
rec.query_company_ids = rec.company_ids & self.env.companies
else:
rec.query_company_ids = rec.company_id
rec.query_company_ids = rec.company_id or self.env.company

@api.model
def get_filter_descriptions_from_context(self):
Expand Down
2 changes: 2 additions & 0 deletions mis_builder/readme/newsfragments/327.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
The mis.report.instance should allow to define as many companies as the user is allowed to operate on when logged.
The company is only a required field if the flag 'multi_company' is not set.
3 changes: 2 additions & 1 deletion mis_builder/security/mis_builder_security.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
<field name="name">Mis Report Instance multi company</field>
<field name="model_id" ref="model_mis_report_instance" />
<field name="domain_force">
['|',('company_id','=',False),('company_id','in',company_ids)]
['|',('company_id','=',False),('company_id','in',company_ids), '|',
('company_ids', '=', False), ('company_ids', 'in', company_ids)]
</field>
</record>
</odoo>
41 changes: 32 additions & 9 deletions mis_builder/tests/test_mis_report_instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,32 @@ def test_kpi_expr_name_get_name_search(self):
r = self.env["mis.report.kpi.expression"].name_search("k4")
self.assertEqual([i[1] for i in r], ["kpi 4 (k4)"])

def test_query_company_ids(self):
# sanity check single company mode
assert not self.report_instance.multi_company
assert self.report_instance.company_id
assert self.report_instance.query_company_ids == self.report_instance.company_id
# create a second company
c1 = self.report_instance.company_id
c2 = self.env["res.company"].create(
dict(
name="company 2",
)
)
self.report_instance.write(dict(multi_company=True, company_id=False))
self.report_instance.company_ids |= c1
self.report_instance.company_ids |= c2
assert len(self.report_instance.company_ids) == 2
assert self.report_instance.query_company_ids == self.env.companies
# In a user context where there is only one company, ensure
# query_company_ids only has one company too.
assert (
self.report_instance.with_context(
allowed_company_ids=(c1.id,)
).query_company_ids
== c1
)

def test_multi_company_onchange(self):
# not multi company
self.assertTrue(self.report_instance.company_id)
Expand All @@ -509,25 +535,22 @@ def test_multi_company_onchange(self):
self.env["res.company"].create(
dict(name="company 2", parent_id=self.report_instance.company_id.id)
)
companies = self.env["res.company"].search(
[("id", "child_of", self.report_instance.company_id.id)]
)
self.report_instance.multi_company = True
# multi company, company_ids not set
self.assertEqual(
self.report_instance.query_company_ids[0], self.report_instance.company_id
)
self.assertEqual(self.report_instance.query_company_ids, self.env.companies)
# set company_ids
previous_company = self.report_instance.company_id
self.report_instance._onchange_company()
self.assertFalse(self.report_instance.company_id)
self.assertTrue(self.report_instance.multi_company)
self.assertEqual(self.report_instance.company_ids, companies)
self.assertEqual(self.report_instance.query_company_ids, companies)
self.assertEqual(self.report_instance.company_ids, previous_company)
self.assertEqual(self.report_instance.query_company_ids, previous_company)
# reset single company mode
self.report_instance.multi_company = False
self.report_instance._onchange_company()
self.assertEqual(
self.report_instance.query_company_ids[0], self.report_instance.company_id
)
self.report_instance._onchange_company()
self.assertFalse(self.report_instance.company_ids)

def test_mis_report_analytic_filters(self):
Expand Down
11 changes: 8 additions & 3 deletions mis_builder/views/mis_report_instance.xml
Original file line number Diff line number Diff line change
Expand Up @@ -161,20 +161,25 @@
<group name="filters">
<field name="target_move" widget="radio" />
<field
name="company_id"
name="multi_company"
groups="base.group_multi_company"
/>
<field
name="multi_company"
name="company_id"
groups="base.group_multi_company"
attrs="{'required': [('multi_company', '=', False)], 'invisible': [('multi_company', '=', True)]}"
/>
<field
name="company_ids"
groups="base.group_multi_company"
widget="many2many_tags"
domain="[('id', 'child_of', company_id)]"
attrs="{'invisible': [('multi_company', '=', False)]}"
/>
<field
name="query_company_ids"
groups="base.group_multi_company"
widget="many2many_tags"
/>
<field
name="analytic_account_id"
groups="analytic.group_analytic_accounting"
Expand Down

0 comments on commit d5821bd

Please sign in to comment.