Development #27782
arcgis : ajouter un système de map-service-query pré-remplie
0%
Description
suite de #17763, ajouter sur les map service la possibilité d'avoir des query pré-machés, un peu comme sur les csvdatasource.
Copié d'une duplication de ce ticket (#39622):
Ce ticket vise à remplacer la proposition dans #39612, le but étant de passer un minimum de chose bien typés dans les URLs vers le connecteur ArcGis:- par rapport à #39612 ça évite de toucher à l'existant
- ce sera beaucoup plus simple à utiliser
Je reprends ici les sources de donnée définies pour Cannes (donné dans #39612) :
{{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=adresse%20like%20%27%{{form_var_recherche_adresse|default:"XYZXYZ"|upper|urlencode}}%%27&template=%7B%7Battributes.adresse%7Csafe%7D%7D+—+%7B%7Battributes.codepost|default:""%7D%7D+%7B%7Battributes.sectpost|default:""%7D%7D&id_template=%7B%7Battributes.ident%7D%7D&orderByFields=nomvoie,numero_num&full=on 45: {{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=1&folder=geocannes&service=GEOCANNES_RU&where=id_parc=%27{% if "adresse" in form_var_methode %}{{ form_var_parcelle_adresse }}{% elif "cart" in form_var_methode %}{{ form_var_parcelle_carte }}{% else %}{{ form_var_parcelle_manuelle }}{% endif %}%27 49: {% if form_var_num_voie %}{% load l10n %}{{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=numero_num%20=%20{{form_var_num_voie}}%20and%20adresse%20like%20%27%{{form_var_voie}}%%27&template=%7B%7Battributes.quartier%7D%7D&full=on{% else %}{% load l10n %}{{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=numero_num%20=%200%20and%20adresse%20like%20%27%{{form_var_voie}}%%27&template=%7B%7Battributes.quartier%7D%7D&full=on{% endif %} 50: {{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=numero_num%20=%200%20AND%20adresse%20like%20%27%{{form_var_recherche_adresse|default:"XYZXYZ"|upper}}%%27&template=%7B%7Battributes.nomvoie%7Csafe%7D%7D&orderByFields=nomvoie&full=on 51: {% if form_var_num_voie %}{% load l10n %}{{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=numero_num%20=%20{{form_var_num_voie}}%20and%20adresse%20like%20%27%{{form_var_voie}}%%27&template=%7B%7Battributes.secteur%7D%7D&full=on{% else %}{% load l10n %}{{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=numero_num%20=%200%20and%20adresse%20like%20%27%{{form_var_voie}}%%27&template=%7B%7Battributes.secteur%7D%7D&full=on{% endif %} 52: {{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=adresse%20like%20%27%{{form_var_voie}}%%27&template=%7B%7Battributes.numero_num%7D%7D&orderByFields=numero_num&full=on 53: {{ passerelle_url }}arcgis/geocannes/mapservice-query?layer=0&folder=geocannes&service=GEOCANNES_Adresse_reference&where=adresse%20like%20%27%{{form_var_recherche_adresse|default:"XYZXYZ"|upper}}%%27&template=%7B%7Battributes.adresse%7D%7D+—+%7B%7Battributes.quartier%7D%7D+—+%7B%7Battributes.codepost|default:""%7D%7D+%7B%7Battributes.sectpost|default:""%7D%7D&id_template=%7B%7Battributes.ident%7D%7D&orderByFields=nomvoie,numero_num&full=onSont utilisés, les champs :
- layer
- folder
- service
- where
- template
- id_template
- full
- f (json / geojson / ???)
On y ajouterait un nom, un slug et une description pour obtenir un endpoint.
Au niveau du champ where on accepterait une chaîne de formatage Python standard (syntaxe différent de #39612) avec obligation de nommer les arguments, ex.:
Where : [ adresse LIKE {adresse:s} AND population < {population:d} ]
L'idée étant de pouvoir déduire les arguments et types attendus pour le endpoint (ici un argument adresse de type chaîne et un argument population de type entier).
Ce serait appelable ainsi :
{{ passerelle_url }}/arcgis/geocannes/q/adresse-population/?adresse=AVENUE+D'ANNAM&population=10000
Fichiers
Demandes liées
Révisions associées
misc: allow hiding of endpoints (#27782)
For endpoints which are dynamic.
arcgis: add query system (#27782)
arcgis: hide district endpoint (#27782)
Historique
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Dupliqué par Support #39622: arcgis: pouvoir définir des requêtes ajouté
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Lié à Development #39612: arcgis: supporter des paramètres à la requête where ajouté
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Description mis à jour (diff)
- Assigné à
Benjamin Dauvergnesupprimé
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Fichier Firefox_Screenshot_2020-02-07T12-50-00.418Z.png Firefox_Screenshot_2020-02-07T12-50-00.418Z.png ajouté
- Fichier Firefox_Screenshot_2020-02-07T12-49-46.580Z.png Firefox_Screenshot_2020-02-07T12-49-46.580Z.png ajouté
Voilà où j'en suis, les requête sont intégrées aux autres endpoints et présentées de la même façon (il faudrait cacher le endpoint 'q' qui ne sert à rien tout seul mais on verra ça une autre fois).
Ça permet la requête suivante :
http://localhost:8000/arcgis/geocannes/q/adresse/?adresse=GAUl&orderByFields=nomvoie,numero_num
{
"data": [
{
"attributes": {
"nominus": "Avenue du Général De Gaulle",
"codinsee": "06029",
"ident": "VOIE_771_0",
"codepost": "06400",
"objectid": 727,
"sectpost": "Cannes",
"coordx": 1022883.61,
"numero_num": 0,
"adresse": "AVENUE DU GENERAL DE GAULLE",
"numero": "sans numero",
"quartier": "Croix-des-Gardes / Picaud",
"secteur": "Croix-des-Gardes",
"coordy": 6282326.48,
"typo": "Adresses sans numéro",
"idsect": "29",
"adresse_complete": null,
"idcanton": "7",
"canton": "CANNES-1",
"nomvoie": "AVENUE DU GENERAL DE GAULLE",
"idquart": "Q_6"
},
"id": "VOIE_771_0",
"text": "AVENUE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_0",
"codepost": "06400",
"objectid": 561,
"sectpost": "Cannes",
"coordx": 1024534.73,
"numero_num": 0,
"adresse": "PLACE DU GENERAL DE GAULLE",
"numero": "sans numero",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280792.44,
"typo": "Adresses sans numéro",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_0",
"text": "PLACE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_1",
"codepost": "06400",
"objectid": 13376,
"sectpost": "Cannes",
"coordx": 1024559.53,
"numero_num": 1,
"adresse": "1 PLACE DU GENERAL DE GAULLE",
"numero": "1",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280779.64,
"typo": "Numéros de voies",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_1",
"text": "1 PLACE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_2",
"codepost": "06400",
"objectid": 13390,
"sectpost": "Cannes",
"coordx": 1024554.32,
"numero_num": 2,
"adresse": "2 PLACE DU GENERAL DE GAULLE",
"numero": "2",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280807.99,
"typo": "Numéros de voies",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_2",
"text": "2 PLACE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_3",
"codepost": "06400",
"objectid": 13388,
"sectpost": "Cannes",
"coordx": 1024552.77,
"numero_num": 3,
"adresse": "3 PLACE DU GENERAL DE GAULLE",
"numero": "3",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280816.45,
"typo": "Numéros de voies",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_3",
"text": "3 PLACE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_4",
"codepost": "06400",
"objectid": 13391,
"sectpost": "Cannes",
"coordx": 1024545.66,
"numero_num": 4,
"adresse": "4 PLACE DU GENERAL DE GAULLE",
"numero": "4",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280816.14,
"typo": "Numéros de voies",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_4",
"text": "4 PLACE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_5",
"codepost": "06400",
"objectid": 13386,
"sectpost": "Cannes",
"coordx": 1024533.75,
"numero_num": 5,
"adresse": "5 PLACE DU GENERAL DE GAULLE",
"numero": "5",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280813.86,
"typo": "Numéros de voies",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_5",
"text": "5 PLACE DU GENERAL DE GAULLE - "
},
{
"attributes": {
"nominus": "Place du Général de Gaulle",
"codinsee": "06029",
"ident": "VOIE_302_6",
"codepost": "06400",
"objectid": 13389,
"sectpost": "Cannes",
"coordx": 1024524.13,
"numero_num": 6,
"adresse": "6 PLACE DU GENERAL DE GAULLE",
"numero": "6",
"quartier": "Centre-ville",
"secteur": "Félix Faure / Allées de la Liberté",
"coordy": 6280812.06,
"typo": "Numéros de voies",
"idsect": "40",
"adresse_complete": null,
"idcanton": "8",
"canton": "CANNES-2",
"nomvoie": "PLACE DU GENERAL DE GAULLE",
"idquart": "Q_1"
},
"id": "VOIE_302_6",
"text": "6 PLACE DU GENERAL DE GAULLE - "
}
],
"err": 0
}
Il me reste à vérifier l'import/export des requêtes pour que ce soit complet; je pourrai rajouter d'autres champs aux champs supportés (comme orderByFields).
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Nouveau à Solution proposée
Import/export implémenté.
Mis à jour par Frédéric Péters il y a environ 4 ans
Je préférerais que la présentation des requêtes suive ce qui existe aujourd'hui pour les requêtes du connecteur tableur.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
Frédéric Péters a écrit :
Je préférerais que la présentation des requêtes suive ce qui existe aujourd'hui pour les requêtes du connecteur tableur.
Je ne vois pas comment ce serait possible, on parle d'un moteur SQL ici, je ne peux pas récupérer les données (je ne sais même pas si c'est possible) et les filtrer coté passerelle et je ne vois pas comment convertir du python en SQL (et obliger les gens à construire du SQL avec des expressions python je ne vois pas non plus où ça nous amène, personne ne pensera à faire le .replace("'", "''")
nécessaire pour des chaînes).
Mais peut-être ne parles-tu que des projections (ici id_template et text_template) ? Dans ce cas oui pas de souci on peut faire cela.
Mis à jour par Frédéric Péters il y a environ 4 ans
Je parle de l'interface; j'ai survolé le patch je suis arrivé à .icon-edit:before { content: "\f044"; } et je me suis demandé pourquoi il y avait besoin de ça alors qu'on a déjà un système de requête côté tableur, dont l'interface existe sans cette icône. (ce qui permet alors de regarder les deux, voir que c'est une liste, dans sa propre section, avec des icônes supprimer, etc. tout ça vite rangé dans "présentation des requêtes").
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
Frédéric Péters a écrit :
Je parle de l'interface; j'ai survolé le patch je suis arrivé à .icon-edit:before { content: "\f044"; } et je me suis demandé pourquoi il y avait besoin de ça alors qu'on a déjà un système de requête côté tableur, dont l'interface existe sans cette icône. (ce qui permet alors de regarder les deux, voir que c'est une liste, dans sa propre section, avec des icônes supprimer, etc. tout ça vite rangé dans "présentation des requêtes").
Oui mais c'est moins bien, là on le descriptif des paramètres et la description de la requête. Je veux bien faire un truc moins bien mais pas pour juste économiser une ligne de CSS; mais je note que j'ai oublié le lien pour supprimer et la séparation dans une section à part ne me dérange pas non plus. Par contre revenir à une bête liste qui n'apporte aucune information je trouve que ça n'apporte rien (et on a rien pour mutualiser les templates à ce niveau de toute façon). Les deux informations les plus importantes sont : que fait cette requête et comment on l'appelle. S'il faut s'aligne à un moment, il me semble que ça doit être sur l'IHM la plus pratique pas sur l'existant.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution proposée à En cours
Mis à jour par Frédéric Péters il y a environ 4 ans
Du côté du connecteur tableur, les endpoints créés via les requêtes sont repris dans la section des endpoints, avec toutes les infos, c'est indépendant de la section où les requêtes sont éditées.
Mis à jour par Frédéric Péters il y a environ 4 ans
En fait je (re?)découvre que #39032 n'est pas encore là et du coup le connecteur CSV n'est pas aligné avec la présentation des endpoints. Donc pour décrire le souhait plutôt que faire référence à un truc qui n'existe pas :
Dans les endpoints, tous les endpoints, y compris ceux créés via une requête.
Puis une section requêtes, avec liste et boutons supprimer.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
Voilà j'ai mis la même interface que csvdatasource, j'ai aussi ajouté de quoi cacher le endpoint de base "q" qui ne sert à rien sans requête configurée (il faudrait faire de même sur csvdatasource), la ligne de CSS est virée ainsi que le support d'une edit_url
dans le template d'affiche d'une endpoint.
Branche à jour.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de En cours à Solution proposée
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
J'attendrai que #39032 passe pour rebaser.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Fichier 0002-misc-allow-hiding-of-endpoints-27782.patch 0002-misc-allow-hiding-of-endpoints-27782.patch ajouté
- Fichier 0001-templates-factorize-endpoint-template-27782.patch 0001-templates-factorize-endpoint-template-27782.patch ajouté
- Fichier 0003-arcgis-add-query-system-27782.patch 0003-arcgis-add-query-system-27782.patch ajouté
- le besoin de class="endpoints" sur le <ul> encapsulant les endpoints
- le retrait du <span> explicite contenant le verbe HTTP
Je remarque au passage que la description longue d'un endpoint est en gras, je ne sais pas si c'était voulu.
Mis à jour par Frédéric Péters il y a environ 4 ans
Je remarque au passage que la description longue d'un endpoint est en gras, je ne sais pas si c'était voulu.
Moi non plus, #39033.
Mis à jour par Thomas Noël il y a environ 4 ans
- id_template et text_template ne doivent pas être obligatoires (et les placer en bas, tiens, pour laisser ensemble en haut folder, service et layer, dans cet ordre)
- en plus de q et full, il faut pouvoir envoyer lat et lon
Aussi, faut mettre à jour ou refaire la migration. Un makemigrations m'a montré des modifs sur verbose_name, etc.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- migration mise à jour
- id_template et text_templte rendus optionnels
- folder,service,layer réordonnés (et migration encore refaite au passage)
- tous les paramètres de mapservice_query sont désormais recopiés s'ils n'ont pas été surchargé par la query
(branche à jour avec des commits temporaires pour voir les modifications)
Mis à jour par Thomas Noël il y a environ 4 ans
- Statut changé de Solution proposée à Solution validée
Tout chouette !
En loucedé tu ajouterais un petit commit avec un show:False sur le endpoint district ? (vieux truc mal foutu spécifique à Nancy, à chaque fois on me demande "c'est quoi ça ?").
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 945cffdbd0081db49959f12dc5a081fb28d08ff5 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Mar 13 17:05:13 2020 +0100 arcgis: hide district endpoint (#27782) commit b4d1050ef3247a231d7d62369225a96644a205f2 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Feb 7 08:37:16 2020 +0100 arcgis: add query system (#27782) commit 7999106ce5a9ca6b42ca7ba1d9e82b8ecd6031b9 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Tue Feb 11 15:29:16 2020 +0100 misc: allow hiding of endpoints (#27782) For endpoints which are dynamic. commit 0251636f5758a0a95bc8e563812295a5568084e5 Author: Benjamin Dauvergne <bdauvergne@entrouvert.com> Date: Fri Feb 7 12:30:42 2020 +0100 templates: factorize endpoint template (#27782)
Mis à jour par Frédéric Péters il y a environ 4 ans
- Statut changé de Résolu (à déployer) à Solution déployée
templates: factorize endpoint template (#27782)