GeotrekCE / Geotrek-admin

Paths management for National Parks and Tourism organizations
https://geotrek.fr
BSD 2-Clause "Simplified" License
133 stars 76 forks source link

Module outdoor #2406

Closed gutard closed 3 years ago

gutard commented 3 years ago

Notion de site mais sous l'étiquette "Outdoor".

Champs :

Fonctionnalités :

gutard commented 3 years ago

Suite au passage à Django 3.1 il faut remplacer django-rest-framework-swagger par drf_yasg cf. PR https://github.com/GeotrekCE/Geotrek-admin/pull/2420

gutard commented 3 years ago

Suite au passage à Django 3.1 il faut remplacer django-rest-framework-swagger par drf_yasg cf. PR #2420

C'est fait.

gutard commented 3 years ago

Il y a un os avec les interventions qui sont complètement intégrées au mécanisme de segmentation dynamique. A réfléchir un peu plus profondément avant de se lancer dans les grands changements.

camillemonchicourt commented 3 years ago

A réfléchir un peu plus profondément avant de se lancer dans les grands changements.

Oui en effet !

camillemonchicourt commented 3 years ago

OK j'ai déployé cette première version minimaliste du module Outdoor sur notre serveur de démo http://geotrekdemo.ecrins-parcnational.fr

En suivant la documentation (https://geotrek.readthedocs.io/en/master/advanced-configuration.html#outdoor), j'ai pu installer le module, mais j'ai eu un soucis pour charger les fixtures :

geotrek@geotrek-test:~$ sudo geotrek migrate;
Operations to perform:
  Apply all migrations: admin, auth, authent, cirkwi, common, contenttypes, core, diving, django_celery_results, easy_thumbnails, feedback, flatpages, infrastructure, land, maintenance, mapentity, outdoor, sessions, signage, tourism, trekking, zoning
Running migrations:
  Applying outdoor.0001_initial... OK
  Applying outdoor.0002_practice_sitepractice... OK
geotrek@geotrek-test:~$ sudo service geotrek restart
geotrek@geotrek-test:~$ sudo geotrek loaddata geotrek/outdoor/fixtures/basic.json
CommandError: No fixture named 'basic' found.

Du coup j'ai pu accéder au module et au formulaire d'ajout d'un site, mais la liste des pratiques est logiquement vide. Et donc quand je tente d'enregistrer un site sans pratique j'ai une Server Error (500). A contrôler donc si on n'a aucune pratique ou qu'on en selectionne aucune.

Quelques compléments :

gutard commented 3 years ago

Survol du module dans le menu = Afficher tooltip "Outdoor" plutôt que "Site"

Chaque icône du menu est liée à un modèle django et non à une app. Ça ne serait pas très logique de renommer la table Site en Outdoor. Est-ce que « Site Outdoor » pourrait convenir ?

Le formulaire devrait faire 100% de hauteur de page minimum, même si le formulaire est court

Ça n'a pas de rapport avec les devs sur l'outdoor. C'était présent sur tous les modules et c'est corrigé par la version 2.43.0.

camillemonchicourt commented 3 years ago

OK merci pour ce premier retour.

Hauteur de la carte = OK. 2.43.1 installée sur notre serveur de DEMO (http://geotrekdemo.ecrins-parcnational.fr), merci.

OK pour le nom du module, "Sites outdoor" est une bonne alternative, je vais confirmer avec les utilisateurs.

camillemonchicourt commented 3 years ago
gutard commented 3 years ago

Si pas de données, la liste charge sans fin quand on arrive dans le module

Je n'ai pas réussi à reproduire.

Bouton de localisation. Mettre point en premier avant ligne puis polygones (si possible)

C'est compliqué car il faudrait aller modifier la dépendance django-leaflet.

Buffer entre sites et avec les autres objets ou seulement intersection ? A préciser.

Intersection (pour l'instant).

camillemonchicourt commented 3 years ago

OK merci pour les précisions.

camillemonchicourt commented 3 years ago

Mis à jour en 2.44.0 sur le serveur de DEMO : http://geotrekdemo.ecrins-parcnational.fr/site/list/

Quand le site ne contient aucun site, j'ai toujours le spinner qui tourne sans fin quand on accède à la liste des sites :

image

La console renvoie une 500 sur la route des sites :

http://geotrekdemo.ecrins-parcnational.fr/api/site/sites.json?structure=&practice=&type=&orientation=&wind=&bbox=POLYGON((5.532989501953125+44.49944393446856%2C5.532989501953125+45.14524196975275%2C6.851348876953125+45.14524196975275%2C6.851348876953125+44.49944393446856%2C5.532989501953125+44.49944393446856)) [HTTP/1.1 500 Internal Server Error 318ms]

Dans les logs :

geotrek@geotrek-test:~$ sudo journalctl -eu geotrek-api
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     response = viewfunc(request, *args, **kw)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/utils/decorators.py", line 43, in _
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return bound_method(*args, **kwargs)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/views/decorators/http.py", line 99,
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     response = func(request, *args, **kwargs)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/mapentity/decorators.py", line 77, in deco
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return view_func(self, request, *args, **kwargs)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/mapentity/views/api.py", line 76, in dispa
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return super(BaseListView, self).dispatch(*args, **kwargs)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/views/generic/base.py", line 98, in
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return handler(request, *args, **kwargs)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/views/generic/list.py", line 157, i
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     context = self.get_context_data()
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/mapentity/views/api.py", line 71, in get_c
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     model=self.get_model())
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/mapentity/serializers/datatables.py", line
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     for obj in queryset:
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/query.py", line 287, in _
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     self._fetch_all()
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/query.py", line 1308, in 
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     self._result_cache = list(self._iterable_class(self))
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/query.py", line 53, in __
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 11
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     cursor.execute(sql, params)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 66, in 
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 75, in 
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return executor(sql, params, many, context)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in 
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return self.cursor.execute(sql, params)
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/utils.py", line 90, in __exit__
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     raise dj_exc_value.with_traceback(traceback) from exc_value
Dec 18 19:48:19 geotrek-test gunicorn[1565]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in 
Dec 18 19:48:19 geotrek-test gunicorn[1565]:     return self.cursor.execute(sql, params)
Dec 18 19:48:19 geotrek-test gunicorn[1565]: django.db.utils.InternalError: Relate Operation called with a LWGEOMCOLLECTION type.  This is uns
Dec 18 19:48:19 geotrek-test gunicorn[1565]: HINT:  Change argument 1: 'GEOMETRYCOLLECTION(LINESTRING(964505.864020034 6395904.9951783,964517.
camillemonchicourt commented 3 years ago

Complément : En fait j'avais bien 3 sites déjà dans la BDD créée avec la version précédente. Ils ne doivent pas arriver à se charger, à cause d'un site linéaire ?

J'arrive au formulaire de création d'un site, mais quand je tente d'enregistrer un site, j'ai une Erreur 500.

Dans les logs :

geotrek@geotrek-test:~$ sudo journalctl -eu geotrek-ui
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self.render(context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/mapentity/templatetags/mapentity_tags.py",
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     result += t.render(Context.flatten(context))
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/template/backends/django.py", line 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self.template.render(context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/template/base.py", line 170, in ren
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self._render(context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/template/base.py", line 162, in _re
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self.nodelist.render(context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/template/base.py", line 938, in ren
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     bit = node.render_annotated(context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/template/base.py", line 905, in ren
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self.render(context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/template/library.py", line 214, in 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     _dict = self.func(*resolved_args, **resolved_kwargs)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/mapentity/templatetags/mapentity_tags.py",
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     letters = alphabet_enumeration(len(items))
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/query.py", line 269, in _
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     self._fetch_all()
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/query.py", line 1308, in 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     self._result_cache = list(self._iterable_class(self))
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/query.py", line 53, in __
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 11
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     cursor.execute(sql, params)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 66, in 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 75, in 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return executor(sql, params, many, context)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self.cursor.execute(sql, params)
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/utils.py", line 90, in __exit__
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     raise dj_exc_value.with_traceback(traceback) from exc_value
Dec 18 20:03:47 geotrek-test gunicorn[1564]:   File "/opt/geotrek-admin/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in 
Dec 18 20:03:47 geotrek-test gunicorn[1564]:     return self.cursor.execute(sql, params)
Dec 18 20:03:47 geotrek-test gunicorn[1564]: django.db.utils.InternalError: Relate Operation called with a LWGEOMCOLLECTION type.  This is uns
Dec 18 20:03:47 geotrek-test gunicorn[1564]: HINT:  Change argument 2: 'GEOMETRYCOLLECTION(POINT(955989.999618165 6408066.92272217),POINT(9559
lines 964-1000/1000 (END)
gutard commented 3 years ago

OK merci. La trace est tronquée à droite donc il manque la moitié des infos. Peux-tu donner la trace complète ? Quelle est ta version de PostGIS (ou d'Ubuntu) ? Je soupçonne que ça soit ça qui fasse la différence. Les intersections géographiques ont l'air de marcher plus ou moins avec les geometrycollections selon les versions de PostGIS et le fait d'autoriser les geometrycollections est une nouveauté dans Geotrek.

PS : je pense qu'il est préférable de créer de nouvelles issues pour les bugs (et même pour des compléments de fonctionnalités) plutôt que de commenter une issue existante. D'autant plus si elle est déjà passée en Done. Sinon, je ne vais pas m'y retrouver. Si une issue rassemble des points différents on ne peut plus savoir où on en est précisément sur chacun des points. Toutes les issues restent ouvertes et on a l'impression que rien ne progresse et rien n'est réglé.

camillemonchicourt commented 3 years ago

Le module OUTDOOR a été mis en place de manière minimaliste dans la version 2.42.0, puis enrichi dans la version 2.44.0.

Il n'est volontairement pas installé par défaut, le temps qu'il soit plus complet et stabilisé. Mais il peut être activé explicitement pour ceux qui le souhaitent : https://geotrek.readthedocs.io/en/master/advanced-configuration.html#outdoor

je pense qu'il est préférable de créer de nouvelles issues pour les bugs (et même pour des compléments de fonctionnalités) plutôt que de commenter une issue existante

Oui en effet. Si il s'agit de commentaires sur les fonctionnalités directes du ticket, je les mettrai dans le même ticket, mais pour les éléments complémentaires, les détails, les bugs, OK, je vais privilégier des petits tickets dédiés.

Je ferme donc ce ticket initial général, et vais créer des tickets spécifiques aux sujets complémentaires.