Sélectionner une révision Git
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})