gn_module_export

gn_module_export

Module d'export de donnees naturalistes de GeoNature avec gestion fine des droits d'acces, avec 5 PR (3 mergees) et 6 commits en mai 2023. Les contributions portent sur la logique d'export backend, le controle d'acces, l'optimisation des requetes SQLAlchemy et les adaptations frontend.

🎯 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-gn-module-export : PR mergées : #137 a fusionné la vue Flask d'export avec une gestion cohérente des permissions et du token d'API ; #162 a filtré les utilisateurs applicatifs GeoNature côté administration et backend ; #164 a remonté le token jusqu'au frontend pour l'affichage et l'usage dans la liste des exports.

💻 Développement

  • #projet-gn-module-export : #137 a fusionné la gestion des rôles autorisés directement dans la vue Flask-Admin des exports, en ajoutant allowed_roles au formulaire d'administration ; #162 a restreint cette sélection aux utilisateurs et groupes réellement rattachés à l'application GeoNature. Source: PR #162.

    def filter_user_app_and_role():
        user_and_gp_from_gn_app = (
            User.query.outerjoin(CorRole, User.id_role == CorRole.id_role_utilisateur)
            .outerjoin(
                UserApplicationRight,
                or_(
                    UserApplicationRight.id_role == CorRole.id_role_groupe,
                    UserApplicationRight.id_role == User.id_role,
                ),
            )
            .join(
                Application,
                Application.id_application == UserApplicationRight.id_application,
            )
            .filter(Application.code_application == "GN")
        )
    
        return user_and_gp_from_gn_app.order_by(
            User.groupe.desc(), User.nom_role
        ).filter((User.groupe == True) | (User.identifiant.isnot(None)))
    
    • #projet-gn-module-export : #164 a branché l'interface Angular pour récupérer les exports, conserver uniquement le premier token autorisé par export et piloter son affichage / sa copie côté composant. Source: PR #164.

      this._exportService
        .getExports()
        .pipe(
          map((exports: Export[]) => {
            exports.forEach((element) => {
              element.cor_roles_exports.splice(1);
            });
            return exports;
          })
        )
        .subscribe((exports: Export[]) => {
          exports.forEach((element) => {
            element.cor_roles_exports.length > 0
              ? this.objectToken.push({ token: element.cor_roles_exports[0].token, display: false })
              : this.objectToken.push({ token: null, display: false });
          });
          this.exports = exports;
        });
      

📈 Résultats

  • Nb PR: 3
  • Nb commits: 6
  • Nb issues: 2
  • Période: 10 mai 2023 au 16 mai 2023
🌐 Voir le projet

Technologies utilisées

Frontend
Angular
Backend
Flask
Python
Bases de donnees (SGBD & SQL)
PostgreSQL
Design Patterns & Architecture
SQLAlchemy