Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 8f981015ea3f984656d00921f77ccdf89809f78d
  • 14.0 par défaut protégée
  • 16.0
  • addOperationDescription
  • 14.0_optim
5 résultats

res_partner.py

Blame
  • 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