# © 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import requests import logging import json from odoo import models, exceptions, tools, api _logger = logging.getLogger(__name__) class LeFilamentAlfresco(models.AbstractModel): """ Appelle l'API alfresco et implémente les fonctions suivantes : """ _inherit = 'lefilament.alfresco' def alfresco_publipostage_documents(self, url, filename, templateNodeRef, convertToPDF, keys, options, backend): # Remplissage des données de base json_data = { "fileName": filename, "templateNodeRef": templateNodeRef, "convertToPDF": False, "keys": keys } # Ajout des options Alfresco à envoyer json_data.update(options) print("------ json_data---", str(json_data)) return self.alfresco_publipostage( url=url, json=json_data, backend=backend) def alfresco_publipostage(self, url, json, backend): """ Génération d'un document via Alfresco :param dict: variables envoyés """ return self.alfresco_get_by_url( url=url, call_type='post', json=json, backend=backend) def generate_public_link(self, url, backend=None): """ Récupératin du lien public d'un docuement à partir d'une URL :param url: Url avec ID du Noderef du doc """ result = self.alfresco_get_by_url(url=url, call_type='post', backend=backend) res = result.content.decode('utf8').replace("'", '"') data = json.loads(res) sharedId = data.get('sharedId') return backend.url + '/share/s/' + sharedId def copy_document(self, url, workspace, workspace_parent, backend=None): """ Copie d'un document à partir d'un ID dans un dossier :param url: Url avec ID du Noderef du dossier :param workspace: ID du document à copier :param workspace_parent: ID du dossier """ result = self.alfresco_get_by_url( url=url, call_type='post', json={ "nodeRefs": [workspace], "parentId": workspace_parent }, backend=backend) res = result.content.decode('utf8').replace("'", '"') data = json.loads(res) nodeDoc = data.get('results')[0].get('nodeRef').replace('workspace://SpacesStore/', '') return nodeDoc def create_json_file(self, file_name, virtual_json, json_file_cmis): """ Crée un dossier virtuel à partir d'un node ref d'un dossier, puis associe un fichier json sur la propriété "Modèle de dossier intelligent" :param file_name: Nom du dossier créé et du fichier JSON :param virtual_json: fichier json :param json_file_cmis: Noderef du dossier où créer le dossier virtuel """ backend = self.env['cmis.backend'].search([], limit=1) parent_path = backend.get_cmis_repository().getFolder( json_file_cmis).getPaths() path_to_create = parent_path + [file_name] path = '/'.join(path_to_create) # Création du dossier virtuel cmis_folder = backend.get_folder_by_path(path) js = json.dumps(virtual_json, indent=4) prop = { 'cmis:secondaryObjectTypeIds': ['P:adefpat:justificatif'], } # Création du JSON repo = backend.get_cmis_repository().getObject(json_file_cmis) file = repo.createDocument( name=file_name + ".json", properties=prop, contentFile=js, contentType="application/json" ) noderef_file_id = file.getProperties().get('alfcmis:nodeRef') # Mise à jour des propriétés du dossier virtuel prop_folder = { 'cmis:secondaryObjectTypeIds': [ 'P:smf:customConfigSmartFolder', 'P:cm:taggable', 'P:up:UploadFolder', 'P:cm:titled', 'P:sys:localized' ], } cmis_folder.updateProperties(prop_folder) # Association du fichier JSON au dossier virtuel noderef_folder_id = cmis_folder.getProperties().get('cmis:objectId') url = '/alfresco/s/api/node/workspace/SpacesStore/' + noderef_folder_id + '/formprocessor' self.alfresco_get_by_url( url=url, call_type='post', json={ "assoc_smf_custom-template-association_added": noderef_file_id }, backend=backend) properties = cmis_folder.getProperties() url = backend.get_content_details_url_from_props(properties) return { 'type': 'ir.actions.act_url', 'url': url, 'target': 'new', }