Newer
Older
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
import xml.etree.ElementTree as et
import requests
from cmislib.exceptions import (
ContentAlreadyExistsException,
InvalidArgumentException,
ObjectNotFoundException,
UpdateConflictException,
)
from odoo import _, exceptions, models
"""Appelle l'API alfresco et implémente les fonctions suivantes :
_name = "cgscop.alfresco"
_description = "Connecteur Alfresco"
"""Création de la requête à Alfresco
:param url: action API Alfresco
:param call_type: post/get
:param json: data to post
@return response au format JSON
"""
_logger.info("Calling %s" % url)
param = self.env["cmis.backend"].sudo().search([["active", "=", True]])
raise exceptions.UserError(
_("La connexion avec Alfresco n'est pas configurée !")
)
alfresco_url = param.url
alfresco_ssl = param.ssl
basicAuthCredentials = (param.username, param.password)
if call_type == "get":
auth=basicAuthCredentials,
verify=alfresco_ssl,
)
elif call_type == "post":
response = requests.post(
alfresco_url + url,
auth=basicAuthCredentials,
json=json,
verify=alfresco_ssl,
)
elif call_type == "delete":
response = requests.delete(
alfresco_url + url,
auth=basicAuthCredentials,
json=json,
verify=alfresco_ssl,
except Exception as err:
_logger.warning(
"Erreur de connexion. URL: %s",
err.__str__(),
)
raise exceptions.ValidationError(err.__str__())
# Gestion erreur API
if response.status_code not in [200, 201]:
try:
message = response.json().get("message")
except Exception:
message = response.text
raise exceptions.ValidationError(
_(
"L'appel url '%s' a échoué\n"
"- Code erreur : %d\n"
"- Message : %s" % (response.url, response.status_code, message)
)
)
return response

Benjamin
a validé
def alfresco_list_docs(self, node_id):
"""Liste les documents pour un organisme (raison sociale)
:param name: raison sociale de la structure
url = "/alfresco/s/erp/listedocuments?nodeId=" + node_id
return self.alfresco_get_by_url(url=url, call_type="get").json()
"""Liste le valeurs du formulaire de dépôt d'un nouveau document
@return: dict des valeurs possibles pour période, validité, type
"""
url = "/alfresco/s/api/properties?nsp=crm&n=document"
list_type = self.alfresco_get_by_url(url=url, call_type="get").json()
"periode": self.get_allowed_values(
list_type=list_type, value="crm:periode"
),
"type": self.get_allowed_values(list_type=list_type, value="crm:type"),
"""Retourne le contenu d'un document en base64
:param nodeRef: id Alfresco
url = "/alfresco/s/document/" + nodeRef
return self.alfresco_get_by_url(url=url, call_type="get").json()
def alfresco_get_ticket(self, username):
"""Liste les documents pour un organisme (raison sociale)
:param username: username de l'utilisateur
"""
url = "/alfresco/s/authentifier-entantque?compte=" + username
result = self.alfresco_get_by_url(url=url, call_type="get")
tree = et.ElementTree(et.fromstring(result.content))
root = tree.getroot()
return root[0].text
# Post Methods
def alfresco_create_organism(self, partner):
"""Création d'un dossier Organisme
:param partner: objet Odoo créé
@return: id Alfresco (nodeRef) du dossier
"""
url = "/alfresco/s/erp/createdossierorganisme"
"raisonSociale": partner.name,
"ur": partner.ur_id,
self.alfresco_get_by_url(url=url, call_type="post", json=json).json()
)

Benjamin
a validé
def alfresco_update_organism(self, partner):
"""Mise à jour d'un dossier Organisme

Benjamin
a validé
:param partner: objet Odoo créé
@return: id Alfresco (nodeRef) du dossier
"""
url = "/alfresco/s/erp/updatedossierorganisme/" + partner.id_alfresco

Benjamin
a validé
json = {
"raisonSociale": partner.name,

Benjamin
a validé
"id": partner.id,
"siret": partner.siret,
"ur": partner.ur_id,

Benjamin
a validé
}
return self.get_nodeRef(
self.alfresco_get_by_url(url=url, call_type="post", json=json).json()
)
"""Supprime un document d'Alfresco
:param id_doc: id du document Alfresco
url = "/alfresco/s/document/" + nodeRef
return self.alfresco_get_by_url(url=url, call_type="delete").json()
# Others
def get_allowed_values(self, list_type, value):
"""Fonction qui itère dans l'objet retourné"""
list_selected = list(filter(lambda i: i["name"] == value, list_type))
return (
list_selected[0]
.get("constraints")[0]
.get("parameters")[0]
.get("allowedValues")
)
"""Renvoie la référence Alfresco d'un JSON contenant au premier
niveau la clé "nodeRef" puis supprime le chemin du workspace
"""
return result.get("nodeRef", "").replace("workspace://SpacesStore/", "")
def push_alfresco_file(self, file, name, metadata=None, backend=None, folder=None):
Ajoute un fichier sur la GED Alfresco
@return: fonction get_partner_files() de res.partner
if not backend:
backend = self.env["cmis.backend"].search([], limit=1)
if not folder:
raise exceptions.ValidationError(
_("Le dossier parent n'existe pas ou n'est pas renseigné !")
)
cmis_obj = backend.get_cmis_repository().getObject(folder)
_logger.info("Chargement document Alfresco : %s" % name)
file_upload = cmis_obj.createDocument(
name=name,
contentType="application/pdf",
except (
ContentAlreadyExistsException,
ObjectNotFoundException,
UpdateConflictException,
InvalidArgumentException,
) as e:
_(
"L'appel à Alfresco à échoué :\n- Code: %s\n\n- Url\n%s\n\n- Détail\n%s"
)
except Exception as e:
raise exceptions.ValidationError(e)