GeoNature (core)
Core application of the GeoNature production biodiversity suite, to which 39 PRs (23 merged) and 178 commits were contributed between 2023 and 2026. Work covers import routes, taxonomy features, pagination/filtering, SQL migrations, tests, and Angular frontend improvements.
π― Context and goals
- Evolve production-grade naturalist applications across critical flows: import, synthesis, monitoring, taxonomy, and user management.
- Stabilize backend/frontend interfaces through stronger API contracts, filtering/pagination, dynamic forms, and more consistent error handling.
- Reduce manual business-side corrections by improving data model consistency, admin feedback, and UI flows.
π§© Design
- #project-geonature: Merged PRs: #3583 added UUID support to the acquisition framework through backend routes, config schema, and form components; #3343 added a confirmation modal for import edition and adjusted import V3 workflows and tests; #3303 extended monitoring media / marking events with models, routes, migrations, and tests; #3277 introduced a context parameter in import field mapping and propagated it from the frontend to backend upload handling with tests; #3212 fixed required radio button validation in dynamic forms; #3196 preserved drawn geometry during Leaflet edition; #3169 added route-driven navigation to observation detail tabs; #3154 exposed latest discussions on the home page through a backend route, configuration, and Angular component; #3048 added fixture and frontend test coverage for the import list; #2935 fixed statistical labels in the PDF report; #2920 added backend tests for line-number error cases; #2911 removed
taxa_countin favor of computed import report statistics; #2910 added import-data actions directly inside modules; #2899 grouped report fields by entity; #2883 prepared multi-destination import lists; #2875 generalized imports to all destinations; #2779 wiredDRAWSTOPto keep geometry state consistent; #2768 introduced an auto-validation function with migration, task, and config schema; #2701 added a source-module filter to synthesis queries and forms; #2692 made GeoNature compatible with the monitoring module through models, routes, and migrations; #2658 fixed last-geometry-point rendering in OCCTAX; #2637 addedgroup3_inpnto the synthesis export view with migration and tests; #2321 fixed date comparison in the OCCTAX form. Open PRs: #3952 aligns URL prefix handling across config samples and install scripts; #3941 decouples installation into$HOMEand introducesnvmon shared systems; #3663 adds anadditional_datasynthesis filter for monitoring on both backend and Angular form side; #3478 fixes the numeric widget so letters are rejected and validation messages stay consistent; #3432 makes the datalist component explicitly clearable.
π» Development
#project-geonature: #3277 added incremental import updates through a
fieldmappingpayload sent in the form, making it possible to update an existing import without re-uploading the file every time; #2768, #2701, #2692, and #2637 extended validation, synthesis filters, monitoring compatibility, and export views. 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")- #project-geonature: #3154 added an Angular component to fetch, sort, and paginate the latest discussions; #3169, #3212, #3196, #3478, and #3432 complement this frontend scope around modal routing, form validation, Leaflet geometry handling, and reusable input components. 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; }
- #project-geonature: #3154 added an Angular component to fetch, sort, and paginate the latest discussions; #3169, #3212, #3196, #3478, and #3432 complement this frontend scope around modal routing, form validation, Leaflet geometry handling, and reusable input components. Source: PR #3154.
ποΈ Infrastructure and deployment
- #project-geonature: #3941 and #3952 focus on install scripts,
nvm, install paths, and URL prefix alignment.
π Results
- PR count: 28
- Commit count: 178
- Issue count: 26
- Period: February 3, 2023 to February 20, 2026
Tech Stack
Backend
Alembic
Flask
Python
Frontend
Angular
DevOps
Docker
GitHub Actions
Bases de donnees (SGBD & SQL)
PostGIS
PostgreSQL
Qualite / Tests
Pytest
Design Patterns & Architecture
SQLAlchemy