Sélectionner une révision Git
res_partner.py 6,26 Kio
# Copyright 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from cmislib.exceptions import (
ContentAlreadyExistsException,
InvalidArgumentException,
ObjectNotFoundException,
UpdateConflictException,
)
from odoo import _, models
from odoo.exceptions import UserError, ValidationError
from odoo.addons.cmis_field import fields
_logger = logging.getLogger(__name__)
ALFRESCO_TRACKED_FIELDS = ["name", "id", "siret", "member_number", "ur_id"]
class AlfodooResPartner(models.Model):
_name = "res.partner"
_inherit = ["res.partner", "cgscop.alfresco"]
partner_cmis_folder = fields.CmisFolder(
allow_create=True,
allow_delete=False,
create_parent_get="_get_parent_path",
create_properties_get="_get_folder_properties",
create_method="_create_coop_folder",
)
# ------------------------------------------------------
# Override Alfodoo
# ------------------------------------------------------
def _get_parent_path(self, records, backend):
"""
Défini le répertoire parent :
le répertoire configuré par défaut dans le backend
"""
path_parts = backend.initial_directory_write.split("/")
parent_cmis_object = backend.get_folder_by_path_parts(
path_parts, create_if_not_found=True
)
path = dict.fromkeys(self.ids, parent_cmis_object)
return path
def _get_folder_properties(self, records, backend):
"""
Ajoute les propriétés au dossier lors de la création dans Alfresco
"""
return {
self.id: {
"cmis:secondaryObjectTypeIds": [
"P:crm:organisme",
"P:up:UploadFolder",
"P:cm:titled",
],
"up:allowedTypes": "crm:document",
"crm:raisonSociale": self.name,
"crm:siret": self.siret if self.siret else "",
"crm:numAdherent": self.member_number if self.member_number else "",
"crm:id": str(self.id),
"crm:ur": str(self.ur_id.id),
}
}
def _create_coop_folder(self, records, backend):
path = backend.initial_directory_write
root_folder = backend.get_folder_by_path(path)
for partner in self:
folder_name = (
partner.name
if not partner.name.startswith(".")
else partner.name.replace(".", "_", 1)
)
sanitized_name = backend.sanitize_cmis_name(folder_name).replace("+", "_")
name = backend.get_unique_folder_name(sanitized_name, root_folder)
properties = partner._get_folder_properties(records, backend)
partner.partner_cmis_folder = root_folder.createFolder(
name, properties[partner.id]
)
# ------------------------------------------------------
# Override ORM
# ------------------------------------------------------
def write(self, vals):
"""Surcharge la fonction write() pour mettre à jour
la raison sociale, le nom, le siret, l'id Odoo ou le
num adhérent
"""
change_fields = vals.keys()
# check intersection
is_alfresco_field = [
value for value in change_fields if value in ALFRESCO_TRACKED_FIELDS
]
# Ecriture des nouvelles valeurs
result = super(AlfodooResPartner, self).write(vals)
# Check des modifications sur les coopératives présentes dans RIGA
for record in self:
if record.is_cooperative and record.partner_cmis_folder:
if is_alfresco_field:
try:
backend = self._fields["partner_cmis_folder"]
properties = self._get_folder_properties(record, backend).get(
record.id
)
if vals.get("name", False):
folder_name = (
record.name
if not record.name.startswith(".")
else record.name.replace(".", "_", 1)
)
properties.update({"cmis:name": folder_name})
folder = backend.get_cmis_object(record)
folder.updateProperties(properties)
except (
ContentAlreadyExistsException,
ObjectNotFoundException,
UpdateConflictException,
InvalidArgumentException,
) as e:
_logger.error(e)
raise ValidationError(
_(
"""Erreur de mise à jour Alfresco :
- Code : %s
- Url : %s
- Détail : %s"""
)
% (e.status, e.url, e.details)
)
except Exception as e:
raise ValidationError(e)
return result
def unlink(self):
for partner in self:
if partner.partner_cmis_folder:
try:
backend = self._fields["partner_cmis_folder"]
folder = backend.get_cmis_object(partner)
folder.delete()
except Exception as e:
_logger.error(e)
partner.partner_cmis_folder = False
return super(AlfodooResPartner, self).unlink()
# ------------------------------------------------------
# Common Functions
# ------------------------------------------------------
def create_cmis_folder(self):
for partner in self:
if partner.partner_cmis_folder:
raise UserError(_("Le partenaire a déjà un dossier Alfresco associé"))
else:
try:
partner._fields["partner_cmis_folder"].create_value(partner)
# return partner.partner_cmis_folder
except Exception as e:
return e.name