GeoReport CMS — A CMS-driven geospatial report generation platform powered by Wagtail/Django.
Project description
GeoReport
Hazard-agnostic geospatial report engine for early warning systems.
An installable Wagtail/Django package that generates CMS-driven geospatial analysis dashboards and bulletins. Configure once for any hazard — drought, flood, locust, food security, climate — no code changes needed.
Why GeoReport?
Early warning systems need reporting dashboards. Building one from scratch means months of work — models, views, charts, maps, PDF export, CMS admin. GeoReport gives you all of that as a pip install, fully configurable through the Wagtail admin.
One package, any hazard:
| Hazard | Phases | Maps | Metrics |
|---|---|---|---|
| Drought | Normal → Watch → Warning → Alert → Emergency | SPI, NDVI, Land Cover | Rainfall, Temperature, Soil Moisture, NDVI |
| Flood | Low → Moderate → High → Very High → Extreme | Flood extent, River levels | Precipitation, River discharge, Affected area |
| Locust | Calm → Outbreak → Upsurge → Plague | Breeding sites, Swarm tracks | Egg laying, Hopper bands, Swarm count |
| Food Security | IPC 1 → 2 → 3 → 4 → 5 | Food insecurity, Market prices | Population affected, GAM, SAM |
| Your hazard | Configure in CMS | Any WMS/XYZ/GeoJSON | Any indicator |
Features
- CMS-driven — all content managed through Wagtail admin, zero code changes
- 10 chart types — exposure analysis, time series, climate trends, vegetation indices
- Cartographic map figures — configurable legends, scale bars, north arrows, attribution
- 6 map layer types — WMS, XYZ, vector tiles, GeoJSON, COG, heatmap
- Native PDF export — jsPDF vector rendering, not screenshots
- PNG export — html2canvas at 3x resolution with watermarks
- Bulletin system — auth-gated advisory bulletins with expert commentary
- REST API — Django REST Framework endpoints for dashboard configuration
- No npm/node — pure server-rendered templates + vanilla JS via CDN
- Dockerized — PostGIS + Gunicorn, single
docker compose up
Install
pip install hazard-georeport
# or
uv add hazard-georeport
Add to your Django project:
# settings.py
INSTALLED_APPS = [
"georeport.dashboard",
"wagtail.contrib.settings",
"wagtail.snippets",
"wagtail",
"rest_framework",
"corsheaders",
# ... your other apps
]
# urls.py
from django.urls import path, include
urlpatterns = [
path("", include("georeport.urls")),
# ... wagtail, admin, etc.
]
Then migrate and seed:
python manage.py migrate
python manage.py seed_default_config
Quick Start (Demo Project)
git clone https://github.com/icpac-igad/Geo-Report.git
cd Geo-Report
uv sync
python sandbox/manage.py migrate --run-syncdb --settings=sandbox.settings.dev
python sandbox/manage.py seed_default_config --settings=sandbox.settings.dev
python sandbox/manage.py createsuperuser --settings=sandbox.settings.dev
python sandbox/manage.py runserver 0.0.0.0:8000 --settings=sandbox.settings.dev
Open http://localhost:8000 (dashboard) or http://localhost:8000/cms/ (admin).
Docker
cd sandbox
docker compose up --build
| Service | URL |
|---|---|
| Dashboard | http://localhost:9101 |
| Wagtail Admin | http://localhost:9101/cms/ |
CMS Configuration
Everything is configured through the Wagtail admin — no code changes needed.
Settings (Site-wide)
| Model | What It Configures |
|---|---|
| DashboardSettings | Title, organization, logo, primary color, copyright text |
| TimeConfiguration | Period cycles (dekadal, monthly, seasonal), available years, seasons |
Snippets (Collections)
| Model | What It Configures |
|---|---|
| HazardPhase | Severity levels — name, color, sort order (e.g., Watch → Alert → Emergency) |
| Region + admin levels | Geographic hierarchy — countries and admin boundaries |
| MetricConfig | Key indicator cards — title, unit, icon, value range |
| ChartConfig | Which charts to show — enable/disable, custom titles |
| MapSection | Map panels — layer type, data URL, legend entries, attribution |
| HydroBasin + levels | Hydrological basin hierarchy |
| Cluster | Country groupings for regional analysis |
| AreaType | Available spatial selection modes |
| FooterAction | Action buttons — export PDF, export PNG, share, view bulletin |
| ExtendedTag | Categorized tags for indicators |
| BulletinConfig | Bulletin content — expert comments, sections, outlook |
Map Layers
Each MapSection supports:
| Layer Type | Use Case |
|---|---|
| WMS | GeoServer/MapServer layers (SPI, NDVI, flood extent) |
| XYZ | Standard tile servers |
| Vector Tiles | MVT/PBF sources |
| GeoJSON | Feature data from APIs |
| COG | Cloud Optimized GeoTIFFs |
| Heatmap | Point density visualization |
Configure legend entries as JSON:
[
{"color": "#006400", "label": "Very High"},
{"color": "#FFD700", "label": "Moderate"},
{"color": "#8B0000", "label": "Very Low"}
]
Architecture
georeport/ # Installable package
├── dashboard/ # Django app (app_label="dashboard")
│ ├── models.py # 15 Wagtail CMS models
│ ├── views.py # Dashboard + bulletin views
│ ├── api.py # DRF REST API
│ ├── serializers.py # API serialization
│ ├── templates/ # Server-rendered HTML
│ ├── static/
│ │ ├── css/report.css # Single stylesheet, CSS custom properties
│ │ └── js/
│ │ ├── dashboard.js # Interactions, AOI drawing, PDF/PNG export
│ │ ├── charts.js # Chart.js factory (10 chart types)
│ │ └── maps.js # Map figure rendering + cartographic elements
│ └── management/commands/ # seed_default_config, load_gadm
└── urls.py # Package routes
Frontend Stack (CDN — no build step)
| Library | Version | Purpose |
|---|---|---|
| Chart.js | 4.4.7 | All charts |
| MapLibre GL JS | 4.7.1 | Map rendering |
| html2canvas | 1.4.1 | PNG export |
| jsPDF | 2.5.2 | PDF export |
Roadmap
- Installable package with Wagtail CMS
- Hazard-agnostic naming and configuration
- Cartographic map figures with legends
- Native PDF/PNG export
- Bulletin system
- REST API (Django REST Framework)
- Data Provider interface — connect live APIs (CHIRPS, MODIS, ERA5)
- Dynamic chart groups — DB-driven chart grouping
- Seed profiles —
drought.json,flood.json,minimal.json - PyPI release — versioned package on PyPI
- Tests & CI/CD — unit tests, GitHub Actions
- Documentation site — full docs with examples
Contributing
- Clone and run the demo project (see Quick Start)
- Explore the dashboard and CMS admin
- Open issues for bugs or ideas
- Submit pull requests against
main
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hazard_georeport-0.1.0.tar.gz.
File metadata
- Download URL: hazard_georeport-0.1.0.tar.gz
- Upload date:
- Size: 442.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d671eb681885bbada388e60472d242de67128a6e7bdef37b30223747959a188
|
|
| MD5 |
459a90eaaad6695955511fc5bf47aaba
|
|
| BLAKE2b-256 |
1201d9eec1c99802f5eca193ebca8ed2de93bab86dac6acdfffa8df1638810b5
|
Provenance
The following attestation bundles were made for hazard_georeport-0.1.0.tar.gz:
Publisher:
publish.yml on icpac-igad/georeport
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hazard_georeport-0.1.0.tar.gz -
Subject digest:
1d671eb681885bbada388e60472d242de67128a6e7bdef37b30223747959a188 - Sigstore transparency entry: 1192082527
- Sigstore integration time:
-
Permalink:
icpac-igad/georeport@0a2064c588d5fee175d8c2e2bf090477707f3248 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/icpac-igad
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a2064c588d5fee175d8c2e2bf090477707f3248 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hazard_georeport-0.1.0-py3-none-any.whl.
File metadata
- Download URL: hazard_georeport-0.1.0-py3-none-any.whl
- Upload date:
- Size: 457.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94cc919ee4772be0fe23d9f8ef14779eee7a5d67800bd72eb81a6f7a6660cfa2
|
|
| MD5 |
71392c9cecc085e798d4b1b077f88117
|
|
| BLAKE2b-256 |
8d7a73f30b610b0b97d1d9f2281dde2e36d2e55d2429a4fdc7e26d0eac2ba099
|
Provenance
The following attestation bundles were made for hazard_georeport-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on icpac-igad/georeport
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hazard_georeport-0.1.0-py3-none-any.whl -
Subject digest:
94cc919ee4772be0fe23d9f8ef14779eee7a5d67800bd72eb81a6f7a6660cfa2 - Sigstore transparency entry: 1192082529
- Sigstore integration time:
-
Permalink:
icpac-igad/georeport@0a2064c588d5fee175d8c2e2bf090477707f3248 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/icpac-igad
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0a2064c588d5fee175d8c2e2bf090477707f3248 -
Trigger Event:
push
-
Statement type: