Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • f1c2ca1d59bec6c9f388e54814c8049cf39a50b0
  • 14.0 par défaut
  • 12.0 protégée
  • 13.0
  • 12.0-lm-00 protégée
5 résultats

__manifest__.py

Blame
  • res_partner.py 10,86 Kio
    # Copyright 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    import logging
    from collections import defaultdict
    
    from odoo import api, fields, models
    
    _logger = logging.getLogger(__name__)
    
    
    class ResPartner(models.Model):
        _inherit = "res.partner"
    
        # Company Fields
        short_name = fields.Char("Sigle/Nom abrégé")
        email2 = fields.Char("Email 2")
        phone3 = fields.Char("Téléphone personnel")
        release_receipt_id = fields.Many2one(
            comodel_name="afac.partner.release.receipt",
            string="Réception communiqué",
        )
        agroforestry_involvement_id = fields.Many2one(
            comodel_name="afac.partner.agroforestry.involvement",
            string="Implication agroforesterie",
        )
        legal_status_id = fields.Many2one(
            comodel_name="afac.partner.legal",
            string="Statut Juridique",
        )
        legal_status_detail_id = fields.Many2one(
            comodel_name="afac.partner.legal.detail",
            string="Statut Juridique Détaillé",
        )
        legal_representative = fields.Text(
            string="Représentant légal",
            compute="_compute_legal_representative",
            store=True,
        )
        action_area = fields.Selection(
            [
                ("local", "Inter-communale, communale ou locale"),
                ("department", "Départementale"),
                ("territory", "Territoriale"),
                ("region", "Régionale"),
                ("national", "Nationale"),
            ],
            string="Échelle d'action",
        )
        region_id = fields.Many2one(
            comodel_name="afac.partner.region", string="Région implantation"
        )
        thematic_id = fields.Many2one(
            comodel_name="afac.partner.thematic", string="Sous collège"
        )
        org_type_id = fields.Many2one(
            comodel_name="afac.partner.type", string="Type de structure"
        )
        college_id = fields.Many2one(comodel_name="afac.partner.college", string="Collège")
        water_agency_id = fields.Many2one(
            comodel_name="afac.partner.water.agency", string="Agence Eau rattachement"
        )
        skill_ids = fields.Many2many(
            comodel_name="afac.partner.activity",
            relation="afac_partner_activity_res_partner_rel",
            column1="partner_id",
            column2="skill_id",
            string="Compétences/Activités",
        )
        project_ids = fields.One2many(
            comodel_name="afac.project.partner", inverse_name="partner_id", string="Projets"
        )
        project_category_ids = fields.Many2many(
            comodel_name="afac.project.category",
            compute="_compute_project_category_ids",
            search="_search_project_category_ids",
        )
        project_category_names = fields.Text(
            compute="_compute_project_category_names",
            string="Sous-projet",
            store=True,
        )
        # Contact fields
        is_contributor = fields.Boolean(
            string="Sympathisant",
            default=False,
            help="Est sympathisant pour l'année en cours",
        )
        is_donator = fields.Boolean(
            string="Donateur",
            default=False,
            compute="_compute_is_donator",
            store=True,
            help="A déjà contribué à l'AFAC",
        )
        mandate_id = fields.Many2one(
            comodel_name="afac.partner.mandate", string="Fonction/Mandat"
        )
        mandate_id_color = fields.Integer(
            related="mandate_id.color",
        )
        is_legal_representative = fields.Boolean(string="Représentant Légal", default=False)
        service_department = fields.Char("Direction/Service")
        alert = fields.Text("Alerte du contact")
        is_my_region = fields.Boolean(
            compute="_compute_is_my_region",
            search="_search_is_my_region",
        )
    
        contact_address_simple = fields.Char(
            compute="_compute_contact_address_simple", string="Adresse simplifiée"
        )
        fields_to_copy_to_clipboard = fields.Char(
            string="Champs à copier",
            compute="_compute_copy_to_clipboard",
        )
        # ------------------------------------------------------
        # SQL Constraints
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Default methods
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Computed fields / Search Fields
        # ------------------------------------------------------
        def _compute_copy_to_clipboard(self):
            for record in self:
                res = (
                    (record.firstname or "")
                    + " "
                    + (record.lastname or "")
                    + "\n"
                    + (record.function or "")
                    + "\n"
                    + (record.street or "")
                    + "\n"
                    + (record.street2 or "")
                    + "\n"
                    + (record.street3 or "")
                    + "\n"
                    + (record.zip or "")
                    + " "
                    + (record.city or "")
                    + "\n"
                    + (record.parent_id.name or "")
                    + "\n"
                    + (record.phone or "")
                    + "\n"
                    + (record.mobile or "")
                    + "\n"
                    + (record.email or "")
                )
                while "\n\n" in res:
                    res = res.replace("\n\n", "\n")
                record.fields_to_copy_to_clipboard = res.lstrip()
    
        @api.model
        def _get_default_address_format_simple(self):
            return "%(street)s\n%(street2)s\n%(street3)s\n%(zip)s %(city)s"
    
        @api.model
        def _get_address_format_simple(self):
            return self._get_default_address_format_simple()
    
        @api.depends(lambda self: self._formatting_address_fields())
        def _compute_contact_address_simple(self):
            for partner in self:
                partner.contact_address_simple = partner._display_address_simple()
    
        def _display_address_simple(self):
            address_format = self._get_address_format_simple()
            args = defaultdict(str, {})
            for field in self._formatting_address_fields():
                args[field] = getattr(self, field) or ""
            res = address_format % args
            while "\n\n" in res:
                res = res.replace("\n\n", "\n")
            return res.lstrip()
    
        @api.depends("child_ids", "child_ids.is_legal_representative")
        def _compute_legal_representative(self):
            for partner in self:
                mandate_ids = partner.child_ids.mapped("is_legal_representative")
                if mandate_ids:
                    partner.legal_representative = "\n".join(
                        partner.child_ids.filtered(
                            lambda c: c.is_legal_representative
                        ).mapped(lambda p: p.name)
                    )
    
        @api.depends("is_contributor")
        def _compute_is_donator(self):
            for partner in self:
                if partner.is_contributor:
                    partner.is_donator = True
    
        def _compute_is_my_region(self):
            c_id = self._context.get("allowed_company_ids")[0]
            region_ids = self.env["res.company"].browse(c_id).region_ids
            for partner in self:
                if partner.region_id in region_ids:
                    partner.is_my_region = True
                else:
                    partner.is_my_region = False
    
        def _search_is_my_region(self, operator, value):
            if operator not in ["=", "!="]:
                raise ValueError("This operator is not supported")
            if not isinstance(value, bool):
                raise ValueError("Value should be True or False (not %s)", value)
            c_id = self._context.get("allowed_company_ids")[0]
            region_ids = self.env["res.company"].browse(c_id).region_ids
            # True
            if region_ids:
                if (operator == "=" and value) or (operator == "!=" and not value):
                    return [("region_id", "in", region_ids.ids)]
                # False
                else:
                    return [("id", "not in", region_ids.ids)]
            else:
                return []
    
        def _compute_project_category_ids(self):
            for partner in self:
                category_ids = partner.project_ids.search(
                    [("partner_id", "=", partner.id)]
                ).mapped("project_cat_ids")
                partner.project_category_ids = category_ids
    
        def _search_project_category_ids(self, operator, value):
            return [("project_ids.project_cat_ids", operator, value)]
    
        @api.depends(
            "project_ids", "project_ids.project_cat_ids", "project_ids.project_cat_ids.name"
        )
        def _compute_project_category_names(self):
            for partner in self:
                partner.project_category_names = ""
                category_ids = partner.project_ids.search(
                    [("partner_id", "=", partner.id)]
                ).mapped("project_cat_ids.name")
                if category_ids:
                    partner.project_category_names = " ".join(category_ids)
    
        # ------------------------------------------------------
        # Onchange / Constraints
        # ------------------------------------------------------
        @api.onchange("parent_id")
        def _onchange_parent_id(self):
            self.thematic_id = self.parent_id.thematic_id
            self.org_type_id = self.parent_id.org_type_id
            self.college_id = self.parent_id.college_id
            self.region_id = self.parent_id.region_id
            self.legal_status_id = self.parent_id.legal_status_id
            self.legal_status_detail_id = self.parent_id.legal_status_detail_id
            self.website = self.parent_id.website
            self.short_name = self.parent_id.short_name
    
        # ------------------------------------------------------
        # CRUD methods (ORM overrides)
        # ------------------------------------------------------
        def write(self, vals):
            """
            Inherit write ORM function and
            apply parent values for child
            """
            res = super(ResPartner, self).write(vals)
            # list of triggered fields
            field_list = [
                "thematic_id",
                "org_type_id",
                "college_id",
                "region_id",
                "legal_status_id",
                "legal_status_detail_id",
                "short_name",
                "website",
            ]
            # list of fields updated
            update_list = list(vals.keys())
            # intersection
            fields_to_update = list(set(field_list) & set(update_list))
    
            for partner in self:
                # if partner has child, update all childs
                if partner.child_ids:
                    if fields_to_update:
                        child_values = {}
                        for f in fields_to_update:
                            child_values[f] = vals.get(f)
                        partner.child_ids.update(child_values)
    
            return res
    
        # ------------------------------------------------------
        # Actions
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Business methods
        # ------------------------------------------------------
        def _reset_contributor(self):
            contributor_ids = self.search([("is_contributor", "=", True)])
            contributor_ids.update({"is_contributor": False})