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_rolesau 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