From bb9ad5afbee3503bfd4c415fc4663f19f65316dc Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 24 Oct 2024 15:05:17 -0400 Subject: [PATCH] fsm_equipment: consolidate components into a parent-child relationship in equipment --- fsm_equipment/__manifest__.py | 4 +-- .../migrations/17.0.0.2.0/post-migrate.py | 35 +++++++++++++++++++ fsm_equipment/models/__init__.py | 1 - fsm_equipment/models/equipment.py | 21 ++++++++--- fsm_equipment/models/equipment_component.py | 34 ------------------ fsm_equipment/security/ir.model.access.csv | 3 -- fsm_equipment/views/equipment_views.xml | 6 ++-- .../models/incrementing_sequence_mixin.py | 12 ++++--- 8 files changed, 65 insertions(+), 51 deletions(-) create mode 100644 fsm_equipment/migrations/17.0.0.2.0/post-migrate.py delete mode 100644 fsm_equipment/models/equipment_component.py diff --git a/fsm_equipment/__manifest__.py b/fsm_equipment/__manifest__.py index f4487ce..25d8e21 100644 --- a/fsm_equipment/__manifest__.py +++ b/fsm_equipment/__manifest__.py @@ -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", diff --git a/fsm_equipment/migrations/17.0.0.2.0/post-migrate.py b/fsm_equipment/migrations/17.0.0.2.0/post-migrate.py new file mode 100644 index 0000000..86df8fb --- /dev/null +++ b/fsm_equipment/migrations/17.0.0.2.0/post-migrate.py @@ -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 + ] + ) diff --git a/fsm_equipment/models/__init__.py b/fsm_equipment/models/__init__.py index 79c07ad..0df2c04 100644 --- a/fsm_equipment/models/__init__.py +++ b/fsm_equipment/models/__init__.py @@ -1,5 +1,4 @@ from . import equipment_tag from . import equipment from . import res_partner -from . import equipment_component from . import task diff --git a/fsm_equipment/models/equipment.py b/fsm_equipment/models/equipment.py index 7007103..dbc75d6 100644 --- a/fsm_equipment/models/equipment.py +++ b/fsm_equipment/models/equipment.py @@ -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): diff --git a/fsm_equipment/models/equipment_component.py b/fsm_equipment/models/equipment_component.py deleted file mode 100644 index adae313..0000000 --- a/fsm_equipment/models/equipment_component.py +++ /dev/null @@ -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) diff --git a/fsm_equipment/security/ir.model.access.csv b/fsm_equipment/security/ir.model.access.csv index 1e8c92e..1a784e3 100644 --- a/fsm_equipment/security/ir.model.access.csv +++ b/fsm_equipment/security/ir.model.access.csv @@ -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 diff --git a/fsm_equipment/views/equipment_views.xml b/fsm_equipment/views/equipment_views.xml index 54bd293..f2997e8 100644 --- a/fsm_equipment/views/equipment_views.xml +++ b/fsm_equipment/views/equipment_views.xml @@ -32,13 +32,13 @@ - + - - + + diff --git a/incrementing_sequence_mixin/models/incrementing_sequence_mixin.py b/incrementing_sequence_mixin/models/incrementing_sequence_mixin.py index c1822f2..3d87d09 100644 --- a/incrementing_sequence_mixin/models/incrementing_sequence_mixin.py +++ b/incrementing_sequence_mixin/models/incrementing_sequence_mixin.py @@ -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):