Projet

Général

Profil

Development #5057

Sources de données et web-services externes pré-configurés

Ajouté par Thomas Noël il y a presque 10 ans. Mis à jour il y a plus de 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
Début:
26 juin 2014
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Actuellement, quand on utilise une source externe dans wcs (liste json/jsonp dans un formulaire, par exemple) ou un web-service, on doit taper l'URL directement. C'est source d'erreur et de soucis lors des passages recette/prod, etc.

Je propose d'ajouter un type "source de donnée" qui proposerait une liste définie (on laisse cependant en parallèle le fonctionnement actuel des sources et services "libres").

Cette liste pourrait être définie dans d'admin (une page "source de données et services externes") ; et serait en partie générée (en readonly ?) par le portail-admin (hobo) lors de déploiement automatique.

Ce ticket est d'abord là pour discuter un peu de la chose...


Fichiers

Révisions associées

Révision 733200e6 (diff)
Ajouté par Frédéric Péters il y a presque 9 ans

backoffice: add an interface to manage named data sources (#5057)

Historique

#1

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

Yep je dirai même plus, un cas d'usage ce serait par exemple:

Je souhaite avoir la liste des élus de la ville un peu partout:
  • je télécharge le fichier elu.csv dans passerelle, je nomme la nouvelle source de donnée "Liste des élus",
  • une nouvelle source de donnée "Liste des élus" apparaît dans w.c.s.
  • un nouveau bloc "Liste des élus" apparaît dans le portail citoyen, associé à un template autogénéré qui affiche simplement la donnée ex.: {{ data_sources.elu|pprint }}, et qu'il n'y a plus qu'à surcharger.
#2

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

À différents endroits, ici pour les sources de données, mais ce serait aussi le cas pour les regex de validation, on gagnerait en effet à pouvoir offrir une liste de valeurs prédéfinies, en plus de la possibilité d'entrer une valeur libre. Pour faire ça sans trop se casser la tête côté UI, on pourrait réutiliser le AutocompleteStringWidget et fournir la liste des valeurs possibles via jsonp1. Un autre avantage c'est que ça s'exporte et s'importe sans danger (la clé étant la valeur), mais l'inconvénient qui va avec, c'est qu'on n'a pas vraiment de centralisation de la valeur, qu'elle ne peut pas être modifiée à un endroit et propagée partout.

Pour reprendre cette question, qui est importante, pour un cas très simple, mettons le code postal.

  • Aujourd'hui on écrit ^\d{5}$ dans le formulaire.
  • Après ce ticket on pourrait choisir "Code postal" dans la liste.
    • Si on stocke ^\d{5}$ au niveau du formulaire, on peut en faire un import/export vers un autre site, même un ancien wcs.
    • Si on stocke "code postal", ça devient incompatible avec les anciens wcs, et avec les wcs où "code postal" ne serait pas défini. MAIS ça permet sur un site belge de redéfinir en une seule fois pour tous les formulaires le code postal comme étant ^\d{4}$.

La problématique du passage recette/prod est proche, mais peut s'arranger en ayant l'indirection aileurs; c'est ce qu'on fait à Montpellier, pour GDC, on met comme url [passerelle_url]/gdc/communes.

De mon côté j'aurais tendance à préférer le stockage de la valeur réelle (\d{5}$, et non "indirection vers code postal").

1 (et cf http://stackoverflow.com/questions/4132058/display-jquery-ui-auto-complete-list-on-focus-event pour que se déplie la liste de possibilités sur le focus)

#3

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

Plutôt qu'ajouter à ce ticket qui couvrait déjà deux choses distinctes (sources de données et webservices) une troisième (les regex de validation); un an plus tard je le ramènerais à un seul sujet, les sources de données, pour suivre ce qui s'est discuté aujourd'hui (et commencé dans #7466). Et ensuite, dans d'autres tickets, on verra pour les webservices, les regex et que sais-je d'autre.

#4

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

Un premier patch qui déplace des bouts de la gestion xml de categories.py vers qommon/xml_storage.py; puis le vrai travail derrière, qui ajoute un settings/data-sources/; patch à travailler, il faut notamment décider du point d'entrée vers cette zone (simplement depuis le settings/ ou également des "raccourcis" depuis d'autres endroits ?).

#5

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

Avec des tests en plus.

#6

Mis à jour par Thomas Noël il y a presque 9 ans

Premier ack pour 0001-misc-move-more-of-xml-storage-support-into-qommon.patch

#7

Mis à jour par Thomas Noël il y a presque 9 ans

Sur le second (notes au fil de l'eau)
  • _xml_tagname = 'datasources' plutôt 'datasource'
  • dans le NamedDataSource::get_by_urlname j'aurais plutôt écrit du python 0.3 pour pas toujours tout lire (mais bon bof)
    def get_by_urlname(cls, url_name):
        for nds in cls.select():
             if nds.url_name == url_name:
                 return nds
        raise KeyError()
    
  • on ne met pas de test sur l'unicité de url_name (slug) pour l'instant ?
#8

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

on ne met pas de test sur l'unicité de url_name (slug) pour l'instant ?

Pour le moment il ne peut pas être posé par l'utilisateur et est garanti unique dans get_new_slug(); ça me suffisait. (initialement j'avais mis le slug et un test sur l'unicité dans le formulaire mais je me suis dit que je devrais d'abord réfléchir de manière générale à l'édition des slug/urlname, plutôt que l'avoir présent ici et nulle part ailleurs).

#9

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

Premier ack pour 0001-misc-move-more-of-xml-storage-support-into-qommon.patch

commit a2ccc22baad56f6fa4b72d32ec91d69f08ba9bc4
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Fri Jun 5 16:09:05 2015 +0200

    misc: move more of xml storage support into qommon/
#10

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

Voilà une dernière version du patch ajoutant les data sources nommés, c'est accessible derrière un lien nommé "Connectors" dans la page de paramètres; on pourra par la suite garder ce libellé pour y préconfigurer aussi les appels webservices d'appel, etc.

#11

Mis à jour par Thomas Noël il y a presque 9 ans

En relecture au niveau de la "forme", je vois ça à "optimiser":

def submit_form(self, form):
        self.datasource.name = form.get_widget('name').parse()
        name = form.get_widget('name').parse()

Ensuite, "from quixote import get_publisher" et "from qommon.misc import simplify, indent_xml" en trop dans wcs/data_sources.py

Et, mini détail, je parlerais juste de "data sources" et pas de "external data sources"

(je lis le reste après manger)

#12

Mis à jour par Thomas Noël il y a presque 9 ans

Quand on ajoute un data source, ça ouvre un popup où on doit choisir son type (python, json, jsonp), quand on valide le choix du type, le popup est fermé et on arrive sur une page normale. Voire sur une page avec une erreur si on n'a pas encore mis de nom. Pas très grave, mais je me dis qu'on pourrait ne pas mettre de popup, et voilà.

Par ailleurs, ça donne un lien "Connectors" qui amène sur une page "Data Source" : je me dis que peut-être, le lien pourrait être aussi "Data Source" ; surtout que celles-ci ne sont pas forcément toujours des "connecteurs". (nous avions déjà parlé de ce nom, je ne sais plus l'arguemnt pour connectors)

#13

Mis à jour par Thomas Noël il y a presque 9 ans

Si j'enregistre un datasource type formulaire sans formule, le XML ne contient pas de <value> et j'ai ensuite ce crash systématique sur la page de liste des datasource:

Exception:
  type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'text''

Stack trace (most recent call first):
  File "/home/thomas/dev/au-quotidien/wcs/wcs/data_sources.py", line 225, in import_data_source_from_xml
   223         return {
   224             'type': str(element.find('type').text),
>  225             'value': str(element.find('value').text),
   226             }
   227 

  locals: 
     self = <NamedDataSource 'test' id:1>
     charset = 'utf-8'
     element = <Element 'data_source' at 0x7f5c7b010850>

Parce que :

<datasources id="1">
  <name>test</name>
  <slug>test</slug>
  <data_source>
    <type>formula</type>
  </data_source>
</datasources>

(sans doute remplacer le if data_source.get('value'): de export_data_source_to_xml par un if 'value' in data_source:)

#14

Mis à jour par Thomas Noël il y a presque 9 ans

testé à la main avec succès

diff --git a/wcs/data_sources.py b/wcs/data_sources.py
index 0a8c1b5..2e93e57 100644
--- a/wcs/data_sources.py
+++ b/wcs/data_sources.py
@@ -216,8 +216,7 @@ class NamedDataSource(XmlStorableObject):
     def export_data_source_to_xml(self, element, attribute_name, charset):
         data_source = getattr(self, attribute_name)
         ET.SubElement(element, 'type').text = data_source.get('type')
-        if data_source.get('value'):
-            ET.SubElement(element, 'value').text = data_source.get('value')
+        ET.SubElement(element, 'value').text = data_source.get('value', '')

     def import_data_source_from_xml(self, element, charset):
         return {

et en fait non c'est pas le get d'un dict

#15

Mis à jour par Thomas Noël il y a presque 9 ans

Il manque un lien "delete"

--- a/wcs/admin/data_sources.py
+++ b/wcs/admin/data_sources.py
@@ -157,6 +157,7 @@ class NamedDataSourcesDirectory(Directory):
             r += htmltext('<strong class="label"><a href="%s/edit">%s</a></strong>') % (
                             datasource.id, datasource.name)
             r += htmltext('<p class="details">')
+            r += htmltext('<a href="%s/delete">%s</a>' % (datasource.id, _('delete')))
             r += htmltext('</p></li>')
         r += htmltext('</ul>')
         r += htmltext('</div>')
#16

Mis à jour par Thomas Noël il y a presque 9 ans

Voici une version corrigeant les remarques ci-dessus. Testée à la main, et tests adaptés.

Quand on clique sur un DS, on arrive plus sur la page d'édition, mais sur la page d'affichage du DS, qui propose en sidebar edit et delete. C'est plus "crud" ainsi.

J'ai aussi remplacé "New Named Data Source" par "New Data Source" parce que c'était la seule apparition de "Named".

#17

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

Ça marche pour moi, tu envoies dans le dépôt ?; pour le prefillwidget en popup, plus tard, ce qu'il faudrait, c'est que ça fonctionne en js, sans rechargement de la page…

#18

Mis à jour par Thomas Noël il y a presque 9 ans

  • Statut changé de En cours à Résolu (à déployer)

Voilà, poussé (et oui pour le popup, pas grave du tout)

commit 733200e6aa786896ab9e9d49146d154a295bf0dc
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Fri Jun 5 16:08:04 2015 +0200

    backoffice: add an interface to manage named data sources (#5057)

#19

Mis à jour par Thomas Noël il y a presque 9 ans

  • Version cible mis à v1.13.0
#20

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

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF