diff --git a/__manifest__.py b/__manifest__.py index 5c0f04929ac360305fcb317d11fda6a349b42ebc..dbf4624d3e4d8f5f534db9ddb3b22c05efa05fa9 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -6,7 +6,7 @@ "summary": "Gestion des mise en production logicielles", "author": "Le Filament", "website": "https://le-filament.com", - "version": "14.0.1.1s.2", + "version": "14.0.2.0.0", "license": "AGPL-3", "depends": [ "web", @@ -25,6 +25,7 @@ # views "views/res_partner.xml", "views/res_partner_module.xml", + "views/res_partner_module_version.xml", "views/res_partner_release.xml", "views/res_partner_release_module.xml", # views menu diff --git a/models/__init__.py b/models/__init__.py index 14713b01b588a4c44cc4f259decb2d314b4c7924..f5ecd4341bd38f10c32a8ef241f9e196d7ba48c7 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -3,5 +3,6 @@ from . import res_partner from . import res_partner_module +from . import res_partner_module_version from . import res_partner_release from . import res_partner_release_module diff --git a/models/res_partner.py b/models/res_partner.py index 541acee01ebc07d9638f1b6f011fa5674c0cb6f1..15ea9b5b401bcae1b757916a01e6939f534b530f 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -1,7 +1,6 @@ # © 2022 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from odoo import fields, models @@ -15,10 +14,9 @@ class ResPartner(models.Model): release_ids = fields.One2many( comodel_name="res.partner.release", inverse_name="partner_id", string="Releases" ) - module_ids = fields.Many2many( - comodel_name="res.partner.module", - column1="partner_id", - column2="module_id", + module_version_ids = fields.One2many( + comodel_name="res.partner.module.version", + inverse_name="partner_id", string="Modules", ) release_share_link = fields.Char( @@ -53,27 +51,41 @@ class ResPartner(models.Model): def retrieve_modules(self, modules): existing_modules = self.env["res.partner.module"].search([]) + ModuleVersion = self.env["res.partner.module.version"] for partner in self: for module in modules: if module.get("author_type") != "odoo": - # Mise à jour du module - if module.get("name") in existing_modules.mapped("name"): - existing_modules.filtered( + # Création du module + if not module.get("name") in existing_modules.mapped("name"): + new_module = module + new_module.pop("latest_version", False) + module_id = existing_modules.create(new_module) + # Mise à jour des versions + else: + module_id = existing_modules.filtered( lambda m: m.name == module.get("name") - ).update( + ) + module_update = ModuleVersion.search( + [ + ("partner_id", "=", partner.id), + ("module_id", "=", module_id.id), + ] + ) + if module_update: + module_update.update( + {"latest_version": module.get("latest_version")} + ) + else: + module_update.create( { - "author": module.get("author"), - "author_type": module.get("author_type"), + "partner_id": partner.id, + "module_id": module_id.id, "latest_version": module.get("latest_version"), - "partner_ids": [(4, partner.id, 0)], } ) - else: - # Création du module - partner.update({"module_ids": [(0, 0, module)]}) # Check modules désinstallés module_uninstalled = list( - set(partner.module_ids.mapped("name")) + set(partner.module_version_ids.mapped("module_id.name")) - set( map( lambda m: m.get("name") @@ -84,11 +96,10 @@ class ResPartner(models.Model): ) ) if module_uninstalled: - module_ids = partner.module_ids.filtered( - lambda m: m.name in module_uninstalled + module_ids = partner.module_version_ids.filtered( + lambda m: m.module_id.name in module_uninstalled ) - for module in module_ids: - partner.update({"module_ids": [(3, module.id, 0)]}) + module_ids.unlink() # ------------------------------------------------------ # Common function diff --git a/models/res_partner_module.py b/models/res_partner_module.py index 471b6cf8a9d03e2b686507a17ce452efc56e53a5..3fbf8f7f5f4a9c2c22646e4c9fb18b5e014914a5 100644 --- a/models/res_partner_module.py +++ b/models/res_partner_module.py @@ -6,20 +6,18 @@ from odoo import fields, models class PartnerModule(models.Model): _name = "res.partner.module" - _description = "Modules client" + _description = "Modules Odoo" + _order = "name" # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ name = fields.Char("Nom du module", required=True) - partner_ids = fields.Many2many( - comodel_name="res.partner", - column1="module_id", - column2="partner_id", + partner_version_ids = fields.One2many( + comodel_name="res.partner.module.version", + inverse_name="module_id", string="Clients", - domain=[("is_company", "=", True)], ) - latest_version = fields.Char("Version installée") author = fields.Char("Auteur") author_type = fields.Selection( [ @@ -29,7 +27,6 @@ class PartnerModule(models.Model): ], string="Type", ) - active = fields.Boolean("Actif", default=True) # ------------------------------------------------------ # SQL Constraints diff --git a/models/res_partner_module_version.py b/models/res_partner_module_version.py new file mode 100644 index 0000000000000000000000000000000000000000..a7b9ee429ce891f988a54418355cc1a2a391c62f --- /dev/null +++ b/models/res_partner_module_version.py @@ -0,0 +1,59 @@ +# Copyright 2022 Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import fields, models + + +class PartnerModuleVersion(models.Model): + _name = "res.partner.module.version" + _description = "Modules par client" + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + partner_id = fields.Many2one( + comodel_name="res.partner", + string="Client", + domain=[("is_company", "=", True)], + required=True, + ) + module_id = fields.Many2one( + comodel_name="res.partner.module", + string="Module Odoo", + required=True, + ) + latest_version = fields.Char("Version installée") + + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + _sql_constraints = [ + ( + "uniq_module_partner", + "unique(partner_id, module_id)", + "Ce module existe déjà pour ce client", + ), + ] + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------ diff --git a/models/res_partner_release_module.py b/models/res_partner_release_module.py index 7d1585e2c785ff70d4279b86e56a638dcb60c1f7..4fbbbb42e3b4c8f6be0ed1b0584f3bf86ea96dbb 100644 --- a/models/res_partner_release_module.py +++ b/models/res_partner_release_module.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models +from odoo import api, fields, models class PartnerReleaseModule(models.Model): @@ -59,6 +59,10 @@ class PartnerReleaseModule(models.Model): # ------------------------------------------------------ # Onchange / Constraints # ------------------------------------------------------ + @api.onchange("partner_id") + def _onchange_partner_id(self): + module_ids = self.partner_id.module_version_ids.mapped("module_id") + return {"domain": {"module_id": [("id", "in", module_ids.ids)]}} # ------------------------------------------------------ # CRUD methods (ORM overrides) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 745fb47e50606468072985db9f3450c1855f8af9..fcb2ce2a7f4b724c507c8d8490a6dc9230561ef9 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,6 +1,7 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_res_partner_release,access_res_partner_release,model_res_partner_release,base.group_user,1,1,1,1 access_res_partner_module,access_res_partner_module,model_res_partner_module,base.group_user,1,1,1,1 +access_res_partner_module_version,access_res_partner_module_version,model_res_partner_module_version,base.group_user,1,1,1,1 access_res_partner_release_module,access_res_partner_release_module,model_res_partner_release_module,base.group_user,1,1,1,1 access_multi_partner_release_wizard,access_multi_partner_release_wizard,model_multi_partner_release_wizard,base.group_user,1,1,1,1 access_multi_partner_release_line_wizard,access_multi_partner_release_line_wizard,model_multi_partner_release_line_wizard,base.group_user,1,1,1,1 diff --git a/views/menus.xml b/views/menus.xml index cb0bcbd4400d3538fefef45c5437fbbd5a637a54..72955708b72c4f56613575b5516f57e714e69f25 100644 --- a/views/menus.xml +++ b/views/menus.xml @@ -32,6 +32,13 @@ parent="res_partner_release_menu" sequence="30" /> + <menuitem + name="Modules par client et version" + id="res_partner_module_version_menu" + action="res_partner_module_version_act_window" + parent="res_partner_release_menu" + sequence="30" + /> </data> </odoo> diff --git a/views/res_partner.xml b/views/res_partner.xml index 064148de46fdb516d8a05bb27bb444b6b63166dc..31cf4c0dac161cae7ac927fe05ab940ac9aaf11f 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -23,11 +23,9 @@ <group> </group> </group> - <field name="module_ids"> - <tree editable="top"> - <field name="name" /> - <field name="author_type" /> - <field name="author" /> + <field name="module_version_ids"> + <tree editable="top" default_order="module_id"> + <field name="module_id" /> <field name="latest_version" /> </tree> </field> diff --git a/views/res_partner_module.xml b/views/res_partner_module.xml index f793eb065ad03a25b2304305860bd7a49064d6be..edbaae61533b22385d259611b22760540e736c9d 100644 --- a/views/res_partner_module.xml +++ b/views/res_partner_module.xml @@ -10,11 +10,43 @@ <field name="name" /> <field name="author_type" /> <field name="author" /> - <field name="partner_ids" /> </search> </field> </record> + <!-- Form View --> + <record id="res_partner_module_form_view" model="ir.ui.view"> + <field name="name">res.partner.module.form</field> + <field name="model">res.partner.module</field> + <field name="arch" type="xml"> + <form string="Modules"> + <sheet> + <div class="oe_title"> + <h1> + <field name="name" /> + </h1> + </div> + <group> + <group> + <field name="author_type" /> + <field name="author" /> + </group> + </group> + <field + name="partner_version_ids" + readonly="1" + default_order="partner_id" + > + <tree> + <field name="partner_id" /> + <field name="latest_version" /> + </tree> + </field> + </sheet> + </form> + </field> + </record> + <!-- Tree View --> <record id="res_partner_module_tree_view" model="ir.ui.view"> <field name="name">res.partner.module.tree</field> @@ -24,13 +56,11 @@ <field name="name" /> <field name="author_type" /> <field name="author" /> - <field name="latest_version" /> <field - name="partner_ids" + name="partner_version_ids" options="{'no_create': 1,}" widget="many2many_tags" /> - <field name="active" /> </tree> </field> </record> @@ -40,7 +70,7 @@ <field name="name">Liste Modules</field> <field name="type">ir.actions.act_window</field> <field name="res_model">res.partner.module</field> - <field name="view_mode">tree</field> + <field name="view_mode">tree,form</field> </record> </data> diff --git a/views/res_partner_module_version.xml b/views/res_partner_module_version.xml new file mode 100644 index 0000000000000000000000000000000000000000..3bfe0686a3436daa26bc1f17d763182a8223cf00 --- /dev/null +++ b/views/res_partner_module_version.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <data> + <!-- Search View --> + <record id="res_partner_module_version_search_view" model="ir.ui.view"> + <field name="name">res.partner.module.version.search</field> + <field name="model">res.partner.module.version</field> + <field name="arch" type="xml"> + <search string="Modules"> + <field name="partner_id" /> + <field name="module_id" /> + <field name="latest_version" /> + </search> + </field> + </record> + + <!-- Tree View --> + <record id="res_partner_module_version_tree_view" model="ir.ui.view"> + <field name="name">res.partner.module.version.tree</field> + <field name="model">res.partner.module.version</field> + <field name="arch" type="xml"> + <tree string="Modules" editable="top"> + <field name="partner_id" options="{'no_create': 1, 'no_edit': 1}" /> + <field name="module_id" options="{'no_create': 1, 'no_edit': 1}" /> + <field name="latest_version" /> + </tree> + </field> + </record> + + <!-- Action Window --> + <record + id="res_partner_module_version_act_window" + model="ir.actions.act_window" + > + <field name="name">Modules par client et version</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">res.partner.module.version</field> + <field name="view_mode">tree</field> + </record> + + </data> +</odoo>