Projet

Général

Profil

Development #56001

sectorisation sur les connecteurs "adresse" (base_adresse)

Ajouté par Thomas Noël il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
05 août 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Idée générale : créer un système capable de créer une sectorisation sur les adresses, et ainsi, sur une adresse donnée, savoir remonter le secteur concerné.


Fichiers

Révisions associées

Révision a0be6f07 (diff)
Ajouté par Thomas Noël il y a plus de 2 ans

add sector connector (#56001)

Révision 03f64ed6 (diff)
Ajouté par Thomas Noël il y a plus de 2 ans

add sectorization system (#56001)

Historique

#1

Mis à jour par Thomas Noël il y a plus de 2 ans

Voici un premier jet, qui propose une architecture.

passerelle.address offre un modèle de base "AddressResource" duquel doivent dériver les connecteurs capables d'utiliser la sectorisation. AddressResource est, dans ce patch, utilisé par BaseAdresse : la fin du patch permet de voir ce que ça propose... en gros, juste une méthode "self.sectorize" qui permet de trouver le secteur d'une adresse.

self.sectorize travaille sur une adresse au format Nominatim, disposant d'un "house_number" (classique) et d'un "street_id", que nous ajoutons. En fonction de ce numéro de rue et du numéro de maison, AddressResource cherche dans les sectorisations liées au connecteur (modèles Sectorization, Sector et SectorType de passerelle.address).

Ainsi, toute adresse retournée par le connecteur adresse contient un dictionnaire des secteurs liés à celle-ci :

     ...
     'address': { ... (données format nominatim) ... },
     'sectors': {
         'ecole': {
               'id': 'gs-zola',
               'text': 'Groupe Scolaire Zola'
         },
         'bureau-de-vote': {
               'id': 'gym-eluard',
               'text': 'Gymnase Eluard'
         }
     }
     ...

Voilà donc pour une première relecture, pour s'entendre sur les principes et l'archi, et ajuster toute la mécanique, avant d'aller plus loin.


Il faudra alors ajouter de l'UI. Pour l'instant on peut jouer via "/admin". L'UI définitive sera a priori «sur le côté», c'est-à-dire pas liée à un connecteur adresse en particulier. On aurait en page d'accueil de Passerelle un choix "Sectorisation d'adresses" qui amènera aux pages de gestion de l'affaire. L'idée sauvage derrière est que la configuration de la sectorisation pourrait profiter à d'autres connecteurs (on pense à des connecteurs avec des portails famille, des élections, des assemblées de quartier, etc)

Il faudra y permettre la création de type de secteur et l'import/export de fichier CSV de sectorisation. Exemple d'une ligne d'un fichier CSV de sectorisation "ecole" :

sector_id      sector_name           street_id   parity  min    max
gs-emile-zola  Groupe Scolaire Zola  75114_1912  P       0      999999
gs-emile-zola  Groupe Scolaire Zola  75114_1913  N       0      999999
gs-emile-zola  Groupe Scolaire Zola  75114_1914  N       1      34
gs-victor-hugo Ecole Victor Hugo     75114_1912  I       0      999999
gs-victor-hugo Ecole Victor Hugo     75114_1914  N       35     999999
...

Ce qui manque aussi c'est peut-être un lien entre les rues proposées par un connecteur adresse et la sectorisation. Principalement, pouvoir exporter la liste des rues en CSV avec des lignes de la id,nom. Ca serait un point de départ pour aider une ville à construire une sectorisation (et notamment pour éviter d'avoir à trouver les "street_id" du CSV). Mais on peut imaginer que cette liste exhaustive des rues n'existera pas toujours sur tous les connecteurs "adresse", et il y sûrement matière à mille discussions sur le sujet. Ici je me suis concentré sur la BAN qui est notre cible de départ.

#2

Mis à jour par Thomas Noël il y a plus de 2 ans

  • Statut changé de Solution proposée à En cours
#4

Mis à jour par Benjamin Dauvergne il y a plus de 2 ans

Pourquoi ne pas faire directement un connecteur sectorisation ? On en aurait un par sectorisation, je dis ça parce que si un jour on gagne du contrôle d'accès d'administration, chaque service pourra alors gérer sa sectorisation (ou alors ce sera administré via des formulaire et des web-service), dans tous les cas je vois bien le modèle SectorType devenir un connecteur sans endpoint dans un premier temps. Pour le lien avec BaseAdresse je ne me prononce pas, je ne connais pas de projet où on en ait plusieurs de déployées.

#5

Mis à jour par Thomas Noël il y a plus de 2 ans

Benjamin Dauvergne a écrit :

Pourquoi ne pas faire directement un connecteur sectorisation ? On en aurait un par sectorisation (...)

Idée bien notée, je réfléchi à ça... à première vue ça semble bien se tenir.

#6

Mis à jour par Thomas Noël il y a plus de 2 ans

Voici donc une nouvelle version, l'idée reste la même mais chaque type de secteur (par exemple "écoles", "bureaux de vote", ...) prend la forme d'une instance d'un nouveau connecteur "sector". Et c'est là qu'il faudra ajouter la mécanique d'import/export CSV (en phase 1, on verra dans les phases suivantes ce qu'on parviendra faire en UI).

Pour profiter de la sectorisation, ça change pas par rapport au patch précédent, un système d'adresse pourra dépendre de AddressResource (au lieu de BaseResource).

#7

Mis à jour par Thomas Noël il y a plus de 2 ans

  • Statut changé de Solution proposée à En cours

Ce n'est pas encore un patch "solution", mais il est proposé pour avis/relecture-quand-même-un-peu.

#8

Mis à jour par Thomas Noël il y a plus de 2 ans

Dans la branche, sur idée de Frédéric, une nouvelle où la parité n'est pas bidouillée avec N/I/P mais avec 0/1/2, sur base de constantes, c'est plus clair.

#9

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

une instance d'un nouveau connecteur "sector".

À ce sujet un point d'attention, pour l'import de site, ça va demander d'instancier les connecteurs dans le bon ordre, connecteurs "sector" avant les autres. (peut-être que ça peut être totalement ad hoc, pas besoin de lancer une réflexion générale sur l'interdépendance entre connecteurs).

#10

Mis à jour par Thomas Noël il y a plus de 2 ans

Voilà une nouvelle version mieux découpée en deux patches.

0001 : ajout d'un connecteur "sector" qui ressemble pas mal au connecteur CSV, mais construit une sectorisation à partir du fichier CSV. L'import est relativement tolérant sur l'ordre des colonnes, et sur le contenu de la colonne "parité" (on pourra étendre son intelligence quand on aura vu d'autres formats de CSV). Un endpoint "export" permet d'obtenir un CSV "normalisé", histoire de. Le endpoint "sectors" permet d'obtenir le secteur lié à une adresse (n° + rue) ou bien la liste des secteurs exhaustive (source de donnée).

0002 : fait le lien entre un système de base d'adresse et des sectorisations. Un système "AddressResource" générique donne les outils pour, et BaseAdresse l'utilise : chaque adresse renvoyée gagne des infos sur les secteurs auquel elle appartient.

Il manque 0003 qui serait la partie qui lie une liste de rue existante (genre base_addresse::StreetModel) avec une sectorisation (une instance de SectorResource). Ce 0003 permettra par exemple de vérifier qu'un SectorResource recouvre bien l'ensemble des rues, et saura exporter voire importer des CSV un peu plus intelligemment (avec le nom de la rue et pas juste son id, par exemple). Mais ce 0003 n'est pas nécessaire pour commencer à travailler alors je propose de valider déjà ce système de sectorisation, et de faire un autre ticket pour lier une liste de rue avec une sectorisation.

Frédéric Péters a écrit :

À ce sujet un point d'attention, pour l'import de site, ça va demander d'instancier les connecteurs dans le bon ordre, connecteurs "sector" avant les autres. (peut-être que ça peut être totalement ad hoc, pas besoin de lancer une réflexion générale sur l'interdépendance entre connecteurs).

Ah oui heu j'ai pas regardé ça du tout je ne m'en rappelle qu'à l'instant... :/v

#11

Mis à jour par Thomas Noël il y a plus de 2 ans

  • Statut changé de Solution proposée à En cours

Thomas Noël a écrit :

Frédéric Péters a écrit :

À ce sujet un point d'attention, pour l'import de site, ça va demander d'instancier les connecteurs dans le bon ordre, connecteurs "sector" avant les autres. (peut-être que ça peut être totalement ad hoc, pas besoin de lancer une réflexion générale sur l'interdépendance entre connecteurs).

