fsm_equipment: consolidate components into a parent-child relationship in equipment

This commit is contained in:
Marc Durepos 2024-10-24 15:05:17 -04:00
parent 0a6f048708
commit bb9ad5afbe
8 changed files with 65 additions and 51 deletions

View file

@ -19,13 +19,13 @@
#
{
"name": "FSM Equipment",
"version": "17.0.0.1.2",
"version": "17.0.0.2.0",
"summary": "Add the notion of client equipment for Field Service",
"category": "Services/Field Service",
"author": "Bemade Inc.",
"website": "http://www.bemade.org",
"license": "LGPL-3",
"depends": ["industry_fsm", "account", "contacts"],
"depends": ["industry_fsm", "account", "contacts", "incrementing_sequence_mixin"],
"data": [
"security/ir.model.access.csv",
"views/equipment_views.xml",

View file

@ -0,0 +1,35 @@
from odoo import SUPERUSER_ID, api, Command
from odoo.tools.sql import SQL
def migrate(cr, version):
sql = "select * from equipment_component"
cr.execute(SQL(sql))
components = cr.dictfetchall()
sql = "select * from fsm_equipment_component_purpose"
cr.execute(SQL(sql))
purposes = cr.dictfetchall()
env = api.Environment(cr, SUPERUSER_ID, {})
tags = env["fsm.equipment.tag"].create(
[{"name": purpose["name"]} for purpose in purposes]
)
purpose_dict = {
purpose["id"]: tags.filtered(lambda tag: tag.name == purpose["name"]).id
for purpose in purposes
}
env["fsm.equipment"].create(
[
{
"name": component["name"],
"sequence": component["sequence"],
"tag_ids": [Command.link(purpose_dict[component["purpose_id"]])],
"parent_id": component["equipment_id"],
"description": component["note"],
"product_id": component["product_id"],
}
for component in components
]
)

View file

@ -1,5 +1,4 @@
from . import equipment_tag
from . import equipment
from . import res_partner
from . import equipment_component
from . import task

View file

@ -5,7 +5,8 @@ from odoo.osv import expression
class Equipment(models.Model):
_name = "fsm.equipment"
_description = "Partner-Owned Equipment"
_inherit = ["mail.thread", "mail.activity.mixin"]
_inherit = ["mail.thread", "mail.activity.mixin", "incrementing.sequence.mixin"]
_sequence_group = "parent_id"
code = fields.Char(
tracking=True,
@ -50,12 +51,24 @@ class Equipment(models.Model):
tracking=True,
)
equipment_component_ids = fields.One2many(
"fsm.equipment.component",
inverse_name="equipment_id",
parent_id = fields.Many2one(
"fsm.equipment",
tracking=True,
)
child_ids = fields.One2many(
"fsm.equipment",
inverse_name="parent_id",
string="Components",
tracking=True,
)
product_id = fields.Many2one(
"product.product",
ondelete="restrict",
help="The product that represents this equipment, if any.",
)
@api.model
def name_search(self, name="", args=None, operator="ilike", limit=100):

View file

@ -1,34 +0,0 @@
from odoo import models, fields, api
class EquipmentComponent(models.Model):
_name = "fsm.equipment.component"
_description = "Equipment Component"
sequence = fields.Integer()
name = fields.Char()
product_id = fields.Many2one(
"product.product",
ondelete="cascade",
)
purpose_id = fields.Many2one(
"fsm.equipment.component.purpose",
ondelete="restrict",
)
equipment_id = fields.Many2one(
"fsm.equipment",
ondelete="cascade",
)
note = fields.Text()
@api.onchange("product_id")
def onchange_product_id(self):
for rec in self:
rec.name = rec.product_id.display_name
class EquipmentComponentPurpose(models.Model):
_name = "fsm.equipment.component.purpose"
_description = "Component Purpose"
name = fields.Char(translate=True)

View file

@ -1,6 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_fsm_equipment,fsm_equipment,model_fsm_equipment,base.group_user,1,1,1,1
access_fsm_equipment_tag,fsm_equipment_tag,model_fsm_equipment_tag,base.group_user,1,1,1,1
access_fsm_equipment_component,fsm_equipment_component,model_fsm_equipment_component,industry_fsm.group_fsm_user,1,1,1,1
access_fsm_equipment_component_purpose_user,access_fsm_equipment_component_purpose_user,model_fsm_equipment_component_purpose,industry_fsm.group_fsm_user,1,0,0,0
access_fsm_equipment_component_purpose_manager,access_fsm_equipment_component_purpose_manager,model_fsm_equipment_component_purpose,industry_fsm.group_fsm_manager,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_fsm_equipment fsm_equipment model_fsm_equipment base.group_user 1 1 1 1
3 access_fsm_equipment_tag fsm_equipment_tag model_fsm_equipment_tag base.group_user 1 1 1 1
access_fsm_equipment_component fsm_equipment_component model_fsm_equipment_component industry_fsm.group_fsm_user 1 1 1 1
access_fsm_equipment_component_purpose_user access_fsm_equipment_component_purpose_user model_fsm_equipment_component_purpose industry_fsm.group_fsm_user 1 0 0 0
access_fsm_equipment_component_purpose_manager access_fsm_equipment_component_purpose_manager model_fsm_equipment_component_purpose industry_fsm.group_fsm_manager 1 1 1 1

View file

@ -32,13 +32,13 @@
</group>
<notebook>
<page string="Components">
<field name="equipment_component_ids">
<field name="child_ids">
<tree editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="product_id"/>
<field name="purpose_id"/>
<field name="note"/>
<field name="tag_ids" widget="many2many_tags"/>
<field name="description"/>
</tree>
</field>
</page>

View file

@ -25,9 +25,11 @@ class IncrementingSequenceMixin(models.AbstractModel):
group_field_data = getattr(rec, group_field)
if hasattr(group_field_data, "id"):
group_field_data = group_field_data.id
group = self.env[rec._name].search(
[(group_field, "=", group_field_data)]
)
group = self.env[rec._name].search(
[(group_field, "=", group_field_data)]
)
else:
group = None
max_seq = max(group.mapped("sequence")) if group else 0
rec.sequence = max_seq + 1
return res
@ -37,7 +39,9 @@ class IncrementingSequenceMixin(models.AbstractModel):
group_field_data = getattr(self, group_field)
if hasattr(group_field_data, "id"):
group_field_data = group_field_data.id
group = self.env[self._name].search([(group_field, "=", group_field_data)])
group = self.env[self._name].search([(group_field, "=", group_field_data)])
else:
group = None
max_seq = max(group.mapped("sequence")) if group else 0
# Don't recalculate if already set
for rec in self.filtered(lambda r: r.sequence == 0):