Skip to content
Simple project database to collect and publish data in IATI format
Python HTML JavaScript CSS
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.


Type Name Latest commit message Commit time
Failed to load latest commit information.

MAEDI Projects Database

Simple project database to collect information about projects funded by French Embassies and publish it in IATI format (both v1.03 and v2.01).

License: AGPL v3.0

Copyright (c) 2016 Mark Brough, Ministère des Affaires étrangères et du Développement international

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <>.




Landing page shows list of projects that have been added so far. Most users can see only their own projects; administrators can see all projects.

Activity editor

Activity editor

Simple form to edit basic activity data. Data is automatically saved as you move through the form.

Simple geocoder

Simple geocoder

The geocoder retrieves locations automatically from and providers a list of locations that can be selected by clicking on them on the left hand side. They appear as markers on the map and are instantly saved to the database.

Financial data

Financial data

New financial data (commiments and disbursements) can easily be added. The data is saved as you move through the form.


  1. Internationalisation has been added using Flask-Babel - you can specify the country in and then add new translations as outlined in Flask-Babel's documentation. Translation strings are stored in maediprojects/translations
  2. Editing projects is fast and fields are saved as the user moves through the form to avoid loss of data. Fields are constrained as much as possible to ensure the correct format of data - for example, bootstraper-datetimepicker is used to constrain dates and provide a nice UI.
  3. Locations are retrieved from upon request, to populate a simple geocoder. The user can click on regions (ADM1) or choose to see locations within a particular region (ADM2).
  4. Financial data can either be provided as a single total amount (as it is currently stored in the original source spreadsheets) or as individual financial transactions (as IATI encourages). If individual financial transactions are specified then these will be published in the IATI data; otherwise the total figures will be.
  5. The data is generated in IATI v1.03 and v2.01 formats, with activities grouped by country. In time / if needed, this could potentially be cached, but it is fast at the moment.
  6. Fields unlikely to change are filled out by default and hidden, with the option of showing them. Each user has a default country, which means the user doesn't have to specify this each time.


The current software has a few limitations which could be improved upon:

  • it does not generate organisation files at all. You can use something like for this
  • it does not generate results data for activities. Sage2IATI has some relevant code for this, but the user interface could be simplified and it was not currently necessary for this project database.
  • project documents cannot be attached to activities.

Deployment and getting up and running

  1. Clone the repository:
git clone
  1. Set up a virtualenv:

    virtualenv ./pyenv
  2. Activate the virtualenv:

    source ./pyenv/bin/activate
  3. Install the requirements:

    pip install -r requirements.txt
  4. Copy and edit the

  5. Run the server:

    python runserver
  6. Setup:

  7. You can log in using the admin username and password defined in your

  8. Before using the geocoding feature, you need to import locations from Geonames. When logged in as an administrator, you can click on the username in the top right, then "Manage codelists" / "Gérer les listes de codes". Click on the "Locations" / "Localisations" tab, then choose a country to import.

You can’t perform that action at this time.