From 7e9c0e1dfb4f798ee2002d61ef83dae718db3440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com> Date: Mon, 20 Jan 2025 11:37:19 +0100 Subject: [PATCH] [DEL] remove dependency to Alfresco not used anymore --- __manifest__.py | 2 +- models/__init__.py | 1 - models/account_invoice.py | 83 ------- models/lefilament_alfresco.py | 82 ------- models/project.py | 423 ---------------------------------- views/project_views.xml | 24 -- 6 files changed, 1 insertion(+), 614 deletions(-) delete mode 100644 models/lefilament_alfresco.py diff --git a/__manifest__.py b/__manifest__.py index 620d246..0e80ae2 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -5,7 +5,7 @@ "website": "https://www.le-filament.com", "version": "12.0.1.0.1", "license": "AGPL-3", - "depends": ["adefpat_project", "adefpat_alfresco_generation", "adefpat_account"], + "depends": ["adefpat_project", "adefpat_account"], "data": [ "security/ir.model.access.csv", "views/account_invoice_views.xml", diff --git a/models/__init__.py b/models/__init__.py index d611a8c..fec8fd7 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -3,4 +3,3 @@ from . import project from . import account_invoice -from . import lefilament_alfresco diff --git a/models/account_invoice.py b/models/account_invoice.py index 47e9943..0822d2f 100644 --- a/models/account_invoice.py +++ b/models/account_invoice.py @@ -42,86 +42,3 @@ class AccountInvoice(models.Model): # ------------------------------------------------------ # Business methods # ------------------------------------------------------ - @api.multi - def generate_alfresco_file(self): - """ - Ajoute un fichier sur la GED Alfresco - @return: fonction get_partner_files() de res.partner - """ - if self.is_avenant: - # Get proof folder nodeRef - backend = self.env["cmis.backend"].search([], limit=1) - # Si la facture a déjà été créée, ouvrir dans Alfresco - if self.alfresco_file: - prop = ( - backend.get_cmis_repository() - .getFolder(self.alfresco_file) - .getProperties() - ) - url = backend.get_content_details_url_from_props(prop) - # Sinon, la créer, puis la stocker ainsi que les documents liées à la - # facture dans Alfresco - else: - project_folder = self.project_id.cmis_folder - self.cmis_folder = project_folder - - if not project_folder: - raise UserError(_("Le dossier du projet n'est pas configuré")) - - # Get Mimetype - attachment = self.env.ref( - "account.account_invoices" - ).retrieve_attachment(self) - if not attachment: - raise UserError( - _( - "La facture n'a pas encore été générée. " - "Imprimer la facture pour pouvoir la visualiser dans Alfresco" - ) - ) - - content_type = attachment.mimetype - - path_proj = ( - backend.get_cmis_repository().getFolder(project_folder).getPaths() - ) - - # Get template doc Facture - template_doc = self.env["adefpat.template.doc"].search( - [("type_temp", "=", "facture_av"), ("noderef_document", "=", False)] - ) - - # Get doc linked to Facture - template_doc_ids = self.env["adefpat.template.doc"].search( - [ - ("type_temp", "=", "facture_av"), - ("noderef_document", "!=", False), - ] - ) - - # Strore template in Alfresco - for template in template_doc_ids: - keys = self.fill_data() - self._publipostage_documents(template, keys, False) - - path_n0 = path_proj + [template_doc.dossier.name] - path = "/".join(path_n0) - cmis_obj = backend.get_folder_by_path(path) - - file = cmis_obj.createDocument( - name=attachment.name, - properties={}, - contentFile=base64.b64decode(attachment.datas), - contentType=content_type, - ) - file_id = file.getProperties().get("cmis:objectId") - self.alfresco_file = file.getObjectId() - prop = backend.get_cmis_repository().getFolder(file_id).getProperties() - url = backend.get_content_details_url_from_props(prop) - return { - "type": "ir.actions.act_url", - "url": url, - "target": "new", - } - else: - return super(AccountInvoice, self).generate_alfresco_file() diff --git a/models/lefilament_alfresco.py b/models/lefilament_alfresco.py deleted file mode 100644 index 5da9b35..0000000 --- a/models/lefilament_alfresco.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import models - - -class LeFilamentAlfresco(models.AbstractModel): - """Appelle l'API alfresco et implémente les fonctions suivantes :""" - - _inherit = "lefilament.alfresco" - - def _publipostage_documents_malette_avenant( - self, template_doc, keys_obj=None, versionable=None - ): - url = "/alfresco/s/publipostage" - - # Récupération du backend - backend_name = self._fields["cmis_folder"] - backend = backend_name.get_backend(self.env) - - # Création du path - path_all, dossier_id = template_doc.get_path_all() - if dossier_id.model_id.model == "res.partner.porteur.project": - object_ids = self.env["res.partner.porteur.project"].search( - [("project_id", "=", self.id), ("is_malette_ok", "=", False)] - ) - - for obj in object_ids: - if obj.cmis_folder: - parent_path = ( - backend.get_cmis_repository() - .getFolder(obj.cmis_folder) - .getPaths() - ) - if path_all: - path_n0 = parent_path + [path_all] - else: - path_n0 = parent_path - path = "/".join(path_n0) - keys = obj.fill_data() - keys_obj.update(keys) - - # Document PDF - cmis_obj_nodeRef = backend.get_folder_by_path(path).getProperties()[ - "alfcmis:nodeRef" - ] - mimetype = template_doc.name.split(".")[1] - if mimetype == "pdf": - # get ID document to copy - id_doc = template_doc.noderef_document.replace( - "workspace://SpacesStore/", "" - ) - # Get ID to noderef Folder parent - id_parent = cmis_obj_nodeRef.replace( - "workspace://SpacesStore/", "" - ) - uri = ( - "/alfresco/s/slingshot/doclib/action/copy-to/" - "node/workspace/SpacesStore/" + id_parent - ) - workspace = "workspace://SpacesStore/" + id_doc - workspace_parent = "workspace://SpacesStore/" + id_parent - # Copy the document and retur the objectId Created - nodeDoc = self.copy_document( - url=uri, - workspace=workspace, - workspace_parent=workspace_parent, - backend=backend, - ) - self.update_doc_properties(template_doc, nodeDoc) - else: - document = self.publipostage_documents( - url, path, template_doc, backend, keys_obj, versionable - ) - nodeDoc = ( - document.json() - .get("nodeRef", "") - .replace("workspace://SpacesStore/", "") - ) - self.update_doc_properties(template_doc, nodeDoc) - else: - self._publipostage_documents(template_doc, keys_obj, versionable) diff --git a/models/project.py b/models/project.py index 5af7134..5e3ccd3 100644 --- a/models/project.py +++ b/models/project.py @@ -106,415 +106,6 @@ class Project(models.Model): # ------------------------------------------------------ # Actions # ------------------------------------------------------ - @api.multi - def fill_avenant(self): - for project in self: - project.write( - { - "is_avenant": True, - "contexte_av": project.contexte, - "caract_beneficiaire_av": project.caract_beneficiaire, - "objectifs_accompagnement_av": project.objectifs_accompagnement, - "besoins_beneficiaires_av": project.besoins_beneficiaires, - "contenu_formation_av": project.contenu_formation, - "methode_savoir_av": project.methode_savoir, - "travaux_intersessions_av": project.travaux_intersessions, - "lieu_av": project.lieu, - "periode_realisation_av": project.periode_realisation, - "modalite_gap_av": project.modalite_gap, - "explication_financement_av": project.explication_financement, - "nb_jours_adefpat_av": project.nb_jours_adefpat, - "cout_jour_adefpat_av": project.cout_jour_adefpat, - } - ) - - def fill_data(self): - res = super(Project, self).fill_data() - if self.is_avenant and self.date_ca_av_next: - res["##date_ca_next##"] = babel.dates.format_date( - date=self.date_ca_av_next, - format="dd MMMM Y", - locale=self._context.get("lang") or "en_US", - ) - return res - - def fill_data_av(self): - - parser = [ - "name", - "name:NAME", - "date_ca_av", - # Entête Dossier CA - "name_subtitle", - "num_dossier", - # Critères dossier CA - "nb_activité", - "nb_emplois", - "type_beneficiaire", - # Blocs CA - "contenu_formation_av", - "methode_savoir_av", - "travaux_intersessions_av", - "lieu_av", - "periode_realisation_av", - "explication_financement_av", - "modalite_gap_av", - "resultats_accompagnement", - # CDC - "contexte_av", - "caract_beneficiaire_av", - "historique", - "besoins_beneficiaires_av", - "objectifs_accompagnement_av", - "competences_requises", - "secteurs_requis", - "modalites_intervention", - "modalites_facturation", - "modalites_reponse", - "modalites_modif_marche", - "financement_adefpat_av", - "total_budget_financement_av", - "total_financement_av", - "nb_jours_adefpat_av", - "cout_jour_adefpat_av", - "total_cout_adefpat_av", - "total_budget_cout_av", - "total_cout_av", - # # Selection field - "departement", - "objectif_projet", - "secteur_crit", - "taille", - "objectif_formation", - "type_formation", - "encadrement", - # Many2one - ("territoire_id", ["display_name", "street"]), - ("elu_referent_id", ["name"]), - ("user_id:cfd_name", ["name"]), - ("user_id:cfd_email", ["email"]), - ("type_convention_id", ["name"]), - # One2many List - ( - "membre_ids:LIST_membres", - { - "type_data": "LIST", - "fields": [("partner_id", ["display_name", "function"])], - }, - ), - ( - "porteurs_projets_ids:LIST_porteurs_project", - {"type_data": "LIST", "fields": [("porteur_id", ["display_name"])]}, - ), - ( - "financement_av_ids:LIST_financement", - {"type_data": "LIST", "fields": [("partner_id", ["display_name"])]}, - ), - ( - "porteurs_projets_ids:LIST_porteurs_adress", - { - "type_data": "LIST", - "fields": [ - ("porteur_id", ["display_name", "street", "zip", "city"]) - ], - }, - ), - ( - "financement_av_ids:LIST_financement_adress", - { - "type_data": "LIST", - "fields": [ - ("partner_id", ["display_name", "street", "zip", "city"]) - ], - }, - ), - ( - "od_ids:LIST_ods_adress", - { - "type_data": "MULTI", - "fields": ["display_name", "street", "zip", "city"], - }, - ), - # One2many Enum - ("petr_ids:petr_list", {"type_data": "ENUM", "fields": ["name"]}), - ( - "porteurs_projets_ids:commune_list", - {"type_data": "ENUM", "fields": ["commune"]}, - ), - ( - "cout_ids:consultants", - {"type_data": "ENUM", "fields": [("partner_id", ["name"])]}, - ), - ("od_ids:ods", {"type_data": "ENUM", "fields": ["name"]}), - ("animateur_ids:animateurs", {"type_data": "ENUM", "fields": ["name"]}), - ] - - keys = self.json_build(parser)[0] - - # Ajout des champs spécifiques - # Nombre de PP eligibles - nb_stagiaires = 0 - if self.porteurs_projets_ids: - nb_stagiaires = len(self.porteurs_projets_ids.filtered("eligible")) - keys["##nb_porteurs##"] = nb_stagiaires - - # Tableau des modules - tab_mod = [] - for modul in self.cout_av_ids: - tab_par_mod = [ - modul.module, - nb_stagiaires, - modul.nb_jour_theorique, - modul.nb_jour_pratiques, - (7 * nb_stagiaires * modul.nb_jour_theorique), - (7 * nb_stagiaires * modul.nb_jour_pratiques), - ( - (7 * nb_stagiaires * modul.nb_jour_theorique) - + (7 * nb_stagiaires * modul.nb_jour_pratiques) - ), - ] - tab_mod.append(tab_par_mod) - - keys["##TAB_MODULE_AV##"] = tab_mod - - # Tableau des porteurs de projets - tab_pp = [] - for pp in self.porteurs_projets_ids: - tab_par_pp = [pp.name, pp.statut.name, pp.commune] - tab_pp.append(tab_par_pp) - - # Enum consultants "name (mobile)" - res = "" - for cout in self.cout_av_ids: - if cout.partner_id: - if res: - if cout.partner_id.name not in res: - res += ", " + cout.partner_id.name - if cout.partner_id.email: - res += " (" + cout.partner_id.email + ")" - else: - res += cout.partner_id.name - if cout.partner_id.email: - res += " (" + cout.partner_id.email + ")" - keys["##consultants_email##"] = res - - keys["##TAB_PORTEURS##"] = tab_pp - - if self.date_ca_av_next: - keys["##date_ca_av_next##"] = babel.dates.format_date( - date=self.date_ca_av_next, - format="dd MMMM Y", - locale=self._context.get("lang") or "en_US", - ) - return keys - - @api.multi - def generate_dossier_ca_av(self): - for project in self: - if not project.cmis_folder: - raise UserError( - _("Le répertoire Projet d'Alfresco n'est pas configuré") - ) - - # Récupération du template de Dossier CA - template_docs = self.env["adefpat.template.doc"].search( - [ - "&", - "|", - ("convention_ids", "=", False), - ("convention_ids", "=", project.type_convention_id.id), - ("type_temp", "=", "dossier_ca_av"), - ] - ) - keys = project.fill_data_av() - for template_doc in template_docs: - url = project._publipostage_documents(template_doc, keys, True) - return { - "type": "ir.actions.act_url", - "url": url, - "target": "new", - } - - @api.multi - def generate_dossier_conventions_av(self): - for project in self: - if not project.cmis_folder: - raise UserError( - _("Le répertoire Projet d'Alfresco n'est pas configuré") - ) - - # Fill data project - keys = project.fill_data_av() - - # Récupération des conventions d'accompagnement - # 1 par formateur - template_docs = self.env["adefpat.template.doc"].search( - [ - "&", - "|", - ("convention_ids", "=", False), - ("convention_ids", "=", project.type_convention_id.id), - ("type_temp", "=", "convention_accompagnement_av"), - ] - ) - - for template_doc in template_docs: - - #################################### - # Group by consultants - #################################### - consulant_ok_ids = self.consulant_ids.filtered("is_selected") - for consult in consulant_ok_ids: - keys_obj = consult.fill_data() - keys.update(keys_obj) - - cout_ids = ( - self.env["adefpat.project.cout.av"] - .sudo() - .read_group( - [ - ("project_id", "=", project.id), - ("consultant_id", "=", consult.id), - ], - [ - "partner_id", - "montant", - "nb_jour_theorique", - "nb_jour_pratiques", - ], - ["partner_id"], - lazy=False, - ) - ) - - keys["##montant##"] = cout_ids[0]["montant"] - keys["##nb_jour_theorique_tot_av##"] = cout_ids[0][ - "nb_jour_theorique" - ] - keys["##nb_jour_pratique_tot_av##"] = cout_ids[0][ - "nb_jour_pratiques" - ] - keys["##nb_jour_tot_av##"] = ( - cout_ids[0]["nb_jour_pratiques"] - + cout_ids[0]["nb_jour_theorique"] - ) - keys["##nb_heure_tot_av##"] = ( - cout_ids[0]["nb_jour_pratiques"] - + cout_ids[0]["nb_jour_theorique"] - ) * 7 - project._publipostage_documents(template_doc, keys, False) - - # Récupération des annexes de conventions d'accompagnement - # 1 par bénéficiaire - template_docs = self.env["adefpat.template.doc"].search( - [ - "&", - "|", - ("convention_ids", "=", False), - ("convention_ids", "=", project.type_convention_id.id), - ("type_temp", "=", "annexe_convention_av"), - ] - ) - - for template_doc in template_docs: - for financ in project.financement_av_ids: - keys_obj = financ.fill_data() - keys.update(keys_obj) - project._publipostage_documents(template_doc, keys, False) - - # Récupération des conventions d'objectif - template_docs = self.env["adefpat.template.doc"].search( - [ - "&", - "|", - ("convention_ids", "=", False), - ("convention_ids", "=", project.type_convention_id.id), - ("type_temp", "=", "convention_objectif_av"), - ] - ) - for template_doc in template_docs: - # Get the display name of first Animateur - if project.animateur_ids: - first_od = project.animateur_ids[0] - keys_anim = first_od.get_data_anim() - keys.update(keys_anim) - - # Get the OD - if project.od_ids: - od_id = project.od_ids[0] - keys_od = od_id.get_data_od() - keys.update(keys_od) - - project._publipostage_documents(template_doc, keys, True) - - # Open URL from path in alfresco - backend_name = self._fields["cmis_folder"] - backend = backend_name.get_backend(project.env) - parent_path = ( - backend.get_cmis_repository().getFolder(project.cmis_folder).getPaths() - ) - path_proj = parent_path + [template_doc.dossier.name] - path = "/".join(path_proj) - cmis_folder = backend.get_folder_by_path(path) - properties = ( - backend.get_cmis_repository().getFolder(cmis_folder).getProperties() - ) - url = backend.get_content_details_url_from_props(properties) - return { - "type": "ir.actions.act_url", - "url": url, - "target": "new", - } - - @api.multi - def generate_dossier_global(self): - for project in self: - if project.is_avenant: - if not project.cmis_folder: - raise UserError( - _("Le répertoire Projet d'Alfresco n'est pas configuré") - ) - project.is_send_malette = True - # Récupération des template pour les malettes - template_docs = self.env["adefpat.template.doc"].search( - [ - "&", - "&", - "|", - ("convention_ids", "=", False), - ("convention_ids", "=", project.type_convention_id.id), - ("type_temp", "=", False), - ("noderef_document", "!=", False), - ] - ) - keys = project.fill_data() - for template_doc in template_docs: - project._publipostage_documents_malette_avenant( - template_doc, keys, True - ) - - # Mise a jour de l'envoi malette sur les porteurs de projet - for porteur in project.porteurs_projets_ids: - if porteur.cmis_folder: - porteur.is_malette_ok = True - - # Open URL Project in Alfresco - backend_name = self._fields["cmis_folder"] - backend = backend_name.get_backend(project.env) - properties = ( - backend.get_cmis_repository() - .getFolder(project.cmis_folder) - .getProperties() - ) - url = backend.get_content_details_url_from_props(properties) - return { - "type": "ir.actions.act_url", - "url": url, - "target": "new", - } - else: - return super(Project, self).generate_dossier_global() - @api.multi def action_generate_invoices_av(self): for project in self: @@ -705,17 +296,3 @@ class AdefpatCoutAV(models.Model): def _compute_montant(self): for r in self: r.montant = r.cout_jour * r.nb_jour_theorique - - -class AdefpatTemplateDoc(models.Model): - _inherit = "adefpat.template.doc" - - type_temp = fields.Selection( - selection_add=[ - ("convention_accompagnement_av", "Avenant Conventions d'accompagnement"), - ("convention_objectif_av", "Avenant Conventions d'objectif"), - ("annexe_convention_av", "Avenant Annexes Conventions"), - ("dossier_ca_av", "Avenant Dossier CA"), - ("facture_av", "Avenant Facture"), - ] - ) diff --git a/views/project_views.xml b/views/project_views.xml index 9df244d..8cd157c 100644 --- a/views/project_views.xml +++ b/views/project_views.xml @@ -15,36 +15,12 @@ <field name="nb_jour_plann" position="before"> <field name="nb_jour_theorique_tot_global" /> </field> - <header position="inside"> - <!-- Ajout du bouton pour récupérer les infos avenants --> - <button - string="Avenant" - type="object" - class="btn btn-primary" - name="fill_avenant" - attrs="{'invisible': [('is_avenant', '=', True)]}" - /> - </header> <page name="gap" position="after"> <page name="dossier_av" string="Dossier Avenant" attrs="{'invisible': [('is_avenant', '=', False)]}" > - <header> - <button - string="Générer Avenant Dossier CA" - type="object" - class="btn btn-primary" - name="generate_dossier_ca_av" - /> - <button - string="Générer Avenant Conventions" - type="object" - class="btn btn-primary" - name="generate_dossier_conventions_av" - /> - </header> <group> <field name="date_ca_av" /> </group> -- GitLab