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