fsm_equipment: consolidate components into a parent-child relationship in equipment
This commit is contained in:
parent
0a6f048708
commit
bb9ad5afbe
8 changed files with 65 additions and 51 deletions
|
|
@ -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",
|
||||
|
|
|
|||
35
fsm_equipment/migrations/17.0.0.2.0/post-migrate.py
Normal file
35
fsm_equipment/migrations/17.0.0.2.0/post-migrate.py
Normal 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
|
||||
]
|
||||
)
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
from . import equipment_tag
|
||||
from . import equipment
|
||||
from . import res_partner
|
||||
from . import equipment_component
|
||||
from . import task
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Reference in a new issue