Skip to content

Commit

Permalink
[MIG] operating_unit: Migration to 17.0
Browse files Browse the repository at this point in the history
  • Loading branch information
jdidderen-nsi committed Jun 24, 2024
1 parent a806254 commit 6773332
Show file tree
Hide file tree
Showing 10 changed files with 166 additions and 133 deletions.
2 changes: 1 addition & 1 deletion operating_unit/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"name": "Operating Unit",
"summary": "An operating unit (OU) is an organizational entity part of a "
"company",
"version": "16.0.1.0.2",
"version": "17.0.1.0.0",
"author": "ForgeFlow, "
"Serpent Consulting Services Pvt. Ltd., "
"Odoo Community Association (OCA)",
Expand Down
10 changes: 8 additions & 2 deletions operating_unit/data/operating_unit_data.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,16 @@
</record>
<record model="res.users" id="base.user_root">
<field name="default_operating_unit_id" ref="main_operating_unit" />
<field name="operating_unit_ids" eval="[(4, ref('main_operating_unit'))]" />
<field
name="assigned_operating_unit_ids"
eval="[(4, ref('main_operating_unit'))]"
/>
</record>
<record model="res.users" id="base.user_admin">
<field name="default_operating_unit_id" ref="main_operating_unit" />
<field name="operating_unit_ids" eval="[(4, ref('main_operating_unit'))]" />
<field
name="assigned_operating_unit_ids"
eval="[(4, ref('main_operating_unit'))]"
/>
</record>
</odoo>
1 change: 1 addition & 0 deletions operating_unit/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from . import ir_rule
from . import operating_unit
from . import res_users
20 changes: 20 additions & 0 deletions operating_unit/models/ir_rule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2024 NSI-SA
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).


from odoo import api, models


class IrRule(models.Model):
_inherit = "ir.rule"

@api.model
def _eval_context(self):
res = super()._eval_context()
res.update(
{
"operating_unit_ids": self.env.user.operating_units().ids,
"operating_unit_id": self.env.user.default_operating_unit_id.id,
}
)
return res
14 changes: 5 additions & 9 deletions operating_unit/models/operating_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,22 +41,18 @@ class OperatingUnit(models.Model):
),
]

def name_get(self):
res = []
@api.depends("name", "code")
def _compute_display_name(self):
for ou in self:
name = ou.name
if ou.code:
name = f"[{ou.code}] {name}"
res.append((ou.id, name))
return res
ou.display_name = f"[{ou.code}] {ou.name}"

@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
res.write({"user_ids": [fields.Command.link(self.env.user.id)]})
self.clear_caches()
self.env.registry.clear_cache()
return res

def write(self, vals):
self.clear_caches()
self.env.registry.clear_cache()
return super().write(vals)
109 changes: 54 additions & 55 deletions operating_unit/models/res_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,33 +8,6 @@
class ResUsers(models.Model):
_inherit = "res.users"

@api.model
def operating_unit_default_get(self, uid2=False):
if not uid2:
uid2 = self.env.user.id
user = self.env["res.users"].browse(uid2)
# check if the company of the default OU is active
if user.default_operating_unit_id.sudo().company_id in self.env.companies:
return user.default_operating_unit_id
else:
# find an OU of the main active company
for ou in user.assigned_operating_unit_ids:
if ou.sudo().company_id in self.env.company:
return ou
# find an OU of any active company
for ou in user.assigned_operating_unit_ids:
if ou.sudo().company_id in self.env.companies:
return ou
return False

@api.model
def _default_operating_unit(self):
return self.operating_unit_default_get()

@api.model
def _default_operating_units(self):
return self._default_operating_unit()

operating_unit_ids = fields.One2many(
comodel_name="operating.unit",
compute="_compute_operating_unit_ids",
Expand All @@ -49,7 +22,7 @@ def _default_operating_units(self):
column1="user_id",
column2="operating_unit_id",
string="Operating Units",
default=lambda self: self._default_operating_units(),
default=lambda self: self._default_operating_unit(),
)

default_operating_unit_id = fields.Many2one(
Expand All @@ -59,36 +32,32 @@ def _default_operating_units(self):
domain="[('company_id', '=', current_company_id)]",
)

@api.onchange("operating_unit_ids")
def _onchange_operating_unit_ids(self):
for record in self:
if (
record.default_operating_unit_id
and record.default_operating_unit_id
not in record.operating_unit_ids._origin
):
record.default_operating_unit_id = False
@api.model
def _get_default_operating_unit(self, uid2=False):
if not uid2:
uid2 = self.env.user.id
user = self.env["res.users"].browse(uid2)
# check if the company of the default OU is active
if user.default_operating_unit_id.sudo().company_id in self.env.companies:
return user.default_operating_unit_id
else:
# find an OU of the main active company
for ou in user.assigned_operating_unit_ids:
if ou.sudo().company_id in self.env.company:
return ou
# find an OU of any active company
for ou in user.assigned_operating_unit_ids:
if ou.sudo().company_id in self.env.companies:
return ou

Check warning on line 51 in operating_unit/models/res_users.py

View check run for this annotation

Codecov / codecov/patch

