Projet

Général

Profil

Bug #55892

geojson: les sources de donnée avec 'features': 'id' font planter l'affichage des listes en cartes.

Ajouté par Nicolas Roche il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Rejeté
Priorité:
Bas
Assigné à:
-
Version cible:
-
Début:
28 juillet 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

(Remonté par Brice, pas de ticket lié)

Exception:
  type = '<class 'KeyError'>', value = ''id''

Stack trace (most recent call first):
  File "/home/nroche/src/wcs/wcs/data_sources.py", line 684, in get_geojson_data
   682 
   683         for feature in data['features']:
>  684             feature['properties']['_id'] = feature['properties'][id_property]
   685             try:
   686                 feature['properties']['_text'] = Template(label_template_property).render(

  locals: 
     cache_duration = 0
     data = ... 'features': [ ...
     feature = {... 'id2': 'atol2'}, 'id': 'atol1', 'type': 'Feature'}
     force_url = None
     id_property = 'id'
     label_template_property = '{{ name }}'
     request = <wcs.compat.CompatHTTPRequest object at 0x7f6e92b28af0>
     self = <NamedDataSource 'merveilles du monde (geojson)' id:31>
     url = 'https://mensuel.framapad.org/p/boeruk6w19-9ots/export/txt'

  File "/home/nroche/src/wcs/wcs/api.py", line 1155, in _q_lookup
  1153             url = info['url']
  1154         get_response().set_content_type('application/json')
> 1155         return json.dumps(data_source.get_geojson_data(force_url=url))
  1156 
  1157 

  locals: 
     component = 'merveilles_du_monde_geojson'
     data_source = <NamedDataSource 'merveilles du monde (geojson)' id:31>
     self = <wcs.api.GeoJsonDirectory object at 0x7f6e9490da60>
     url = None

Historique

#1

Mis à jour par Nicolas Roche il y a plus de 2 ans

Je défnis une source de donnée geojson : Dans un formulaire
  • j'ajoute un champ liste qui utilise la source de donnée geojson.
  • je passe le mode d'affichage en Carte (données géographiques).

Je teste et je vois les items sur la carte, tout fonctionne bien.

Je modifie la configuration de la source de donnée, en retirant l'id (id2).
Sur la backoffice, la source de donnée fonctionne : je vois les items dans l'aperçu.
WCS utilise alors l'id inséré au niveau des features dans le geojson, comme le signale le commentaire.

# If a Feature has a commonly used identifier, that identifier
# SHOULD be included as a member of the Feature object with the
# name "id", and the value of this member is either a JSON string
# or number.
# -- https://tools.ietf.org/html/rfc7946#section-3.2

Je rafraîchis le formulaire et ça plante,
parce qu'à la restitution via api wcs ne va plus chercher l'id que dans properties .

Je n'ai pas pris le temps d'écrire de test, mais je peux si besoin.
Dans un premier temps voici juste un patch naïf qui permet de contourner le problème.

diff --git a/wcs/data_sources.py b/wcs/data_sources.py
index 8988e6d7..5ee4a607 100644
--- a/wcs/data_sources.py
+++ b/wcs/data_sources.py
@@ -683,3 +683,6 @@ class NamedDataSource(XmlStorableObject):
         for feature in data['features']:
-            feature['properties']['_id'] = feature['properties'][id_property]
+            if id_property == 'id' and 'id' in feature:
+                feature['properties']['_id'] = feature['id']
+            else:
+                feature['properties']['_id'] = feature['properties'][id_property]
             try:

#2

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

  • Statut changé de Nouveau à Rejeté

tl;dr, s'il y a quelque chose réécrire un ticket en tenant compte de #55722. Ne pas écrire de roman ne pas proposer de patch.

Formats disponibles : Atom PDF