diff --git a/customer_applications/__manifest__.py b/customer_applications/__manifest__.py
index cb31223..f2971fb 100644
--- a/customer_applications/__manifest__.py
+++ b/customer_applications/__manifest__.py
@@ -27,6 +27,7 @@
"license": "LGPL-3",
"depends": ["contacts", "incrementing_sequence_mixin"],
"data": [
+ "security/groups.xml",
"security/ir.model.access.csv",
"data/menus_actions.xml",
"views/application_type_views.xml",
diff --git a/customer_applications/data/menus_actions.xml b/customer_applications/data/menus_actions.xml
index 43d4ded..c63bbd6 100644
--- a/customer_applications/data/menus_actions.xml
+++ b/customer_applications/data/menus_actions.xml
@@ -34,7 +34,10 @@
+
\ No newline at end of file
diff --git a/customer_applications/models/__init__.py b/customer_applications/models/__init__.py
index a2fd26d..dd86493 100644
--- a/customer_applications/models/__init__.py
+++ b/customer_applications/models/__init__.py
@@ -2,3 +2,4 @@ from . import application
from . import application_specification
from . import application_type
from . import res_partner
+from . import application_specification_key
diff --git a/customer_applications/models/application.py b/customer_applications/models/application.py
index 75fb2d8..389fe6b 100644
--- a/customer_applications/models/application.py
+++ b/customer_applications/models/application.py
@@ -18,6 +18,7 @@ class Application(models.Model):
comodel_name="partner.application.type",
required=True,
tracking=4,
+ ondelete="restrict",
)
specification_ids = fields.One2many(
comodel_name="partner.application.specification",
diff --git a/customer_applications/models/application_specification.py b/customer_applications/models/application_specification.py
index 443177b..45c2a3a 100644
--- a/customer_applications/models/application_specification.py
+++ b/customer_applications/models/application_specification.py
@@ -1,4 +1,4 @@
-from odoo import models, fields
+from odoo import models, fields, api
class PartnerApplicationSpecification(models.Model):
@@ -7,14 +7,25 @@ class PartnerApplicationSpecification(models.Model):
_inherit = ["mail.thread", "mail.activity.mixin", "incrementing.sequence.mixin"]
_sequence_group = "application_id"
- name = fields.Char(
- tracking=2,
+ key_id = fields.Many2one(
+ comodel_name="partner.application.specification.key",
+ tracking=1,
+ ondelete="restrict",
+ domain="[('id', 'in', allowed_specification_keys)]",
+ string="Name",
required=True,
)
+ name = fields.Char(
+ related="key_id.name",
+ )
value = fields.Text(
tracking=2,
)
application_id = fields.Many2one(
comodel_name="partner.application",
tracking=1,
+ ondelete="cascade",
+ )
+ allowed_specification_keys = fields.Many2many(
+ related="application_id.application_type_id.allowed_specification_keys",
)
diff --git a/customer_applications/models/application_specification_key.py b/customer_applications/models/application_specification_key.py
new file mode 100644
index 0000000..41ef8c4
--- /dev/null
+++ b/customer_applications/models/application_specification_key.py
@@ -0,0 +1,11 @@
+from odoo import models, fields, api
+
+
+class ApplicationSpecificationKey(models.Model):
+ _name = "partner.application.specification.key"
+ _description = "Application Specification Key"
+
+ name = fields.Char(required=True, index="trigram")
+ _sql_constraints = [
+ ("name_uniq", "unique (name)", "Specification key name must be unique."),
+ ]
diff --git a/customer_applications/models/application_type.py b/customer_applications/models/application_type.py
index ec42ab9..a34f94e 100644
--- a/customer_applications/models/application_type.py
+++ b/customer_applications/models/application_type.py
@@ -31,6 +31,12 @@ class PartnerApplicationType(models.Model):
string="Partners",
readonly=True,
)
+ allowed_specification_keys = fields.Many2many(
+ comodel_name="partner.application.specification.key",
+ relation="application_specification_key_application_type_rel",
+ column1="application_type_id",
+ column2="application_specification_key_id",
+ )
@api.depends("application_ids", "application_ids.partner_id")
def _compute_partner_ids(self):
diff --git a/customer_applications/security/groups.xml b/customer_applications/security/groups.xml
new file mode 100644
index 0000000..f20d6f0
--- /dev/null
+++ b/customer_applications/security/groups.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ Applications Admin
+
+
+
+ Applications User
+
+
+
\ No newline at end of file
diff --git a/customer_applications/security/ir.model.access.csv b/customer_applications/security/ir.model.access.csv
index 547db60..b7ce421 100644
--- a/customer_applications/security/ir.model.access.csv
+++ b/customer_applications/security/ir.model.access.csv
@@ -1,5 +1,7 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_partner_application_user,access.partner.application.user,model_partner_application,base.group_user,1,1,1,1
-access_partner_application_type_user,access.partner.application.type.user,model_partner_application_type,base.group_user,1,0,0,0
-access_partner_application_type_manager,access.partner.application.type.manager,model_partner_application_type,base.group_partner_manager,1,1,1,1
-access_partner_application_specification_user,access.partner.application.specification.user,model_partner_application_specification,base.group_user,1,1,1,1
+access_partner_application_user,access.partner.application.user,model_partner_application,group_applications_user,1,1,1,1
+access_partner_application_type_user,access.partner.application.type.user,model_partner_application_type,group_applications_user,1,0,0,0
+access_partner_application_type_manager,access.partner.application.type.manager,model_partner_application_type,group_applications_admin,1,1,1,1
+access_partner_application_specification_user,access.partner.application.specification.user,model_partner_application_specification,group_applications_user,1,1,1,1
+access_partner_application_specification_key_user,access.partner.application.specification.key.user,model_partner_application_specification_key,group_applications_user,1,0,0,0
+access_partner_application_specification_key_admin,access.partner.application.specification.key.admin,model_partner_application_specification_key,group_applications_admin,1,1,1,1
\ No newline at end of file
diff --git a/customer_applications/views/application_type_views.xml b/customer_applications/views/application_type_views.xml
index 76994e0..1254e00 100644
--- a/customer_applications/views/application_type_views.xml
+++ b/customer_applications/views/application_type_views.xml
@@ -4,7 +4,7 @@
partner.application.type.list
partner.application.type
-
+
@@ -17,21 +17,45 @@
partner.application.type
diff --git a/customer_applications/views/application_views.xml b/customer_applications/views/application_views.xml
index 5890447..7afe942 100644
--- a/customer_applications/views/application_views.xml
+++ b/customer_applications/views/application_views.xml
@@ -6,34 +6,44 @@
diff --git a/fsm_equipment/__manifest__.py b/fsm_equipment/__manifest__.py
index 69fbb42..f4487ce 100644
--- a/fsm_equipment/__manifest__.py
+++ b/fsm_equipment/__manifest__.py
@@ -25,7 +25,7 @@
"author": "Bemade Inc.",
"website": "http://www.bemade.org",
"license": "LGPL-3",
- "depends": ["industry_fsm", "account"],
+ "depends": ["industry_fsm", "account", "contacts"],
"data": [
"security/ir.model.access.csv",
"views/equipment_views.xml",
diff --git a/fsm_equipment/views/equipment_views.xml b/fsm_equipment/views/equipment_views.xml
index e181a63..54bd293 100644
--- a/fsm_equipment/views/equipment_views.xml
+++ b/fsm_equipment/views/equipment_views.xml
@@ -9,68 +9,67 @@
-
-
-
-
+
+
+
+
+ options='{"always_reload": True}'
+ />
+ name="tag_ids"
+ widget="many2many_tags"
+ options="{'no_open': False}"
+ />
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
+
+
+
-
+
fsm.equipment.tree
fsm.equipment
-
-
-
+
+
+
-
+ name="tag_ids"
+ widget="many2many_tags"
+ options="{'no_open': False}"
+ />
+
@@ -80,21 +79,21 @@
fsm.equipment
-
-
-
+
+
+
-
+ name="tag_ids"
+ widget="many2many_tags"
+ options="{'no_open': False}"
+ />
+
+ name="action_view_equipment"
+ type="object"
+ string="Details"
+ icon="fa-external-link"
+ />
@@ -105,32 +104,61 @@
tree,form
+
+ fsm.equipment.search
+ fsm.equipment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Equipment Tag
fsm.equipment.tag
tree,form
+ id="menu_contact_equipment"
+ name="Customer Equipment"
+ action="action_window_equipment"
+ sequence="3"
+ parent="contacts.menu_contacts"/>
+ id="menu_service_client"
+ name="Clients"
+ sequence="10"
+ parent="industry_fsm.fsm_menu_root"
+ groups="industry_fsm.group_fsm_user"
+ />
+ id="menu_service_client_clients"
+ name="Clients"
+ action="base.action_partner_customer_form"
+ sequence="20"
+ parent="menu_service_client"
+ groups="industry_fsm.group_fsm_user"
+ />
+
diff --git a/partner_equipment_applications/__init__.py b/partner_equipment_applications/__init__.py
new file mode 100644
index 0000000..0650744
--- /dev/null
+++ b/partner_equipment_applications/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/partner_equipment_applications/__manifest__.py b/partner_equipment_applications/__manifest__.py
new file mode 100644
index 0000000..4e86e60
--- /dev/null
+++ b/partner_equipment_applications/__manifest__.py
@@ -0,0 +1,36 @@
+#
+# Bemade Inc.
+#
+# Copyright (C) 2023-June Bemade Inc. ().
+# Author: Marc Durepos (Contact : marc@bemade.org)
+#
+# This program is under the terms of the GNU Lesser General Public License,
+# version 3.
+#
+# For full license details, see https://www.gnu.org/licenses/lgpl-3.0.en.html.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+#
+{
+ "name": "Partner Application Equipment",
+ "version": "17.0.1.0.0",
+ "summary": "Make the link between customer_applications and fsm_equipment.",
+ "category": "Services/Field Service",
+ "author": "Bemade Inc.",
+ "website": "http://www.bemade.org",
+ "license": "LGPL-3",
+ "depends": ["fsm_equipment", "customer_applications"],
+ "data": [
+ "views/equipment_views.xml",
+ "views/application_views.xml",
+ ],
+ "assets": {},
+ "installable": True,
+ "auto_install": True,
+}
diff --git a/partner_equipment_applications/models/__init__.py b/partner_equipment_applications/models/__init__.py
new file mode 100644
index 0000000..adab03c
--- /dev/null
+++ b/partner_equipment_applications/models/__init__.py
@@ -0,0 +1,2 @@
+from . import application
+from . import equipment
diff --git a/partner_equipment_applications/models/application.py b/partner_equipment_applications/models/application.py
new file mode 100644
index 0000000..4baa2b9
--- /dev/null
+++ b/partner_equipment_applications/models/application.py
@@ -0,0 +1,29 @@
+from odoo import models, fields, api
+from odoo.exceptions import ValidationError
+
+
+class PartnerApplication(models.Model):
+ _inherit = "partner.application"
+
+ equipment_ids = fields.One2many(
+ comodel_name="fsm.equipment",
+ inverse_name="application_id",
+ string="Equipment",
+ )
+ equipment_count = fields.Integer(
+ compute="_compute_equipment_count",
+ string="Equipment Count",
+ )
+
+ @api.constrains("equipment_ids")
+ def _check_equipment_ids(self):
+ for application in self:
+ if len(application.equipment_ids.partner_id) > 1:
+ raise ValidationError(
+ "An application can only be linked to one partner."
+ )
+
+ @api.depends("equipment_ids")
+ def _compute_equipment_count(self):
+ for application in self:
+ application.equipment_count = len(application.equipment_ids)
diff --git a/partner_equipment_applications/models/equipment.py b/partner_equipment_applications/models/equipment.py
new file mode 100644
index 0000000..4fb8576
--- /dev/null
+++ b/partner_equipment_applications/models/equipment.py
@@ -0,0 +1,17 @@
+from odoo import models, fields
+
+
+class Equipment(models.Model):
+ _inherit = "fsm.equipment"
+
+ application_id = fields.Many2one(
+ comodel_name="partner.application",
+ tracking=1,
+ domain="[('partner_id', '=', partner_id)]",
+ ondelete="restrict",
+ )
+ application_type_id = fields.Many2one(
+ comodel_name="partner.application.type",
+ related="application_id.application_type_id",
+ readonly=True,
+ )
diff --git a/partner_equipment_applications/views/application_views.xml b/partner_equipment_applications/views/application_views.xml
new file mode 100644
index 0000000..86b79e1
--- /dev/null
+++ b/partner_equipment_applications/views/application_views.xml
@@ -0,0 +1,39 @@
+
+
+
+ Partner Equipments
+ fsm.equipment
+ tree,form
+ {'default_application_id': active_id}
+ [('application_id', '=', active_id)]
+
+
+ partner.application.search
+ partner.application
+
+
+
+
+
+
+
+
+ partner.application.form
+ partner.application
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/partner_equipment_applications/views/equipment_views.xml b/partner_equipment_applications/views/equipment_views.xml
new file mode 100644
index 0000000..2ecd9ce
--- /dev/null
+++ b/partner_equipment_applications/views/equipment_views.xml
@@ -0,0 +1,42 @@
+
+
+
+ fsm.equipment.view.search
+ fsm.equipment
+
+
+
+
+
+
+
+
+
+
+
+
+ fsm.equipment.view.tree
+ fsm.equipment
+
+
+
+
+
+
+
+
+
+
+ fsm.equipment.view.form
+ fsm.equipment
+
+
+
+
+
+
+
+
\ No newline at end of file