https://dev.entrouvert.org/https://dev.entrouvert.org/favicon.ico?15861920342019-11-13T09:38:18ZRedmine Entr’ouvertPasserelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2008952019-11-13T09:38:18ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>Est-ce que par chance <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: jds : fournir une récupération de plusieurs objets par attribut (Fermé)" href="https://dev.entrouvert.org/issues/35780">#35780</a> ne ferait-il pas l'affaire ?</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2009352019-11-13T12:17:29ZBenjamin Dauvergne
<ul></ul><p><a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: jds : fournir une récupération de plusieurs objets par attribut (Fermé)" href="https://dev.entrouvert.org/issues/35780">#35780</a> ne renvoie qu'une ligne, la première qui matche, il faudrait plutôt gérer un paramètre <code>q</code> sur le endpoint <code>list</code> je pense.</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2009382019-11-13T12:52:13ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>Non non, c'était justement l'objet de la demande de Paul dans ce ticket :</p>
<blockquote>
<p>Ça m'arrangerait bien que cet appel renvoie une liste d'objets comme un simple GET sur /jsondatastore/whatever/data/.</p>
</blockquote>
<p>et dans les tests :<br /><pre>
resp = app.get('/jsondatastore/foobar/data/',
params={'key1': 'val1', 'key2': 'val2'})
assert sorted([d['id'] for d in resp.json['data']]) == sorted([uuid2, uuid3])
</pre></p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2009662019-11-13T14:30:04ZBenjamin Dauvergne
<ul></ul>Ok reste donc seulement à implémenter des opérateurs de match différents voir simplement le faire pour la clé <code>text</code> via <code>q</code>, parce que pour l'instant ça ne permet qu'un match exact alors qu'il faudrait pour de la recherche :
<ul>
<li>pouvoir rechercher une sous chaîne,</li>
<li>que ce soit insensible aux accents et à la casse.</li>
</ul> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2022602019-11-20T16:13:54ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Assigné à</strong> mis à <i>Nicolas Roche (absent jusqu'au 3 avril)</i></li></ul> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2022802019-11-20T17:51:06ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/39163">0001-jsondatastore-add-a-search-endpoint-29889.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/39163/0001-jsondatastore-add-a-search-endpoint-29889.patch">0001-jsondatastore-add-a-search-endpoint-29889.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>Nouveau</i> à <i>Solution proposée</i></li><li><strong>Patch proposed</strong> changé de <i>Non</i> à <i>Oui</i></li></ul><p>Solution un peu moche parce que les nom des champs à renvoyer peuvent interférer avec les couples clé/valeurs passés pour la recherche.<br />ie: les chaînes 'url_field', 'text_field' et 'description_field' sont exclues des clés utilisables pour la recherche.</p>
<p>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.</p>
<p>Pour tester :</p>
<blockquote>
<p>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.</p>
</blockquote>
<pre>
$ 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
</pre>
<blockquote>
<p>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é.</p>
</blockquote>
<p><em>~/.config/publik/settings/combo/settings.d/assos.py</em> :<br /><pre>
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',
},
}
</pre></p>
<blockquote>
<p>Et donc un endpoint qui rechercherait dans JsonData.text et renverrait une réponse exploitable par une cellule de recherche.</p>
</blockquote>
<pre>
$ 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
}
</pre> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2022822019-11-20T18:09:25ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><blockquote>
<p>Solution un peu moche parce que les nom des champs à renvoyer peuvent interférer avec les couples clé/valeurs passés pour la recherche.</p>
</blockquote>
<p>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).</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2023812019-11-21T10:56:44ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Lié à</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/37849">Development #37849</a>: jsondatastore: ajouter &q=plop, filtre sur l'attribut text au endpoint list</i> ajouté</li></ul> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2023822019-11-21T10:57:45ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>En cours</i></li></ul> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2025052019-11-21T17:15:10ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Fichier</strong> <a href="/attachments/39218">0001-jsondatastore-add-a-search-endpoint-29889.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/39218/0001-jsondatastore-add-a-search-endpoint-29889.patch">0001-jsondatastore-add-a-search-endpoint-29889.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Solution proposée</i></li></ul><blockquote>
<p>les résultats doivent être identiques à ce qu'on obtient via le endpoint list</p>
</blockquote>
<p>Voici un path qui factorise le code du endpoint list (lui même adapté dans <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: jsondatastore: ajouter &q=plop, filtre sur l'attribut text au endpoint list (Fermé)" href="https://dev.entrouvert.org/issues/37849">#37849</a>).</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2037982019-11-29T11:32:41ZThomas Noël
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>En cours</i></li></ul><p>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.</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2039162019-11-29T17:44:15ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><blockquote>
<p>Je pense que les résultats doivent être identiques à ce qu'on obtient via le endpoint list</p>
</blockquote>
<p>en fait non, la structure retournée est différente :<br /><pre>
## 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/"
},
</pre><br />Surtout, je ne saurais pas quoi faire des 3 paramètres de projection dans le endpoint liste.<br /><pre>
url_field='url', text_field='text', description_field='description'
</pre></p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2039242019-11-29T18:28:54ZThomas Noël
<ul></ul><p>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.</p>
<p>En gros tu peux simplement modifier to_json et y ajouter deux clés:</p>
<pre>
'url': self.content.get('url') if self.content else None,
'description': self.content.get('description') if self.content else None,
</pre>
<p>Les truc_field sont inutiles.</p>
<p>(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.)</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2039482019-11-30T08:22:12ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>J'ai déporté l'ajout du paramètre <code>q</code> dans <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: jsondatastore: ajouter &q=plop, filtre sur l'attribut text au endpoint list (Fermé)" href="https://dev.entrouvert.org/issues/37849">#37849</a>.<br />Merci pour les explications !<br />... mais j'aurais quand même besoin d'au moins un champs 'truc' pour savoir quel champs retourner :</p>
<blockquote>
<p>une cellule de recherche, on aimerait qu'en y tapant un nom d'asso, ressorte l'usager qui l'a déclaré.</p>
</blockquote>
<p>il s'agirait de retourner l'utilisateur qui a déclaré l'association et qui donc serait un champs 'annexe'.<br />En gros j'ai compris :<br /><pre>
select (déclarant) from Asso where description="cyclofficine"
</pre><br />Sauf peut-être si la cellule de recherche de Combo saura fouiller le JSON pour le retrouver ? Dis-moi.</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2039502019-11-30T11:46:06ZFrédéric Pétersfpeters@entrouvert.com
<ul></ul><blockquote>
<p>Sauf peut-être si la cellule de recherche de Combo saura fouiller le JSON pour le retrouver ? Dis-moi.</p>
</blockquote>
<p>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:</p>
<pre>
COMBO_SEARCH_SERVICES = {
'association': {
'label': 'Search an association',
'url': 'https://passerelle.whatever/.../?q=%(q)s',
'hit_url_template': '{{content.url}}',
'hit_label_template': '{{text}}',
},
}
</pre>
<p>La seule exigence concernant la structure est {"data": [...]}, pas besoin d'adaptations au contenu.</p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2042132019-12-02T16:10:40ZNicolas Roche (absent jusqu'au 3 avril)
<ul></ul><p>Merci, j'ai fini par atterrir : les projections sont déjà gérées au travers des champs <code>hit_XXX_template</code><br /> utilisable dans la configuration des cellules de recherche, lors du rendu de la cellule.<br /><pre>
{
"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}}"
}
}
}
</pre><br />En utilisant cette configuration, je constate qu'il n'y a besoin de rien de plus que ce qui est proposé par <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: jsondatastore: ajouter &q=plop, filtre sur l'attribut text au endpoint list (Fermé)" href="https://dev.entrouvert.org/issues/37849">#37849</a>.<br /><em>J'attends qu'il soit résolu pour fermer ici.</em></p> Passerelle - Development #29889: jsondatastore : endpoint de recherche https://dev.entrouvert.org/issues/29889?journal_id=2049662019-12-05T17:16:32ZNicolas Roche (absent jusqu'au 3 avril)
<ul><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Fermé</i></li></ul>