Skip to content
Extraits de code Groupes Projets
Valider 3a8b4982 rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[update] refonte génération dossiers

parent cd299476
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
<odoo>
<data noupdate="1">
<!-- PARENTS-->
<record id="adefpat_archi_dossier_1" model="adefpat.archi.dossier">
<field name="name">admin</field>
<field name="path">nom_projet/admin/</field>
</record>
<record id="adefpat_archi_dossier_2" model="adefpat.archi.dossier">
<field name="name">beneficiaires</field>
<field name="path">nom_projet/beneficiaires/</field>
</record>
<record id="adefpat_archi_dossier_3" model="adefpat.archi.dossier">
<field name="name">nom_benef</field>
<field name="path">nom_projet/beneficiaires/nom_benef/</field>
<field name="specifique">1</field>
</record>
<record id="adefpat_archi_dossier_4" model="adefpat.archi.dossier">
<field name="name">malette</field>
<field name="path">nom_projet/beneficiaires/nom_benef/malette/</field>
<field name="specifique">1</field>
</record>
<record id="adefpat_archi_dossier_5" model="adefpat.archi.dossier">
<field name="name">comm</field>
<field name="path">nom_projet/comm/</field>
</record>
<record id="adefpat_archi_dossier_6" model="adefpat.archi.dossier">
<field name="name">consultation</field>
<field name="path">nom_projet/consultation/</field>
</record>
<record id="adefpat_archi_dossier_7" model="adefpat.archi.dossier">
<field name="name">nom_CF</field>
<field name="path">nom_projet/consultation/nom_CF/</field>
<field name="specifique">1</field>
</record>
<record id="adefpat_archi_dossier_8" model="adefpat.archi.dossier">
<field name="name">financement</field>
<field name="path">nom_projet/financement</field>
</record>
<record id="adefpat_archi_dossier_9" model="adefpat.archi.dossier">
<field name="name">gap</field>
<field name="path">nom_projet/gap/</field>
</record>
<record id="adefpat_archi_dossier_10" model="adefpat.archi.dossier">
<field name="name">date_gap</field>
<field name="path">nom_projet/gap/date_gap/</field>
<field name="specifique">1</field>
</record>
<record id="adefpat_archi_dossier_11" model="adefpat.archi.dossier">
<field name="name">malette_formateur</field>
<field name="path">nom_projet/malette_formateur/</field>
</record>
<record id="adefpat_archi_dossier_12" model="adefpat.archi.dossier">
<field name="name">seances</field>
<field name="path">nom_projet/seances/</field>
</record>
<!-- Niveau 1 -->
<record id="adefpat_archi_dossier_10" model="adefpat.archi.dossier">
<field name="name">date_gap</field>
<field name="specifique">1</field>
<field name="parent_id" ref="adefpat_alfodoo.adefpat_archi_dossier_9"/>
<field name="model_id" ref="adefpat_project.model_adefpat_reunion_gap" />
</record>
<record id="adefpat_archi_dossier_7" model="adefpat.archi.dossier">
<field name="name">nom_CF</field>
<field name="specifique">1</field>
<field name="parent_id" ref="adefpat_alfodoo.adefpat_archi_dossier_6"/>
<field name="model_id" ref="adefpat_project.model_res_partner_consultants_project" />
</record>
<record id="adefpat_archi_dossier_3" model="adefpat.archi.dossier">
<field name="name">nom_benef</field>
<field name="specifique">1</field>
<field name="parent_id" ref="adefpat_alfodoo.adefpat_archi_dossier_2"/>
<field name="model_id" ref="adefpat_project.model_res_partner_porteur_project" />
</record>
<!-- Niveau 2 -->
<record id="adefpat_archi_dossier_4" model="adefpat.archi.dossier">
<field name="name">malette</field>
<field name="parent_id" ref="adefpat_alfodoo.adefpat_archi_dossier_3"/>
</record>
</data>
</odoo>
# Copyright 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models, fields
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class ProjectProject(models.Model):
......@@ -30,11 +32,54 @@ class AdefpatListTypeDoc(models.Model):
class AdefpatArchiDossier(models.Model):
_name = 'adefpat.archi.dossier'
_description = 'Architecture des dossiers'
_parent_name = "parent_id"
_parent_store = True
_rec_name = 'path'
_order = 'path'
name = fields.Char("Nom du dossier")
path = fields.Char("Path")
name = fields.Char("Nom du dossier", required=True)
path = fields.Char(
string="Path",
compute="_compute_path",
store=True
)
parent_id = fields.Many2one(
'adefpat.archi.dossier',
string='Parent',
index=True)
child_ids = fields.One2many(
comodel_name='adefpat.archi.dossier',
inverse_name='parent_id',
string='Dossiers enfants')
parent_path = fields.Char(index=True)
specifique = fields.Boolean("Dossier spécifique")
model_id = fields.Many2one(
comodel_name="ir.model",
string="Table associée"
)
# ------------------------------------------------------
# Compute Functions
# ------------------------------------------------------
@api.depends('name', 'parent_id', 'parent_id.name')
@api.multi
def _compute_path(self):
for dossier in self:
path_list = []
current = dossier
if dossier.name:
while current:
path_list.append(current.name)
current = current.parent_id
dossier.path = '/'.join(reversed(path_list)) + '/'
# ------------------------------------------------------
# Constrain Functions
# ------------------------------------------------------
@api.constrains('parent_id')
def _check_folder_recursion(self):
if not self._check_recursion():
raise ValidationError(
'Vous ne pouvez pas créer des catégories récusrives.')
return True
......@@ -12,13 +12,13 @@ from odoo.addons.cmis_field import fields
class AdefpatPorteursProjets(models.Model):
_inherit = 'res.partner.porteur.project'
pp_cmis_folder = fields.CmisFolder(
cmis_folder = fields.CmisFolder(
allow_create=True,
allow_delete=False,
create_properties_get='_get_folder_properties',
)
pp_cmis_folder_completion = odooFields.Selection(
cmis_folder_completion = odooFields.Selection(
[(9, 'Inconnu'),
(0, 'Incomplet'),
(1, 'Complet'),
......@@ -28,11 +28,11 @@ class AdefpatPorteursProjets(models.Model):
@api.multi
def get_content_details_url(self):
for pp in self:
if pp.pp_cmis_folder:
backend_name = self._fields['pp_cmis_folder']
if pp.cmis_folder:
backend_name = self._fields['cmis_folder']
backend = backend_name.get_backend(pp.env)
properties = backend.get_cmis_repository().getFolder(
pp.pp_cmis_folder).getProperties()
pp.cmis_folder).getProperties()
url = backend.get_content_details_url_from_props(properties)
return {
'type': 'ir.actions.act_url',
......@@ -67,15 +67,16 @@ class AdefpatPorteursProjets(models.Model):
@api.multi
def _get_completion_status(self):
for pp in self:
if pp.pp_cmis_folder:
backend_name = self._fields['pp_cmis_folder']
if pp.cmis_folder:
backend_name = self._fields['cmis_folder']
backend = backend_name.get_backend(pp.env)
pp.pp_cmis_folder_completion = backend.get_cmis_repository().getFolder(pp.pp_cmis_folder).getProperties()['adefpat:validationStatut'] or 9
pp.cmis_folder_completion = backend.get_cmis_repository().getFolder(pp.cmis_folder).getProperties()['adefpat:validationStatut'] or 9
class AdefpatConsultantsProjets(models.Model):
_inherit = 'res.partner.consultants.project'
consult_cmis_folder = fields.CmisFolder(
cmis_folder = fields.CmisFolder(
allow_create=True,
allow_delete=False,
create_properties_get='_get_folder_properties',
......@@ -84,8 +85,8 @@ class AdefpatConsultantsProjets(models.Model):
@api.multi
def get_content_details_url(self):
for pp in self:
if pp.consult_cmis_folder:
backend_name = self._fields['consult_cmis_folder']
if pp.cmis_folder:
backend_name = self._fields['cmis_folder']
folder = backend_name.get_cmis_object(pp)
backend = backend_name.get_backend(pp.env)
repo = backend.get_cmis_repository()
......@@ -120,7 +121,7 @@ class AdefpatConsultantsProjets(models.Model):
class AdefpatReunionGAP(models.Model):
_inherit = 'adefpat.reunion.gap'
gap_cmis_folder = fields.CmisFolder(
cmis_folder = fields.CmisFolder(
allow_create=True,
allow_delete=False,
create_properties_get='_get_folder_properties',
......@@ -151,8 +152,8 @@ class AdefpatReunionGAP(models.Model):
@api.multi
def get_content_details_url(self):
for pp in self:
if pp.gap_cmis_folder:
backend_name = self._fields['gap_cmis_folder']
if pp.cmis_folder:
backend_name = self._fields['cmis_folder']
folder = backend_name.get_cmis_object(pp)
backend = backend_name.get_backend(pp.env)
repo = backend.get_cmis_repository()
......@@ -168,12 +169,16 @@ class AdefpatReunionGAP(models.Model):
class AlfodooProject(models.Model):
_inherit = 'project.project'
project_cmis_folder = fields.CmisFolder(
cmis_folder = fields.CmisFolder(
allow_create=True,
allow_delete=False,
create_properties_get='_get_folder_properties',
create_method='_create_folder',
)
task_cmis_folder = fields.CmisFolder(
allow_create=False,
allow_delete=False,
)
# ------------------------------------------------------
# Override Alfodoo
......@@ -184,27 +189,34 @@ class AlfodooProject(models.Model):
"""
return {
'cmis:secondaryObjectTypeIds': [
'P:adefpat:departement',
'P:adefpat:dossier',
'P:up:UploadFolder',
'P:adefpat:typesListe',
'P:cm:taggable',
'P:cm:titled',
'P:sys:cascadeUpdate',
'P:adefpat:typesListe',
'P:cm:taggable', 'P:sys:localized'
'P:sys:localized',
'P:up:UploadFolder'
],
'up:allowedTypes': 'adefpat:content',
'adefpat:cfd': str(self.user_id.name),
'adefpat:departement': str(
self.departement) if self.departement else '',
'adefpat:dossierNom': str(self.name),
'adefpat:dossierNumero': str(self.num_dossier) if self.num_dossier else '',
'adefpat:financementConvention': str(self.type_convention_id.name),
'up:allowedTypes': 'adefpat:content'
}
def _create_folder(self, records, backend):
"""
Crée le répertoire Projets si il n'existe pas
Crées l'architecture à mettre en place (PP, Gap, Consultants)
Met à jour le répertoire et les sous dossiers si ils existent
:param records: project records
:param backend: project backend
:return: project_cmis_folder objectId
:return: cmis_folder objectId
"""
# Get project folder
project_cmis = self.env.user.company_id.project_cmis
......@@ -212,121 +224,57 @@ class AlfodooProject(models.Model):
raise UserError(
"Le répertoire Projet d'Alfresco n'est pas configuré")
# Check de si le répertoire existe
for project in self:
if not project.cmis_folder:
# Path parent des projets
parent_path = backend.get_cmis_repository().getFolder(
project_cmis).getPaths()
# Path projet
path_proj = parent_path + [project.name]
path = '/'.join(path_proj)
project.project_cmis_folder = backend.get_folder_by_path(path)
project.project_cmis_folder.updateProperties(
# Création du dossier projet
project.cmis_folder = backend.get_folder_by_path(path)
# Actualisation de ses propriétés
project.cmis_folder.updateProperties(
project._get_folder_properties(records, backend))
archi_dossier = self.env['adefpat.archi.dossier'].search([
('parent_id', '=', False), ('specifique', '=', False)])
# Création / Mise à jour de l'architecture
else:
# Path du dossier projet
path_proj = backend.get_cmis_repository().getFolder(
project.cmis_folder).getPaths()
# Dossiers Niveau 0 (sans parent)
archi_dossier = self.env['adefpat.archi.dossier'].search([
('parent_id', '=', False),
])
for dossier in archi_dossier:
path_niveau0 = path_proj + [dossier.name]
path = '/'.join(path_niveau0)
# Création du dossier N0
path_n0 = path_proj + [dossier.name]
path = '/'.join(path_n0)
cmis_obj = backend.get_folder_by_path(path)
# Mise à jour des listes de documents
self.update_list_properties(dossier, cmis_obj)
if dossier.name == "comm":
cmis_obj.updateProperties(
{
'cmis:secondaryObjectTypeIds': [
'P:adefpat:dossier',
'P:adefpat:departement',
'P:up:UploadFolder',
'P:cm:titled',
'P:sys:cascadeUpdate',
'P:adefpat:typesListe',
'P:cm:taggable',
'P:sys:localized'
],
'up:allowedTypes': 'adefpat:content',
'adefpat:departement': str(project.departement) if project.departement else '',
})
# Création des enfants
child_folder = self.env['adefpat.archi.dossier'].search([
('parent_id', '=', dossier.id), ('specifique', '=', False)])
for child in child_folder:
path_niveau1 = path_niveau0 + [child.name]
path = '/'.join(path_niveau1)
cmis_obj = backend.get_folder_by_path(path)
self.update_list_properties(child, cmis_obj)
# Création des dossiers spécfiques
archi_spe = self.env['adefpat.archi.dossier'].search([
('parent_id', '=', dossier.id), ('specifique', '!=', False)])
for child in archi_spe:
if child.name == 'nom_benef':
for pp in project.porteurs_projets_ids:
path_pp = path_niveau0 + [pp.porteur_id.name]
path = '/'.join(path_pp)
# Création de l'objet
pp.pp_cmis_folder = backend.get_folder_by_path(path)
self.create_child(pp.pp_cmis_folder, pp, path_pp, backend, child)
if child.name == 'nom_CF':
for pp in project.consulant_ids:
path_pp = path_niveau0 + [pp.partner_id.name]
path = '/'.join(path_pp)
# Création de l'objet
pp.consult_cmis_folder = backend.get_folder_by_path(path)
self.create_child(pp.consult_cmis_folder, pp, path_pp, backend, child)
if child.name == 'date_gap':
for pp in project.reunion_ids:
path_pp = path_niveau0 + [str(pp.date)]
path = '/'.join(path_pp)
# Création de l'objet
pp.gap_cmis_folder = backend.get_folder_by_path(path)
self.create_child(pp.gap_cmis_folder, pp, path_pp, backend, child)
# Fonction récursive de création pour les enfants
if dossier.child_ids:
self.recursive_child(
project, dossier.child_ids, path_n0, cmis_obj, backend)
# Stockage du dossier séance pour les tâches
path_seances = '/'.join(path_proj + ['seances'])
project.task_cmis_folder = backend.get_folder_by_path(path_seances)
def update_folder(self):
"""
Mets à jour les dossiers qui ne sont pas encore crés (PP, Gap, Consultants)
:param records: project records
:param backend: project backend
:return: project_cmis_folder objectId
:return: cmis_folder objectId
"""
for project in self:
backend = self.env['cmis.backend'].sudo().search([])
project_path = backend.get_cmis_repository().getFolder(
project.project_cmis_folder).getPaths()
archi_spe = self.env['adefpat.archi.dossier'].search([
('parent_id', '!=', False), ('specifique', '!=', False)])
for child in archi_spe:
path_parent = project_path + [child.parent_id.name]
if child.name == 'nom_benef':
for pp in project.porteurs_projets_ids:
if not pp.pp_cmis_folder:
path_pp = path_parent + [pp.porteur_id.name]
path = '/'.join(path_pp)
# Création de l'objet
pp.pp_cmis_folder = backend.get_folder_by_path(path)
self.create_child(pp.pp_cmis_folder, pp, path_pp, backend, child)
if child.name == 'nom_CF':
for pp in project.consulant_ids:
if not pp.consult_cmis_folder:
path_pp = path_parent + [pp.partner_id.name]
path = '/'.join(path_pp)
# Création de l'objet
pp.consult_cmis_folder = backend.get_folder_by_path(path)
self.create_child(pp.consult_cmis_folder, pp, path_pp, backend, child)
if child.name == 'date_gap':
for pp in project.reunion_ids:
if not pp.gap_cmis_folder:
path_pp = path_parent + [str(pp.date)]
path = '/'.join(path_pp)
# Création de l'objet
pp.gap_cmis_folder = backend.get_folder_by_path(path)
self.create_child(pp.gap_cmis_folder, pp, path_pp, backend, child)
project._create_folder(self, backend)
def update_list_properties(self, dossier, cmis_folder):
# Récupération de tous les documents pour le dossier en entrée
......@@ -341,34 +289,45 @@ class AlfodooProject(models.Model):
doc = list_doc.mapped('name')
doc_completude = list_doc_completude.mapped('name')
properties = self._get_folder_properties(self, cmis_folder)
if doc:
cmis_folder.updateProperties({
properties.update({
'adefpat:typesListe': doc,
'adefpat:typesListeCompletude': doc_completude,
})
def create_child(self, object_cmis, object, path_object, backend, child):
# Mise à jour des propriétés du dossier
object_cmis.updateProperties(object._get_folder_properties())
# Mise à jour des documents attendus
self.update_list_properties(child, object_cmis)
# Vérification si des dossiers enfants doivent être créés
child_folder_spe = self.env['adefpat.archi.dossier'].search([
('parent_id', '=', child.id), ('specifique', '!=', False)])
for child in child_folder_spe:
path_niveau1 = path_object + [child.name]
path = '/'.join(path_niveau1)
cmis_obj = backend.get_folder_by_path(path)
self.update_list_properties(child, cmis_obj)
cmis_folder.updateProperties(properties)
def recursive_child(self, project, child_ids, path, cmis_obj, backend):
for child in child_ids:
if child.specifique:
object_ids = self.env[child.model_id.model].search([
('project_id', '=', project.id)
])
for obj in object_ids:
path_n = path + [obj.display_name]
path_o = '/'.join(path_n)
obj.cmis_folder = cmis_obj_n = backend.get_folder_by_path(path_o)
self.update_list_properties(child, cmis_obj_n)
cmis_obj_n.updateProperties(obj._get_folder_properties())
if child.child_ids:
self.recursive_child(
child, child.child_ids, path_n, cmis_obj_n,
backend)
else:
path_n = path + [child.name]
path_o = '/'.join(path_n)
cmis_obj_n = backend.get_folder_by_path(path_o)
self.update_list_properties(child, cmis_obj_n)
if child.child_ids:
self.recursive_child(
child, child.child_ids, path_n, cmis_obj_n, backend)
@api.multi
def validate_ca(self):
super(AlfodooProject, self).validate_ca()
for project in self:
backend = self._fields['project_cmis_folder']
backend = self._fields['cmis_folder']
properties = project._get_folder_properties(
project, backend)
properties.update({'adefpat:dossierNumero': project.num_dossier})
......
......@@ -8,22 +8,8 @@ from odoo.addons.cmis_field import fields
class AlfodooProjectTask(models.Model):
_inherit = 'project.task'
@api.model
def default_get(self, fields):
res = super(AlfodooProjectTask, self).default_get(fields)
if 'default_project_id' in self.env.context:
default_project_id = self.env['project.project'].browse(self.env.context['default_project_id'])
if default_project_id.exists().project_cmis_folder:
backend_name = default_project_id._fields['project_cmis_folder']
backend = backend_name.get_backend(default_project_id.env)
path_parts = backend.initial_directory_write.split('/')
path_proj = path_parts + [default_project_id.name] + ['seances']
path = '/'.join(path_proj)
res.update({'task_cmis_folder': backend.get_folder_by_path(path)})
return res
task_cmis_folder = fields.CmisFolder(
cmis_folder = fields.CmisFolder(
allow_create=False,
allow_delete=False,
create_properties_get='_get_folder_properties',
related='project_id.task_cmis_folder',
)
......@@ -12,7 +12,10 @@
<field name="inherit_id" ref="adefpat_project.edit_project"/>
<field name="arch" type="xml">
<header position="inside">
<button string="Dossiers Complets ?" type="object" class="btn-secondary" name="get_pp_completion" attrs="{'invisible': [('porteurs_projets_ids', '=', False)]}"/>
<button string="Dossiers Complets ?"
type="object" class="btn-secondary"
name="get_pp_completion"
attrs="{'invisible': ['|', ('porteurs_projets_ids', '=', False), ('cmis_folder', '=', False)]}"/>
</header>
<!-- Ajoute l'onglet Documents dans la vue projet -->
<xpath expr="//notebook" position="inside">
......@@ -20,8 +23,8 @@
<group>
<field name="liens_hypertextes"/>
</group>
<button name="update_folder" string="Mettre à jour les dossiers" type="object" attrs="{'invisible': [('project_cmis_folder', '=', False)]}"/>
<field name="project_cmis_folder"
<button name="update_folder" string="Mettre à jour les dossiers" type="object" attrs="{'invisible': [('cmis_folder', '=', False)]}"/>
<field name="cmis_folder"
canCreateFolder="0"
canCreateDocument="0"
canImportNewVersion="0"
......@@ -34,17 +37,17 @@
</page>
</xpath>
<xpath expr="//field[@name='porteurs_projets_ids']//tree//field[@name='eligible']" position="after">
<field name="pp_cmis_folder" invisible="1"/>
<field name="pp_cmis_folder_completion" string="Complet ?" attrs="{'invisible': [('pp_cmis_folder', '=', False)]}"/>
<button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" string="voir" type="object" attrs="{'invisible': [('pp_cmis_folder', '=', False)]}"/>
<field name="cmis_folder" invisible="1"/>
<field name="cmis_folder_completion" string="Complet ?" attrs="{'invisible': [('cmis_folder', '=', False)]}"/>
<button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" string="voir" type="object" attrs="{'invisible': [('cmis_folder', '=', False)]}"/>
</xpath>
<xpath expr="//field[@name='consulant_ids']//tree//field[@name='is_selected']" position="after">
<field name="consult_cmis_folder" invisible="1"/>
<button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" string="voir" type="object" attrs="{'invisible': [('consult_cmis_folder', '=', False)]}"/>
<field name="cmis_folder" invisible="1"/>
<button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" string="voir" type="object" attrs="{'invisible': [('cmis_folder', '=', False)]}"/>
</xpath>
<xpath expr="//field[@name='reunion_ids']//tree//field[@name='date']" position="after">
<field name="gap_cmis_folder" invisible="1"/>
<button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" string="voir" type="object" attrs="{'invisible': [('gap_cmis_folder', '=', False)]}"/>
<field name="cmis_folder" invisible="1"/>
<button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" string="voir" type="object" attrs="{'invisible': [('cmis_folder', '=', False)]}"/>
</xpath>
</field>
</record>
......
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