Skip to content
Extraits de code Groupes Projets
Valider 7e9c0e1d rédigé par Rémi - Le Filament's avatar Rémi - Le Filament
Parcourir les fichiers

[DEL] remove dependency to Alfresco not used anymore

parent 267c9fc9
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"website": "https://www.le-filament.com", "website": "https://www.le-filament.com",
"version": "12.0.1.0.1", "version": "12.0.1.0.1",
"license": "AGPL-3", "license": "AGPL-3",
"depends": ["adefpat_project", "adefpat_alfresco_generation", "adefpat_account"], "depends": ["adefpat_project", "adefpat_account"],
"data": [ "data": [
"security/ir.model.access.csv", "security/ir.model.access.csv",
"views/account_invoice_views.xml", "views/account_invoice_views.xml",
......
...@@ -3,4 +3,3 @@ ...@@ -3,4 +3,3 @@
from . import project from . import project
from . import account_invoice from . import account_invoice
from . import lefilament_alfresco
...@@ -42,86 +42,3 @@ class AccountInvoice(models.Model): ...@@ -42,86 +42,3 @@ class AccountInvoice(models.Model):
# ------------------------------------------------------ # ------------------------------------------------------
# Business methods # 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()
# 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)
...@@ -106,415 +106,6 @@ class Project(models.Model): ...@@ -106,415 +106,6 @@ class Project(models.Model):
# ------------------------------------------------------ # ------------------------------------------------------
# Actions # 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 @api.multi
def action_generate_invoices_av(self): def action_generate_invoices_av(self):
for project in self: for project in self:
...@@ -705,17 +296,3 @@ class AdefpatCoutAV(models.Model): ...@@ -705,17 +296,3 @@ class AdefpatCoutAV(models.Model):
def _compute_montant(self): def _compute_montant(self):
for r in self: for r in self:
r.montant = r.cout_jour * r.nb_jour_theorique 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"),
]
)
...@@ -15,36 +15,12 @@ ...@@ -15,36 +15,12 @@
<field name="nb_jour_plann" position="before"> <field name="nb_jour_plann" position="before">
<field name="nb_jour_theorique_tot_global" /> <field name="nb_jour_theorique_tot_global" />
</field> </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="gap" position="after">
<page <page
name="dossier_av" name="dossier_av"
string="Dossier Avenant" string="Dossier Avenant"
attrs="{'invisible': [('is_avenant', '=', False)]}" 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> <group>
<field name="date_ca_av" /> <field name="date_ca_av" />
</group> </group>
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter