Development #29889
jsondatastore : endpoint de recherche
0%
Description
Cas d'usage : une instance de connecteur jsondatastore utilisé comme référentiel d'association.
Ce référentiel se constitue grâce à une démarche de déclaration d'association, un usager peut déclarer X associations.
Dans le portail d'agent, une cellule de recherche, on aimerait qu'en y tapant un nom d'asso, ressorte l'usager qui l'a déclaré.
Et donc un endpoint qui rechercherait dans JsonData.text et renverrait une réponse exploitable par une cellule de recherche.
Fichiers
Demandes liées
Historique
Mis à jour par Nicolas Roche il y a plus de 4 ans
Est-ce que par chance #35780 ne ferait-il pas l'affaire ?
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
#35780 ne renvoie qu'une ligne, la première qui matche, il faudrait plutôt gérer un paramètre q
sur le endpoint list
je pense.
Mis à jour par Nicolas Roche il y a plus de 4 ans
Non non, c'était justement l'objet de la demande de Paul dans ce ticket :
Ça m'arrangerait bien que cet appel renvoie une liste d'objets comme un simple GET sur /jsondatastore/whatever/data/.
et dans les tests :
resp = app.get('/jsondatastore/foobar/data/', params={'key1': 'val1', 'key2': 'val2'}) assert sorted([d['id'] for d in resp.json['data']]) == sorted([uuid2, uuid3])
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
text
via q
, parce que pour l'instant ça ne permet qu'un match exact alors qu'il faudrait pour de la recherche :
- pouvoir rechercher une sous chaîne,
- que ce soit insensible aux accents et à la casse.
Mis à jour par Nicolas Roche il y a plus de 4 ans
- Fichier 0001-jsondatastore-add-a-search-endpoint-29889.patch 0001-jsondatastore-add-a-search-endpoint-29889.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Solution un peu moche parce que les nom des champs à renvoyer peuvent interférer avec les couples clé/valeurs passés pour la recherche.
ie: les chaînes 'url_field', 'text_field' et 'description_field' sont exclues des clés utilisables pour la recherche.
Peut-être qu'il faudrait des paramètres plus explicites : je pensais à 'projected_XXX_field' mais ça ne colle pas avec la définition d'une projection.
Pour tester :
Une instance de connecteur jsondatastore utilisée comme référentiel d'association. Ce référentiel se constitue grâce à une démarche de déclaration d'association, un usager peut déclarer X associations.
$ curl -X POST -d '{"text": "miam", "description": "miam miam", "url": "http://www.miam-asso.fr/", "usager": "manu"}' https://passerelle.dev.publik.love/jsondatastore/associations/data/create $ curl -X POST -d '{"text": "miam", "description": "miam miam", "url": "http://www.miam-asso.fr/", "usager": "nico"}' https://passerelle.dev.publik.love/jsondatastore/associations/data/create
Dans le portail d'agent, une cellule de recherche, on aimerait qu'en y tapant un nom d'asso, ressorte l'usager qui l'a déclaré.
~/.config/publik/settings/combo/settings.d/assos.py :
COMBO_SEARCH_SERVICES = { 'user': { 'label': "usager qui a declare l'association", 'url': 'https://passerelle.dev.publik.love/jsondatastore/associations/search/?text_field=usager&description_field=usager&text=%(q)s', }, }
Et donc un endpoint qui rechercherait dans JsonData.text et renverrait une réponse exploitable par une cellule de recherche.
$ curl 'https://passerelle.dev.publik.love/jsondatastore/associations/search/?text=ia&text_field=usager' | json_pp { "data" : [ { "description" : "miam miam", "text" : "nico", "url" : "http://www.miam-asso.fr/" }, { "description" : "miam miam", "text" : "manu", "url" : "http://www.miam-asso.fr/" } ], "err" : 0 }
Mis à jour par Frédéric Péters il y a plus de 4 ans
Solution un peu moche parce que les nom des champs à renvoyer peuvent interférer avec les couples clé/valeurs passés pour la recherche.
Je pense que les résultats doivent être identiques à ce qu'on obtient via le endpoint list, pas inventer ici un système créant autre chose. Et exprimé ainsi ça devient évident qu'il s'agit "juste" d'accepter des paramètres supplémentaires sur cet endpoint, et je serais pour juste deux trucs, &whatevey=plop, filtre exact sur une clé, &id=plop, filtre exact sur l'attribut id, et &q=plop, filtre sur l'attribut text (mais pas exact, ici .lower() et se contenter d'une sous-chaine).
Mis à jour par Nicolas Roche il y a plus de 4 ans
- Lié à Development #37849: jsondatastore: ajouter &q=plop, filtre sur l'attribut text au endpoint list ajouté
Mis à jour par Nicolas Roche il y a plus de 4 ans
- Fichier 0001-jsondatastore-add-a-search-endpoint-29889.patch 0001-jsondatastore-add-a-search-endpoint-29889.patch ajouté
- Statut changé de En cours à Solution proposée
les résultats doivent être identiques à ce qu'on obtient via le endpoint list
Voici un path qui factorise le code du endpoint list (lui même adapté dans #37849).
Mis à jour par Thomas Noël il y a plus de 4 ans
- Statut changé de Solution proposée à En cours
Comme disait Frédéric, il ne s'agit pas de créer un nouvel endpoint. Il faut rester dans "list", juste lui ajouter les paramètres optionnels.
Mis à jour par Nicolas Roche il y a plus de 4 ans
Je pense que les résultats doivent être identiques à ce qu'on obtient via le endpoint list
en fait non, la structure retournée est différente :
## contenu du jsondatastore brut {"data": [{ "content": { "asso": "cyclofficine", "declarant": "nico" }, "text": "cyclofficine", "creation_datetime": "2019-11-20T13:53:42.618Z", "id": "83f9a3a7705943528cf09374489ce651", "last_update_datetime": "2019-11-20T13:53:42.618Z" }, ---- ## contenu pour une cellule de recherche {"data" : [{ "description" : "cyclofficine", "text" : "nico", "url" : "http://quelconque.fr/" },
Surtout, je ne saurais pas quoi faire des 3 paramètres de projection dans le endpoint liste.
url_field='url', text_field='text', description_field='description'
Mis à jour par Thomas Noël il y a plus de 4 ans
On voit qu'il faut juste ajouter des clés (url et description) dans les dicos des résultats de list. Laisser tout le reste, c'est toujours bien de l'avoir, et la cellule de recherche de Combo saura éventuellement l'exploiter.
En gros tu peux simplement modifier to_json et y ajouter deux clés:
'url': self.content.get('url') if self.content else None, 'description': self.content.get('description') if self.content else None,
Les truc_field sont inutiles.
(mais je relis ton patch et je constate qu'il ne s'applique pas sur master, ou "list" n'a pas de paramètre q... j'ai dû rater un bout.)
Mis à jour par Nicolas Roche il y a plus de 4 ans
J'ai déporté l'ajout du paramètre q
dans #37849.
Merci pour les explications !
... mais j'aurais quand même besoin d'au moins un champs 'truc' pour savoir quel champs retourner :
une cellule de recherche, on aimerait qu'en y tapant un nom d'asso, ressorte l'usager qui l'a déclaré.
il s'agirait de retourner l'utilisateur qui a déclaré l'association et qui donc serait un champs 'annexe'.
En gros j'ai compris :
select (déclarant) from Asso where description="cyclofficine"
Sauf peut-être si la cellule de recherche de Combo saura fouiller le JSON pour le retrouver ? Dis-moi.
Mis à jour par Frédéric Péters il y a plus de 4 ans
Sauf peut-être si la cellule de recherche de Combo saura fouiller le JSON pour le retrouver ? Dis-moi.
Dans la définition d'un service de recherche dans Combo (COMBO_SEARCH_SERVICES), on peut définir les gabarits des libellés, descriptions et URL, ex:
COMBO_SEARCH_SERVICES = { 'association': { 'label': 'Search an association', 'url': 'https://passerelle.whatever/.../?q=%(q)s', 'hit_url_template': '{{content.url}}', 'hit_label_template': '{{text}}', }, }
La seule exigence concernant la structure est {"data": [...]}, pas besoin d'adaptations au contenu.
Mis à jour par Nicolas Roche il y a plus de 4 ans
Merci, j'ai fini par atterrir : les projections sont déjà gérées au travers des champs hit_XXX_template
utilisable dans la configuration des cellules de recherche, lors du rendu de la cellule.
{ "COMBO_SEARCH_SERVICES": { "association": { "label": "Search an association", "url": "https://passerelle.dev.publik.love/jsondatastore/associations/data/?q=%(q)s", "hit_url_template": "ici/{{content.usager}}", "hit_label_template": "{{text}}", "hit_description_template": "déclaré par {{content.usager}}" } } }
En utilisant cette configuration, je constate qu'il n'y a besoin de rien de plus que ce qui est proposé par #37849.
J'attends qu'il soit résolu pour fermer ici.