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",
|
"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",
|
"summary": "Add the notion of client equipment for Field Service",
|
||||||
"category": "Services/Field Service",
|
"category": "Services/Field Service",
|
||||||
"author": "Bemade Inc.",
|
"author": "Bemade Inc.",
|
||||||
"website": "http://www.bemade.org",
|
"website": "http://www.bemade.org",
|
||||||
"license": "LGPL-3",
|
"license": "LGPL-3",
|
||||||
"depends": ["industry_fsm", "account", "contacts"],
|
"depends": ["industry_fsm", "account", "contacts", "incrementing_sequence_mixin"],
|
||||||
"data": [
|
"data": [
|
||||||
"security/ir.model.access.csv",
|
"security/ir.model.access.csv",
|
||||||
"views/equipment_views.xml",
|
"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_tag
|
||||||
from . import equipment
|
from . import equipment
|
||||||
from . import res_partner
|
from . import res_partner
|
||||||
from . import equipment_component
|
|
||||||
from . import task
|
from . import task
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,8 @@ from odoo.osv import expression
|
||||||
class Equipment(models.Model):
|
class Equipment(models.Model):
|
||||||
_name = "fsm.equipment"
|
_name = "fsm.equipment"
|
||||||
_description = "Partner-Owned 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(
|
code = fields.Char(
|
||||||
tracking=True,
|
tracking=True,
|
||||||
|
|
@ -50,12 +51,24 @@ class Equipment(models.Model):
|
||||||
tracking=True,
|
tracking=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
equipment_component_ids = fields.One2many(
|
parent_id = fields.Many2one(
|
||||||
"fsm.equipment.component",
|
"fsm.equipment",
|
||||||
inverse_name="equipment_id",
|
|
||||||
tracking=True,
|
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
|
@api.model
|
||||||
def name_search(self, name="", args=None, operator="ilike", limit=100):
|
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
|
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,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_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>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="Components">
|
<page string="Components">
|
||||||
<field name="equipment_component_ids">
|
<field name="child_ids">
|
||||||
<tree editable="bottom">
|
<tree editable="bottom">
|
||||||
<field name="sequence" widget="handle"/>
|
<field name="sequence" widget="handle"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="product_id"/>
|
<field name="product_id"/>
|
||||||
<field name="purpose_id"/>
|
<field name="tag_ids" widget="many2many_tags"/>
|
||||||
<field name="note"/>
|
<field name="description"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,11 @@ class IncrementingSequenceMixin(models.AbstractModel):
|
||||||
group_field_data = getattr(rec, group_field)
|
group_field_data = getattr(rec, group_field)
|
||||||
if hasattr(group_field_data, "id"):
|
if hasattr(group_field_data, "id"):
|
||||||
group_field_data = group_field_data.id
|
group_field_data = group_field_data.id
|
||||||
group = self.env[rec._name].search(
|
group = self.env[rec._name].search(
|
||||||
[(group_field, "=", group_field_data)]
|
[(group_field, "=", group_field_data)]
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
group = None
|
||||||
max_seq = max(group.mapped("sequence")) if group else 0
|
max_seq = max(group.mapped("sequence")) if group else 0
|
||||||
rec.sequence = max_seq + 1
|
rec.sequence = max_seq + 1
|
||||||
return res
|
return res
|
||||||
|
|
@ -37,7 +39,9 @@ class IncrementingSequenceMixin(models.AbstractModel):
|
||||||
group_field_data = getattr(self, group_field)
|
group_field_data = getattr(self, group_field)
|
||||||
if hasattr(group_field_data, "id"):
|
if hasattr(group_field_data, "id"):
|
||||||
group_field_data = 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
|
max_seq = max(group.mapped("sequence")) if group else 0
|
||||||
# Don't recalculate if already set
|
# Don't recalculate if already set
|
||||||
for rec in self.filtered(lambda r: r.sequence == 0):
|
for rec in self.filtered(lambda r: r.sequence == 0):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue