Newer
Older
# © 2019 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 xml.etree.ElementTree as et
from odoo import models, exceptions, fields
from cmislib.exceptions import ContentAlreadyExistsException, \
ObjectNotFoundException, UpdateConflictException, InvalidArgumentException
""" Appelle l'API alfresco et implémente les fonctions suivantes :
alfresco_list_docs : liste les documents
"""
_description = 'Connecteur Alfresco'
def alfresco_get_by_url(self, url, call_type, json=None):
""" 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]])
if not param:
raise exceptions.Warning(
"La connexion avec Alfresco n'est pas configurée !")
return False
alfresco_url = param.url
alfresco_ssl = param.ssl
param.username,
try:
if call_type == 'get':
response = requests.get(
alfresco_url + url,
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__(),
)
response = False
# Gestion erreur API
if response.status_code not in [200, 201]:
try:
message = response.json().get('message')
except:
message = response.text

Benjamin
a validé
raise exceptions.Warning(
"L'appel url '%s' a échoué\n"
"- Code erreur : %d\n"
"- Message : %s" % (
response.url,
response.status_code,
message))
# Si dossier déjà créé
elif (response.text.find("NUMADHERENT d") > 0 or
response.text.find("SIRET d") > 0 or
response.text.find("RAISONSOCIALE d") > 0):
return response.json().get('dossiersExistants')[0]
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
"""

Benjamin
a validé
url = '/alfresco/s/erp/listedocuments?nodeId=' + node_id
return self.alfresco_get_by_url(url=url, call_type='get').json()
def alfresco_list_type(self):
""" 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()
return {
'periode': self.get_allowed_values(
list_type=list_type,
value='crm:periode'),
'type': self.get_allowed_values(
list_type=list_type,
value='crm:type'),
}
def alfresco_get_doc(self, nodeRef):
""" 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'
json = {
'raisonSociale': partner.name,
"id": partner.id,
"siret": partner.siret,
"numAdherent": partner.member_number,
"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
:param partner: objet Odoo créé
@return: id Alfresco (nodeRef) du dossier
"""
url = '/alfresco/s/erp/updatedossierorganisme/' + partner.id_alfresco
json = {
'raisonSociale': partner.name,
"id": partner.id,
"siret": partner.siret,
"numAdherent": partner.member_number,
"ur": partner.ur_id

Benjamin
a validé
}
return self.get_nodeRef(
self.alfresco_get_by_url(url=url, call_type='post', json=json).json())

Benjamin
a validé
def alfresco_upload(self, partner, type, periode, validite, filename, mimetype, doc):
""" Upload d'un document sur Alfresco
:param doc: document encodé en base64
@return: id Alfresco (nodeRef) du fichier
"""
url = '/alfresco/s/erp/depotdocument'
json = {

Benjamin
a validé
'folderNodeId': partner.id_alfresco,
'periode': periode,
'type': type,
'nomOrigine': filename,
self.alfresco_get_by_url(url=url, call_type='post', json=json).json())
# Delete Methods
def alfresco_remove(self, nodeRef):
""" 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')
def get_nodeRef(self, result):
""" 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/', '')
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
def push_alfresco_file(
self, file, name, partner, type,
context='STD', year=fields.Datetime.now().year):
"""
Ajoute un fichier sur la GED Alfresco
@return: fonction get_partner_files() de res.partner
"""
backend = self.env['cmis.backend'].search([], limit=1)
if not partner.partner_cmis_folder:
# TODO: commit value on creation because of error
folder = partner.create_cmis_folder()
else:
folder = partner.partner_cmis_folder
try:
cmis_obj = backend.get_cmis_repository().getObject(folder)
file_upload = cmis_obj.createDocument(
name=name,
properties={
'cmis:objectTypeId': 'D:crm:document',
'cmis:secondaryObjectTypeIds': ['P:crm:organisme'],
'crm:type': type,
'crm:contexte': context,
'crm:annee': year
},
contentFile=file,
contentType='application/pdf'
)
except (ContentAlreadyExistsException, ObjectNotFoundException,
UpdateConflictException, InvalidArgumentException) as e:
_logger.error(e)
raise exceptions.ValidationError("""Erreur de mise à jour Alfresco :
- Code : %s
- Url : %s
- Détail : %s""" % (e.status, e.url, e.details))
except Exception as e:
raise exceptions.ValidationError(e)
return file_upload