Projet

Général

Profil

Development #12876

Connecteur CMIS pour déposer un fichier

Ajouté par Frédéric Péters il y a plus de 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Jean-Baptiste Jaillet
Version cible:
-
Début:
18 août 2016
Echéance:
19 mai 2017
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Pour déposer des fichiers ou aller en chercher, depuis un workflows wcs.


Fichiers

0001-cmis-add-cmis-connector-to-upload-file-12876.patch (5,02 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 19 août 2016 17:52
0001-cmis-add-cmis-connector-12876.patch (7,68 ko) 0001-cmis-add-cmis-connector-12876.patch Jean-Baptiste Jaillet, 24 août 2016 12:44
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (7,09 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 24 août 2016 17:17
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (5,71 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 24 août 2016 18:14
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (8,43 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 01 septembre 2016 16:42
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,5 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 14 septembre 2016 18:43
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (13 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 14 septembre 2016 18:56
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (13,5 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 23 septembre 2016 18:11
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (14,4 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 17 octobre 2016 17:17
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (14,4 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 17 octobre 2016 17:25
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (11,9 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 17 octobre 2016 17:40
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 17 mai 2017 12:13
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,1 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 17 mai 2017 15:01
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,3 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 17 mai 2017 16:50
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,1 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 29 mai 2017 11:03
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,1 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 30 mai 2017 23:29
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,6 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 06 juin 2017 18:49
0001-cmis-add-cmis-connector-to-upload-file-12876.patch (12,6 ko) 0001-cmis-add-cmis-connector-to-upload-file-12876.patch Jean-Baptiste Jaillet, 09 juin 2017 12:07

Demandes liées

Lié à Passerelle - Development #12881: Connecteur CMIS pour récupérer un fichierRejeté19 août 2016

Actions

Révisions associées

Révision be2c2681 (diff)
Ajouté par Jean-Baptiste Jaillet il y a presque 7 ans

cmis: add cmis connector to upload file (#12876)

Historique

#1

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Je n'avais pas saisi qu'il fallait aussi en chercher.
Du coup le endpoint renvoit dans le json dans 'text' le contenu en base64?

J'ai fait le endpoint pour déposer mais je n'ai pas encore les tests. Est ce que je mets déjà un patch ou j'attends de faire aussi la récupération?

#2

Mis à jour par Frédéric Péters il y a plus de 7 ans

  • Sujet changé de Connecteur CMIS à Connecteur CMIS pour déposer un fichier

Limitons ce ticket au dépôt.

#3

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch ajouté
  • Statut changé de Nouveau à En cours
  • Patch proposed changé de Non à Oui

Voilà, y'a le dépot pour l'instant.

Du coup pour tester il faut installer Alfresco, la version community https://www.alfresco.com/alfresco-community-download (la version Linux bien entendu :)).
Ensuite il faut suivre http://docs.alfresco.com/community/tasks/simpleinstall-community-lin-text.html (grosso modo lancer un bin et suivre les instructions, c'est tout graphique).
Le numéro de version est bon normalement (5.x).
C'est lancé, sinon pour lancer ensuite il suffit de faire alfresco.sh start.
Pour les tests, le point d'entrée cmis de l'instance est 'http://localhost:8080/alfresco/cmisatom' (adapter en fonction de si vous avez changé les confs). Paramètre cmis_endpoint du connecteur.

#4

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

#5

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Petite erreur corrigée

#6

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch supprimé
#7

Mis à jour par Frédéric Péters il y a plus de 7 ans

Le fichier views.py vide peut être laissé de côté.

cmis_client plutôt que cmisClient.

username plutôt que login.

typo dans plateform.

Dans cmislib le content type peut être laissé à None, rendre celui-ci optionnel dans le connecteur ?

Retourner quelque chose pour dire que ça a marché ou que ça a échoué (mauvais json en entrée, chemin non existant, etc.)

Idéalement au moins un test.

#8

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Voilà j'ai fait les modifs et comme j'ai mit dans l'autre ticket j'ai tout regroupé ici (depot et retrait de fichier)
Je mets pour l'instant sans les tests comme ça s'il y a un retour avant sur la forme..

#9

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch ajouté

Bon j'ai réouvert l'autre ticket et j'ai refais en sorte que ce commit ne soit que le dépot de fichier.

#10

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch supprimé
#12

Mis à jour par Thomas Noël il y a plus de 7 ans

Une seule migration nécessaire (initial). Eviter aussi de mettre trop de choses à l'intérieur d'un try/except. Courage :)

#13

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch ajouté

Voilà après les quelques remarques ! patch mis à jour

#14

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch supprimé
#16

Mis à jour par Thomas Noël il y a plus de 7 ans

Ça me semble ok ; quelque test et c'est ok.

#17

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Voilà avec les tests

#18

Mis à jour par Frédéric Péters il y a plus de 7 ans

Manque un entête avec la licence dans les fichiers + une dépendance à python-cmslib dans debian/control.

body = ast.literal_eval(response.body)

Ici aussi, json.load.

Aussi il faudrait limiter l'accès à cette API (perm="can_upload_file", genre).

#19

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

J'ai fait les modifs.

#20

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Mon mauvais (my bad) j'avais oublié la dépendance dans debian/control.

#21

Mis à jour par Benjamin Dauvergne il y a plus de 7 ans

De mon point de vue ça manque de contrôle des entrées ici:

        data = json.loads(request.body)
        title = data['filename']
        path = data['path'].encode('utf-8')
        content = base64.b64decode(data['content'])
        content_type = data['contentType']

Si le contenu n'est pas du JSON ou si une des clé manque ou si la clé content n'est pas du base64.

#22

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Hop. Avec les perms, contrôles et modifications des tests en conséquence du coup.

#23

Mis à jour par Thomas Noël il y a plus de 7 ans

Je dirais que:
  • dans settings, ne pas retirer le commentaire "# backoffice templates and static" avant gadjo
  • il faudrait renvoyer du 400 quand les données en entrée sont mauvaises
  • les help_text sont inutiles
  • je ne suis pas très fan des « except Exception as e: » en général, qui vont empecher de remonter des alertes "bas niveau" quand il y aura un vrai problème
  • la fonction cmis_connection() a un nom un peu bizarre, parce qu'elle revoie en fait un repository (et pas une "connection")
  • dans les tests tu pourrais ajouter quelques plantages que tu as prévus dans le code, en envoyant des mauvais fake_file
  • il ne faut pas construire l'url avec reverse, mais en dur, comme ça si on la change un jour par mégarde, le test plantera (regression)

Par ailleurs est-on sûr de toujours vouloir envoyer dans defaultRepository et pas ailleurs (bon, c'est un autre sujet, je ne connais pas bien le cadre d'utilisation de ce connecteur) ?

#24

Mis à jour par Benjamin Dauvergne il y a plus de 7 ans

Thomas Noël a écrit :

Je dirais que:
  • il faudrait renvoyer du 400 quand les données en entrée sont mauvaises

non pas de 400, que du 'err': x on a dit, on laisse les erreurs HTTPs à Django.

#25

Mis à jour par Thomas Noël il y a plus de 7 ans

Arf : « il faudrait renvoyer du 400 quand les données en entrée sont mauvaises » en fait non, je me trompe encore, excuses.

Ce sont nginx ou les middleware de Django qui renvoient les erreurs HTTP : le code de nos connecteurs doit toujours renvoyer 200, mais avec une err (raise ApiError(message)) le cas échéant.

#27

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Oublié la remarque sur le commentaire du setting pour gadjo.

#28

Mis à jour par Frédéric Péters il y a plus de 7 ans

A-t-on vraiment besoin de urls.py/views.py ?

#29

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Ça ne permet pas l'affichage du détails?
Ou c'est géré en amont si tu as un whatever-details.html ?

#30

Mis à jour par Frédéric Péters il y a plus de 7 ans

C'est géré via :

    url(r'^(?P<connector>[\w,-]+)/(?P<slug>[\w,-]+)/$',
        GenericConnectorView.as_view(), name='view-connector'),
#31

Mis à jour par Jean-Baptiste Jaillet il y a plus de 7 ans

Okay. Du coup en effet les deux fichiers sont inutiles.

#32

Mis à jour par Frédéric Péters il y a plus de 7 ans

Il faut ajouter ça à ton .gitconfig, comme ça quand tu regardes ton patch avec "git show" avant de l'envoyer, il y aura en rouge les espaces de fin de ligne, à supprimer.

[color]
  branch = auto
  diff = auto
  interactive = auto
  status = auto

La migration annonce une dépendance sur 0003_endpointcheckping qui n'existe pas encore.

#33

Mis à jour par Frédéric Péters il y a plus de 7 ans

Il faut aussi ajouter PASSERELLE_APP_CMIS_ENABLED = True au settings.py.

#34

Mis à jour par Frédéric Péters il y a plus de 7 ans

Il faut modifier le _detail.html pour définir un @{% block description %}, pour que le mot de passe n'apparaisse pas. Alternativement, pouvoir marquer ces champs d'une manière ou d'une autre et faire respecter ça à service_view.html.

#35

Mis à jour par Frédéric Péters il y a environ 7 ans

Prendre en compte les derniers commentaires, et les modifs récentes dans passerelle.

#36

Mis à jour par Frédéric Péters il y a environ 7 ans

  • Echéance mis à 07 avril 2017
#37

Mis à jour par Frédéric Péters il y a presque 7 ans

  • Echéance changé de 07 avril 2017 à 26 mai 2017

Échéance discutée par jabber et posée à fin mai.

#38

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

instance publique d'Alfresco pour test CMIS: https://www.alfresco.com/cmis

#39

Mis à jour par Pierre Cros il y a presque 7 ans

  • Echéance changé de 26 mai 2017 à 19 mai 2017
#40

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

Voilà j'ai remis le patch avec un bémol sur mes tests.
J'ai galéré à retrouver le endpoint pour cmis sur alfresco, d'abord sur l'instance publique puis ensuite en local (superbe doc). La lib python cmislib se connecte à partir d'une certaine url (pour l'instant je n'ai vu que des exemples pour alfresco mais bon). C'est plus ou moins une sorte de wsdl (cmisatom).

Mais ça fonctionne, j'ai créé un connecteur avec AccessRight, ApiUser et j'ai pu poser mon fichier.

Mais quand je lance les tests, j'ai un

E   RuntimeError: Conflicting 'cmisconnector_users' models in application 'cmis': <class 'passerelle.apps.cmis.models.CmisConnector_users'> and <class 'cmis.models.CmisConnector_users'>
et là j'avoue que je sèche sur pourquoi j'ai ce problème (que je n'avais pas avant). Je suis aller voir les changements sur BaseRessource et je ne comprends pas pourquoi cette erreur survient. L'héritage du many-to-many sur ApiUser semble chier à un moment. Je veux bien un conseil (je rappelle que c'est uniquement quand je lance les tests).

Pour tester sur la plateforme en ligne, il faut déclarer le connecteur comme ceci:

CmisConnector.objects.create(cmis_endpoint='https://cmis.alfresco.com/alfresco/cmisatom', username='admin', password='admin')

Dans le payload qui doit ressembler à ça :

fake_file = {
    'filename': 'test.txt',
    'path': '/Partagé',
    'content': base64.b64encode('fake file content.'),
    'contentType': 'text/plain'
}

Si le path est à '', j'ai fait en sorte que ça prenne le Folder racine du dépot, donc ça mettra le fichier dedans (la valeur Partagé c'est sur mon local, j'ai un dossier Partagé). Comme on a pas accès au dossiers directement, c'est plus simple pour tester (je suis aller regarder avec cmis ce qu'il y avait sur le repo).

Je me demandais si du coup les tests je les faisais dessus, mais il faudrait supprimer le fichier à chaque fois (et je ne sais pas si cmislib le permet, je vais regarder) et évidemment, si la plateforme disparaît ou tombe, tous les tests foirent. Mais bon

#41

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch ajouté

Avec le patch pardon

#42

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

Il y a eu un couac sur mon git désolé je remets le patch.

#43

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch supprimé
#44

Mis à jour par Frédéric Péters il y a presque 7 ans

E RuntimeError: Conflicting 'cmisconnector_users' models in application 'cmis': <class 'passerelle.apps.cmis.models.CmisConnector_users'> and <class 'cmis.models.CmisConnector_users'>

C'est parce que d'un côté tu as passerelle.apps.cmis et de l'autre juste cmis. Ma recommandation et d'utiliser passerelle.apps.cmis. partout.

Je me demandais si du coup les tests je les faisais dessus, mais il faudrait supprimer le fichier à chaque fois (et je ne sais pas si cmislib le permet, je vais regarder) et évidemment, si la plateforme disparaît ou tombe, tous les tests foirent. Mais bon

Les tests doivent fonctionner hors ligne, utiliser Mock.

#45

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

Ok, j'en ai profité pour clean l'import des exceptions (plus court et virer l'import inutile de CmisLibException).

#46

Mis à jour par Frédéric Péters il y a presque 7 ans

    cmis_endpoint = models.CharField(max_length=250, verbose_name=_('CMIS endpoint'),
                                     help_text=_('URL of the CMIS endpoint'))

Pourquoi pas URLField ?

raise APIError('CmisError : Invalid JSON string sent.')

et les autres; plutôt faire une exception CMISError(APIError) que préfixer les messages avec CmisError. Cela évitera aussi un commentaire sur l'espace en trop devant les :.

repo_name = kwargs.get('repo', False)

Pourquoi "False" ?

        if repo_name:
            for repo in cmis_client.getRepositories():
                if repo_name == repo['repositoryName']:
                    return cmis_client.getRepository(repo['repositoryId'])
        return cmis_client.defaultRepository

Le comportement quand on spécifié un repo_name et qu'il n'existe pas est mauvais : il ne faut pas (surtout silencieusement) retomber sur le dépôt par défaut.

{% block description %}
{% endblock %}

Noter pourquoi on refuse d'afficher la description automatique. (parce qu'on ne veut pas afficher le mot de passe) Mais le vrai truc ce serait d'afficher la description, sans le mot de passe. Ça pourrait être fait en gardant le block description natif mais en ajoutant un get_description_fields dans le connecteur.

    conn = CmisConnector.objects.create(cmis_endpoint='http://cmis_endpoint.com/cmis', username='admin',

Pour les tests, il faut utiliser example.{net,com,org}, pas inventer des domaines.

#47

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch ajouté

Ok pris en compte.
Pour les APIError c'était suite à une discussion sur les erreurs de passerelle, mais en regardant l'historique c'était surtout l'histoire de renvoyer tout le temps 200. Donc c'est changé.

Pour le repo name, j'ai passé ça en argument optionnel du payload (chaîne vide si non trouvée). Si le paramètre est présent et qu'on ne trouve pas de répo je renvoie bien une erreur.
Je considère que l'absence du paramètre repository_name ou une valeur à '' dans le payload revient à choisir le repo par défaut.

#48

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

Erreur de typo dans le message d'erreur en cas de repository non trouvé.
Désolé pour le spam

#49

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

  • Fichier 0001-cmis-add-cmis-connector-to-upload-file-12876.patch supprimé
#50

Mis à jour par Frédéric Péters il y a presque 7 ans

{% blocktrans %}
The API currently doesn't support all parameters and is limited to the JSON
format.
{% endblocktrans %}

Me semble un copié/collé sans rapport.

#51

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

En effet. J'ai du coup enlevé le block endpoint dans le template.

#52

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

Juste parce que ça fait moche dans mon vim, c'est deux lignes avant un classe ou une fonction de top niveau (dans les tests) et une ligne avant une méthode, sauf en début de classe.

#53

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

Ok, pris en compte.

#54

Mis à jour par Frédéric Péters il y a presque 7 ans

Application de  cmis: add cmis connector to upload file (#12876)
.git/rebase-apply/patch:323: new blank line at EOF.
+
warning: 1 ligne a ajouté des erreurs d'espace.

Il manque dans cmisconnector_detail.html l'info pointant l'endpoint existant (url, méthode HTTP, description du json attendu, etc.).

#56

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

{% block endpoints %}

<ul>

  <li>

    <h4>{% trans 'Upload file' %}</h4>

    {% url "generic-endpoint" connector="cmis" slug=object.slug endpoint="upload_file" as upload_file %}

    <p> <strong>POST</strong> <a href="{{upload_file}}">{{upload_file}}</a></p>

    <p>

     data_send = {

       'filename': 'test.txt',

       'path': '/a/path',

       'content': 'ZmlsZSBjb250ZW50' (base64),

       'contentType': 'text/plain'

    }

    </p>

  </li>

</ul>

{% endblock %}

Il faut utiliser le tag "pre" et pas "p" sinon tu on ne verra pas la formatage de ton exemple de JSON.

#57

Mis à jour par Jean-Baptiste Jaillet il y a presque 7 ans

Exact, c'est plus clair.

#58

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

Voilà, relecture et correction, http://git.entrouvert.org/passerelle.git/log/?h=wip/relecture-ticket-cmis-12876 . Les tests passent.

#59

Mis à jour par Frédéric Péters il y a presque 7 ans

Ok, envoie.

#60

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

  • Statut changé de En cours à Solution déployée
#61

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Solution déployée à Fermé

Formats disponibles : Atom PDF