From cf624138272d216d2bc35b25869e9b1513f4f6a4 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Jaillet Date: Fri, 19 Aug 2016 10:36:28 +0200 Subject: [PATCH] cmis: add cmis connector to upload file (#12876) --- passerelle/apps/cmis/__init__.py | 0 passerelle/apps/cmis/migrations/0001_initial.py | 31 +++++++++++ .../cmis/migrations/0002_auto_20160824_0314.py | 31 +++++++++++ passerelle/apps/cmis/migrations/__init__.py | 0 passerelle/apps/cmis/models.py | 65 ++++++++++++++++++++++ passerelle/settings.py | 1 + 6 files changed, 128 insertions(+) create mode 100644 passerelle/apps/cmis/__init__.py create mode 100644 passerelle/apps/cmis/migrations/0001_initial.py create mode 100644 passerelle/apps/cmis/migrations/0002_auto_20160824_0314.py create mode 100644 passerelle/apps/cmis/migrations/__init__.py create mode 100644 passerelle/apps/cmis/models.py diff --git a/passerelle/apps/cmis/__init__.py b/passerelle/apps/cmis/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/passerelle/apps/cmis/migrations/0001_initial.py b/passerelle/apps/cmis/migrations/0001_initial.py new file mode 100644 index 0000000..40316f6 --- /dev/null +++ b/passerelle/apps/cmis/migrations/0001_initial.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0002_auto_20151009_0326'), + ] + + operations = [ + migrations.CreateModel( + name='CmisConnector', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=50)), + ('slug', models.SlugField()), + ('description', models.TextField()), + ('log_level', models.CharField(default=b'NOTSET', max_length=10, verbose_name='Log Level', choices=[(b'NOTSET', b'NOTSET'), (b'DEBUG', b'DEBUG'), (b'INFO', b'INFO'), (b'WARNING', b'WARNING'), (b'ERROR', b'ERROR'), (b'CRITICAL', b'CRITICAL'), (b'FATAL', b'FATAL')])), + ('cmis_endpoint', models.CharField(help_text='URL of the CMIS endpoint', max_length=250, verbose_name='CMIS endpoint')), + ('login', models.CharField(help_text='Login for user on platform', max_length=128, verbose_name='Service login')), + ('password', models.CharField(help_text='Password for user on plateform', max_length=128, verbose_name='Password')), + ('users', models.ManyToManyField(to='base.ApiUser', blank=True)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/passerelle/apps/cmis/migrations/0002_auto_20160824_0314.py b/passerelle/apps/cmis/migrations/0002_auto_20160824_0314.py new file mode 100644 index 0000000..1ee894d --- /dev/null +++ b/passerelle/apps/cmis/migrations/0002_auto_20160824_0314.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('cmis', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='cmisconnector', + name='login', + ), + migrations.AddField( + model_name='cmisconnector', + name='username', + field=models.CharField(default=datetime.datetime(2016, 8, 24, 8, 14, 37, 83586, tzinfo=utc), help_text='Username on DMS platform', max_length=128, verbose_name='Service username'), + preserve_default=False, + ), + migrations.AlterField( + model_name='cmisconnector', + name='password', + field=models.CharField(help_text='Password on DMS platform', max_length=128, verbose_name='Password'), + ), + ] diff --git a/passerelle/apps/cmis/migrations/__init__.py b/passerelle/apps/cmis/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/passerelle/apps/cmis/models.py b/passerelle/apps/cmis/models.py new file mode 100644 index 0000000..7d57f1a --- /dev/null +++ b/passerelle/apps/cmis/models.py @@ -0,0 +1,65 @@ +from cmislib import CmisClient +from cmislib.model import PermissionDeniedException, ObjectNotFoundException, UpdateConflictException, CmisException as CmisLibException +import json +import base64 +import logging + +from django.db import models +from passerelle.base.models import BaseResource +from passerelle.utils.api import endpoint +from django.utils.translation import ugettext_lazy as _ +from django.http import HttpResponse + +logger = logging.getLogger(__file__) + + +class CmisException(Exception): + http_status = 200 + log_error = False + + +class CmisConnector(BaseResource): + cmis_endpoint = models.CharField(max_length=250, verbose_name=_('CMIS endpoint'), + help_text=_('URL of the CMIS endpoint')) + username = models.CharField(max_length=128, verbose_name=_('Service username'), help_text=_('Username on DMS platform')) + password = models.CharField(max_length=128, + verbose_name=_('Password'), help_text=_('Password on DMS platform')) + + category = _('Business Process Connectors') + + @classmethod + def get_icon_class(cls): + return 'ressources' + + @endpoint(serializer_type='json-api', methods=['post']) + def upload_file(self, request, **kwargs): + data = json.loads(request.body) + + title = data['filename'] + path = data['path'].encode('utf-8') + content = base64.b64decode(data['content']) + content_type = data['contentType'] + + repo = self.cmis_connection() + try: + folder = repo.getObjectByPath(path) + doc = folder.createDocumentFromString(title, contentString=content, contentType=content_type) + except ObjectNotFoundException: + raise CmisException('Path not found on platform.') + except UpdateConflictException: + raise CmisException('The document already exists on platform.') + except Exception as e: + raise CmisException(str(e)) + + return doc.properties + + def cmis_connection(self): + try: + cmis_client = CmisClient(self.cmis_endpoint, self.username, self.password) + repo = cmis_client.defaultRepository + except PermissionDeniedException: + raise CmisException('Wrong username or password to connect to platform.') + except ObjectNotFoundException: + raise CmisException('Platform endpoint not found.') + + return repo diff --git a/passerelle/settings.py b/passerelle/settings.py index ce22ff5..536cefe 100644 --- a/passerelle/settings.py +++ b/passerelle/settings.py @@ -112,6 +112,7 @@ INSTALLED_APPS = ( 'base_adresse', 'csvdatasource', 'orange', + 'cmis', # backoffice templates and static 'gadjo', ) -- 2.8.1