GeoNature (core)

GeoNature (core)

Application centrale de la suite GeoNature pour la gestion de donnees naturalistes en production, sur laquelle 39 PR (23 mergees) et 178 commits ont ete contribues entre 2023 et 2026. Les contributions couvrent les routes d'import, la taxonomie, la pagination/filtrage, les migrations SQL, les tests et le frontend Angular.

🎯 Contexte et objectifs

  • Faire évoluer des applications naturalistes en production sur des flux critiques: import, synthèse, monitoring, taxonomie et gestion des utilisateurs.
  • Stabiliser les interfaces backend/frontend via des contrats API plus robustes, du filtrage/pagination, des formulaires dynamiques et une gestion d'erreurs homogène.
  • Réduire les corrections manuelles côté métier en améliorant la cohérence des modèles de données, les retours d'administration et les parcours UI.

🧩 Conception

  • #projet-geonature : PR mergées : #3583 a ajouté un identifiant UUID dans le framework d'acquisition via backend, schéma de configuration et composants de formulaire ; #3343 a ajouté une modal de confirmation sur l'édition d'import et ajusté les workflows et tests de l'import V3 ; #3303 a étendu les événements et données de médias / marquages du monitoring avec modèles, routes, migrations et tests ; #3277 a introduit un paramètre de contexte dans le field mapping d'import, propagé du frontend vers l'upload backend avec tests associés ; #3212 a corrigé la validation des radio boutons requis dans les formulaires dynamiques ; #3196 a préservé la géométrie dessinée lors de l'édition Leaflet ; #3169 a ajouté un routage dédié vers les onglets du détail d'observation ; #3154 a exposé les dernières discussions sur la page d'accueil avec route backend, configuration et composant Angular ; #3048 a ajouté fixture et test frontend pour la liste d'import ; #2935 a corrigé les libellés statistiques du rapport PDF ; #2920 a ajouté des tests backend sur les erreurs de numéro de ligne ; #2911 a supprimé taxa_count au profit de statistiques calculées dans le rapport d'import ; #2910 a ajouté l'action d'import de données directement dans les modules ; #2899 a regroupé les champs du rapport par entité ; #2883 a préparé les listes d'import multi-destinations ; #2875 a généralisé l'import vers toutes les destinations ; #2779 a branché DRAWSTOP pour fiabiliser la conservation de géométrie ; #2768 a introduit une fonction d'auto-validation avec migration, tâche et schéma de configuration ; #2701 a ajouté un filtre par module source dans la synthèse côté requête et formulaire ; #2692 a rendu GeoNature compatible avec le module monitoring via modèles, routes et migrations ; #2658 a corrigé l'affichage du dernier point de géométrie dans OCCTAX ; #2637 a ajouté group3_inpn dans la vue d'export synthèse avec migration et tests ; #2321 a corrigé la comparaison de dates dans le formulaire OCCTAX. PR ouvertes : #3952 aligne le préfixe d'URL entre exemples de configuration et scripts d'installation ; #3941 découple l'installation dans $HOME et introduit nvm sur systèmes mutualisés ; #3663 ajoute un filtre additional_data de synthèse pour le monitoring côté backend et formulaire Angular ; #3478 corrige le widget numérique pour rejeter les lettres et homogénéiser les messages de validation ; #3432 rend le composant datalist explicitement réinitialisable.

💻 Développement

  • #projet-geonature : #3277 a ajouté la mise à jour incrémentale d'un import via un fieldmapping envoyé dans le formulaire, avec possibilité de modifier un import existant sans renvoyer systématiquement le fichier ; #2768, #2701, #2692 et #2637 ont étendu respectivement la validation automatique, les filtres synthèse, la compatibilité monitoring et la vue d'export. Source: PR #3277.

    input_file = request.files.get("file", None)
    input_fieldmapping_preset = request.form.get("fieldmapping", None)
    
    # file must be set only when new import. otherwise, it's optional. it can also be a request to update the fieldmapping preset
    if imprt is None and input_file is None:
        raise BadRequest("File parameter is missig")
    
    if imprt is None:
        imprt = TImports(destination=destination)
        author = g.current_user
        imprt.authors.append(author)
        db.session.add(imprt)
    
    if input_fieldmapping_preset:
        fieldmapping_preset = json.loads(input_fieldmapping_preset)
        if imprt.fieldmapping is None:
            imprt.fieldmapping = {}
        imprt.fieldmapping.update(fieldmapping_preset)
    
    if input_file:
        size = get_file_size(input_file)
        max_file_size = current_app.config["IMPORT"]["MAX_FILE_SIZE"] * 1024 * 1024
        if size > max_file_size:
            raise BadRequest(description=f"File too big ({size} > {max_file_size}).")
        if size == 0:
            raise BadRequest(description="Impossible to upload empty files")
    
    • #projet-geonature : #3154 a ajouté un composant Angular pour récupérer, trier et paginer les dernières discussions ; #3169, #3212, #3196, #3478 et #3432 complètent ce volet sur le routage modal, la validation de formulaires, la géométrie Leaflet et les composants de saisie. Source: PR #3154.

      getDiscussions() {
        const params = this.buildQueryParams();
        this.syntheseApi
          .getReports(params.toString())
          .pipe(takeUntil(this.destroy$))
          .subscribe((response) => {
            this.setDiscussions(response);
          });
      }
      
      buildQueryParams(): URLSearchParams {
        const params = new URLSearchParams();
        params.set('type', 'discussion');
        params.set('sort', this.sort);
        params.set('orderby', this.orderby);
        params.set('page', this.currentPage.toString());
        params.set('per_page', this.perPage.toString());
        params.set('my_reports', this.myReportsOnly.toString());
        return params;
      }
      

🏗️ Infrastructure et déploiement

  • #projet-geonature : #3941 et #3952 portent sur les scripts d'installation, nvm, les chemins d'installation et l'alignement des préfixes d'URL.

📈 Résultats

  • Nb PR: 28
  • Nb commits: 178
  • Nb issues: 26
  • Période: 3 février 2023 au 20 février 2026
🌐 Voir le projet

Technologies utilisées

Backend
Alembic
Flask
Python
Frontend
Angular
DevOps
Docker
GitHub Actions
Bases de donnees (SGBD & SQL)
PostGIS
PostgreSQL
Qualite / Tests
Pytest
Design Patterns & Architecture
SQLAlchemy