En testant l'affaire, je me rends compte que de transformer BaseAdresse en sous-classe de AddressResource au lieu de BaseResource, les connecteurs BAN ne font plus partie de BaseResource.__subclasses__() et ne sont donc plus exportées !... Il me faut donc revoir l'export (pour qu'il soit bien complet) en plus de l'import (pour qu'il importe d'abord les secteurs).

#12

Mis à jour par Thomas Noël il y a plus de 2 ans

Voici une version de 0002 avec une bonne gestion de l'export/import d'une AddressRessource (à noter que ça vient après une première correction sur l'export #56491).

Sur la gestion des secteurs (0001) petit éclair de lucidité, en ajoutant un test de création via /manage je me suis rappelé que le "clean" ne peut pas faire le cache des données car l'instance n'existe pas forcément encore ; j'ai donc adopté la même technique que pour le connecteur CSV, rien de bien compliqué.

#13

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

+++ b/passerelle/apps/sector/admin.py

Vraiment je trouve bof de passer par l'admin (pour ajouter des secteurs si je comprends bien), je préféerais avoir directement une petite vue d'ajout de secteur, voire même juste un endpoint.

(mais oui si on veut passer ça là tout de suite ok, avec direct ticket pour virer ça).

+            if house_number is not None:
[...]
+            else:
+                query = query.filter(parity=PARITY_ALL, min_housenumber=0, max_housenumber=MAX_HOUSENUMBER)

quand il n'y a pas de numéro on ne peut pas juste tout prendre ? (la même requête existe dans 0002)

+    min_housenumber = models.PositiveIntegerField(default=0, verbose_name=_('Minimal house number'))
+    max_housenumber = models.PositiveIntegerField(
+        default=MAX_HOUSENUMBER, verbose_name=_('Maximal house number')
+    )

noter que ces bornes sont incluses ?

Filter by Sector Title ou Identifier

or.

+ # sectorization will also be delete (cascade)

deleted.

#14

Mis à jour par Thomas Noël il y a plus de 2 ans

Frédéric Péters a écrit :

Vraiment je trouve bof de passer par l'admin (pour ajouter des secteurs si je comprends bien), je préféerais avoir directement une petite vue d'ajout de secteur, voire même juste un endpoint.
(mais oui si on veut passer ça là tout de suite ok, avec direct ticket pour virer ça).

J'ai laissé le admin.py parce que je l'ai utilisé pour vérifier des trucs rapidement sans avoir à coder d'interface (et alourdir ce patch/ticket). La gestion des secteurs et de la sectorisation je ne l'imagine dans cette phase 1 que via le fichier CSV importé. Et donc, oui, en phase 2, je vais faire un ticket pour avoir une petite UI de gestion des secteurs et sectorisation dans le connecteur.

quand il n'y a pas de numéro on ne peut pas juste tout prendre ? (la même requête existe dans 0002)

La réponse ne peut contenir qu'au plus un secteur. Ici je décide que s'il n'y a pas de numéro de maison, alors on ne donne un secteur que si la rue est intégralement comprise dedans (ie tous ses numéros, pairs ou impairs et sans borne limite). Mais c'est vrai que ça peut boguer si le côté pair de la rue est dans une ville voisine... Considérons que c'est un cas limite sans intérêt ici. De toute façon, une requête sans numéro de maison sur une rue qui a des numéros, ça n'a pas de sens. (ça n'a de sens que pour des mini-rues sans numéro, qui seront à déclarer avec N,0,999999 dans la sectorisation).

Bref, je préfère laisser comme ça et voir à l'usage si j'ai raté quelque chose...

noter que ces bornes sont incluses ?

J'ai mis « Minimum house number (included) » et « Maximum house number (included) »

Filter by Sector Title ou Identifier
+ # sectorization will also be delete (cascade)

C'est corrigé, merci !

#15

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

  • Statut changé de Solution proposée à Solution validée

Go ainsi, sans annonce ça sera pour quand il y aura un petit peu d'UI de gestion.

#16

Mis à jour par Thomas Noël il y a plus de 2 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 03f64ed6ff87b3889c04f769d5aa10893f993e00
Author: Thomas NOËL <tnoel@entrouvert.com>
Date:   Sun Aug 15 22:28:58 2021 +0200

    add sectorization system (#56001)

commit a0be6f07f1477ee0d0e8d3337af11b2d7b30cfc3
Author: Thomas NOËL <tnoel@entrouvert.com>
Date:   Sun Aug 15 22:27:57 2021 +0200

    add sector connector (#56001)

#17

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

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF