diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b4d48bd7a0ce8a4daa48e3c579bd6f659ff4aafe..74a4acb8f47165575be30d4c8dd96b2a7473bc63 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,6 +27,11 @@ repos: entry: found forbidden files; remove them language: fail files: "\\.rej$" + - id: en-po-files + name: en.po files cannot exist + entry: found a en.po file + language: fail + files: '[a-zA-Z0-9_]*/i18n/en\.po$' - repo: https://github.com/oca/maintainer-tools rev: dfba427ba03900b69e0a7f2c65890dc48921d36a hooks: @@ -96,7 +101,7 @@ repos: - id: pyupgrade args: ["--keep-percent-format"] - repo: https://github.com/PyCQA/isort - rev: 5.9.3 + rev: 5.12.0 hooks: - id: isort name: isort except __init__.py diff --git a/__manifest__.py b/__manifest__.py index 6e31eb96bbe40ddb957b0e0616960dcb9a689eb1..b68d32bcc473715f048ab0d301102ce6bd4f60ad 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -9,8 +9,10 @@ "data": [ # security "security/partner_security.xml", + "security/ir.model.access.csv", # datas # views + "views/res_department.xml", "views/res_partner.xml", # views menu # wizard diff --git a/models/__init__.py b/models/__init__.py index bf253ceb7b877e12b10853b488564ddb0a3bd18e..7b6a397c2ba9a15a1a36014dd12dc4f7bba0428e 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,4 +1,5 @@ # Copyright 2023 Le Filament (https://le-filament.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +from . import res_department from . import res_partner diff --git a/models/res_department.py b/models/res_department.py new file mode 100644 index 0000000000000000000000000000000000000000..fefceb280d28574a2f99ba260a6f0b8efd138d00 --- /dev/null +++ b/models/res_department.py @@ -0,0 +1,26 @@ +# © 2019 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 + + +class ResDepartment(models.Model): + _description = "Départements" + _name = "res.department" + _order = "code" + + name = fields.Char(string="Nom", size=128, required=True) + code = fields.Char( + string="Numéro", + size=3, + required=True, + ) + state_id = fields.Many2one(comodel_name="res.country.state", string="Région") + + _sql_constraints = [ + ( + "code_uniq", + "unique (code)", + "You cannot have two departments with the same code!", + ) + ] diff --git a/models/res_partner.py b/models/res_partner.py index a41534ddf76b19083d70e88a01cd81f08e8c42f5..d6978945468fb84c5f21e6f9e91863a26f08fc2b 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -14,6 +14,13 @@ class ResPartner(models.Model): user_id = fields.Many2one(default=lambda self: self.env.user) # New fields + department_id = fields.Many2one( + comodel_name="res.department", + string="Département", + compute="_compute_department_id", + store=True, + readonly=False, + ) is_purchasing_centre = fields.Boolean( string="Est une centrale d'achat", default=False, @@ -40,6 +47,22 @@ class ResPartner(models.Model): # ------------------------------------------------------ # Computed fields / Search Fields # ------------------------------------------------------ + @api.depends("zip", "country_id") + def _compute_department_id(self): + for partner in self: + if partner.zip and partner.country_id == self.env.ref("base.fr"): + try: + zip_dep = partner.zip[:2] + if zip_dep == "97": + zip_dep = partner.zip[:3] + + partner.department_id = ( + self.env["res.department"] + .sudo() + .search([("code", "=", zip_dep)]) + ) + except Exception: + partner.department_id = False # ------------------------------------------------------ # Onchange / Constraints diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv new file mode 100644 index 0000000000000000000000000000000000000000..c991b8e6b6d11b504721c1746fa7a566e5db6685 --- /dev/null +++ b/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +user_res_department,user_res_department,model_res_department,,1,0,0,0 +admin_res_department,admin_res_department,model_res_department,base.group_erp_manager,1,1,1,1 diff --git a/security/partner_security.xml b/security/partner_security.xml index 60fd631360dd46a7d55f405999f9c4f8edcf19bd..59cc615b1db4bec302794c822cf6875596361105 100644 --- a/security/partner_security.xml +++ b/security/partner_security.xml @@ -15,7 +15,9 @@ <record id="res_partner_vendor" model="ir.rule"> <field name="name">res.partner.vendor</field> <field name="model_id" ref="base.model_res_partner" /> - <field name="domain_force">['|', '|', ('user_id', '=', user.id), ('partner_share', '=', False), ('is_purchasing_centre', '=', True)]</field> + <field + name="domain_force" + >['|', '|', ('user_id', '=', user.id), ('partner_share', '=', False), ('is_purchasing_centre', '=', True)]</field> <field name="groups" eval="[(4, ref('emgidi_partner.group_partner_vendor'))]" /> </record> </odoo> diff --git a/views/res_department.xml b/views/res_department.xml new file mode 100644 index 0000000000000000000000000000000000000000..f935d1b182a113c2baa7c0a8d380301883934e84 --- /dev/null +++ b/views/res_department.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <record id="res_department_tree_view" model="ir.ui.view"> + <field name="name">res.department.tree</field> + <field name="model">res.department</field> + <field name="arch" type="xml"> + <tree editable="top"> + <field name="code" /> + <field name="name" /> + <field name="state_id" /> + </tree> + </field> + </record> + + <record id="res_department_act_window" model="ir.actions.act_window"> + <field name="name">Départements</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">res.department</field> + <field name="view_mode">tree</field> + </record> + + <menuitem + id="menu_action_department" + action="res_department_act_window" + parent="contacts.menu_localisation" + sequence="100" + /> +</odoo> diff --git a/views/res_partner.xml b/views/res_partner.xml index c3b793dbcd7aee223a0cccb3bc071d30855f5365..6d1c21f33c670627e0fe250e151441697d6dff93 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -41,6 +41,9 @@ <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form" /> <field name="arch" type="xml"> + <xpath expr="//field[@name='vat']" position="before"> + <field name="department_id" options="{'no_create': 1, 'no_edit': 1}" /> + </xpath> <xpath expr="//group/group[2]" position="after"> <group name="purchasing_centre"