Skip to content
Snippets Groups Projects
api_alfresco.py 7.11 KiB
Newer Older
  • Learn to ignore specific revisions
  • Benjamin's avatar
    Benjamin committed
    # © 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
    
    Benjamin's avatar
    Benjamin committed
    
    from odoo import models, exceptions, tools
    
    _logger = logging.getLogger(__name__)
    
    
    
    Benjamin's avatar
    Benjamin committed
    class CgscopAlfresco(models.AbstractModel):
    
    Benjamin's avatar
    Benjamin committed
        """ Appelle l'API alfresco et implémente les fonctions suivantes :
    
        alfresco_list_docs : liste les documents
        """
    
    Benjamin's avatar
    Benjamin committed
        _name = 'cgscop.alfresco'
    
    Benjamin's avatar
    Benjamin committed
        _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
    
    Benjamin's avatar
    Benjamin committed
            basicAuthCredentials = (
    
    Benjamin's avatar
    Benjamin committed
            try:
                if call_type == 'get':
                    response = requests.get(
                        alfresco_url + url,
    
                        auth=basicAuthCredentials,
                        verify=alfresco_ssl)
    
    Benjamin's avatar
    Benjamin committed
                elif call_type == 'post':
                    response = requests.post(
                        alfresco_url + url,
                        auth=basicAuthCredentials,
    
    Benjamin's avatar
    Benjamin committed
                elif call_type == 'delete':
                    response = requests.delete(
                        alfresco_url + url,
                        auth=basicAuthCredentials,
    
    Benjamin's avatar
    Benjamin committed
            except Exception as err:
                _logger.warning(
                    "Erreur de connexion. URL: %s",
                    err.__str__(),
                )
    
            # Gestion erreur API
            if response.status_code not in [200, 201]:
    
                try:
                    message = response.json().get('message')
                except:
                    message = response.text
    
                raise exceptions.Warning(
                    "L'appel url '%s' a échoué\n"
                    "- Code erreur : %d\n"
                    "- Message : %s" % (
                        response.url,
                        response.status_code,
    
            # Si dossier déjà créé
    
    Benjamin's avatar
    Benjamin committed
            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]
    
    Benjamin's avatar
    Benjamin committed
    
        # Get Methods
    
    Benjamin's avatar
    Benjamin committed
            """ 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()
    
    Benjamin's avatar
    Benjamin committed
    
        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()
    
    Benjamin's avatar
    Benjamin committed
            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
    
    Benjamin's avatar
    Benjamin committed
    
        # 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
            }
            return self.get_nodeRef(
    
                self.alfresco_get_by_url(url=url, call_type='post', json=json).json())
    
    Benjamin's avatar
    Benjamin committed
    
    
        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
            }
            return self.get_nodeRef(
    
                self.alfresco_get_by_url(url=url, call_type='post', json=json).json())
    
        def alfresco_upload(self, partner, type, periode, validite, filename, mimetype, doc):
    
    Benjamin's avatar
    Benjamin committed
            """ Upload d'un document sur Alfresco
    
            :param doc: document encodé en base64
    
            @return: id Alfresco (nodeRef) du fichier
            """
            url = '/alfresco/s/erp/depotdocument'
            json = {
    
                'periode': periode,
                'type': type,
                'nomOrigine': filename,
    
    Benjamin's avatar
    Benjamin committed
                'mimeType': mimetype,
    
    Benjamin's avatar
    Benjamin committed
                'contentBase64': doc,
            }
            return self.get_nodeRef(
    
                self.alfresco_get_by_url(url=url, call_type='post', json=json).json())
    
    Benjamin's avatar
    Benjamin committed
    
        # 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()
    
    Benjamin's avatar
    Benjamin committed
    
        # 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/', '')