operating_unit/models/res_users.py#L51

Added line #L51 was not covered by tests
return False

@api.depends("groups_id", "assigned_operating_unit_ids")
def _compute_operating_unit_ids(self):
for user in self:
if user._origin.has_group("operating_unit.group_manager_operating_unit"):
dom = []
if self.env.context.get("allowed_company_ids"):
dom = [
"|",
("company_id", "=", False),
("company_id", "in", self.env.context["allowed_company_ids"]),
]
else:
dom = []
user.operating_unit_ids = self.env["operating.unit"].sudo().search(dom)
else:
user.operating_unit_ids = user.assigned_operating_unit_ids
@api.model
def _default_operating_unit(self):
return self._get_default_operating_unit()

@api.model
def default_get(self, fields):
vals = super(ResUsers, self).default_get(fields)
vals = super().default_get(fields)
if (
self.env["ir.config_parameter"]
.sudo()
Expand All @@ -102,7 +71,37 @@ def default_get(self, fields):
vals["operating_unit_ids"] = [(6, 0, default_user.operating_unit_ids.ids)]
return vals

@api.depends("groups_id", "assigned_operating_unit_ids")
def _compute_operating_unit_ids(self):
for user in self:
if user._origin.has_group("operating_unit.group_manager_operating_unit"):
if self.env.context.get("allowed_company_ids"):
dom = [

Check warning on line 79 in operating_unit/models/res_users.py

View check run for this annotation

Codecov / codecov/patch

operating_unit/models/res_users.py#L79

Added line #L79 was not covered by tests
"|",
("company_id", "=", False),
("company_id", "in", self.env.context["allowed_company_ids"]),
]
else:
dom = []

user.operating_unit_ids = self.env["operating.unit"].sudo().search(dom)
else:
user.operating_unit_ids = user.assigned_operating_unit_ids

def _inverse_operating_unit_ids(self):
for user in self:
user.assigned_operating_unit_ids = user.operating_unit_ids
self.clear_caches()
self.env.registry.clear_cache()

@api.onchange("operating_unit_ids")
def _onchange_operating_unit_ids(self):
for record in self:
if (
record.default_operating_unit_id
and record.default_operating_unit_id
not in record.operating_unit_ids._origin
):
record.default_operating_unit_id = False

def operating_units(self):
return self.env.user.operating_unit_ids
2 changes: 1 addition & 1 deletion operating_unit/security/operating_unit_security.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
</record>
<record id="ir_rule_operating_unit_allowed_operating_units" model="ir.rule">
<field name="model_id" ref="model_operating_unit" />
<field name="domain_force">[('id','in',user.operating_unit_ids.ids)]</field>
<field name="domain_force">[('id','in',operating_unit_ids)]</field>
<field name="name">Allowed operating units</field>
<field eval="0" name="perm_unlink" />
<field eval="0" name="perm_write" />
Expand Down
1 change: 1 addition & 0 deletions operating_unit/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from . import common
from . import test_operating_unit
67 changes: 67 additions & 0 deletions operating_unit/tests/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# © 2017-TODAY ForgeFlow S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)

from odoo.models import Command
from odoo.tests import common


class OperatingUnitCommon(common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.res_users_model = cls.env["res.users"].with_context(
tracking_disable=True, no_reset_password=True
)
# Groups
cls.grp_ou_mngr = cls.env.ref("operating_unit.group_manager_operating_unit")
cls.grp_ou_multi = cls.env.ref("operating_unit.group_multi_operating_unit")
# Company
cls.company = cls.env.ref("base.main_company")
cls.company_2 = cls.env["res.company"].create({"name": "Second company"})
# Main Operating Unit
cls.ou1 = cls.env.ref("operating_unit.main_operating_unit")
# B2C Operating Unit
cls.b2c = cls.env.ref("operating_unit.b2c_operating_unit")
# B2B Operating Unit
cls.b2b = cls.env.ref("operating_unit.b2b_operating_unit")
# Create User 1 with Main OU
cls.user1 = cls._create_user("user_1", cls.grp_ou_mngr, cls.company, cls.ou1)
# Create User 2 with B2C OU
cls.user2 = cls._create_user("user_2", cls.grp_ou_multi, cls.company, cls.b2c)
# Partner
cls.partner1 = cls.env.ref("base.res_partner_1")

@classmethod
def _create_user(cls, login, group, company, operating_units, context=None):
"""Create a user."""
user = cls.res_users_model.create(
{
"name": "Test User",
"login": login,
"password": "demo",
"email": "test@yourcompany.com",
"company_id": company.id,
"company_ids": [(4, company.id)],
"operating_unit_ids": [(4, ou.id) for ou in operating_units],
"groups_id": [Command.link(group.id)],
}
)
return user

def _create_operating_unit(self, uid, name, code, company_id=None):
"""Create Operating Unit"""
if company_id is None:
company_id = self.company
ou = (
self.env["operating.unit"]
.with_user(uid)
.create(
{
"name": name,
"code": code,
"partner_id": company_id.partner_id.id,
"company_id": company_id.id,
}
)
)
return ou
Loading

0 comments on commit 6773332

Please sign in to comment.