We've decided to move OpenSpending away from MongoDB in 0.11 and to move back to a relational database backend, presumably supporting both SQLite and PostgreSQL.
The following feature requests and reasons are behind this decision:
| import os.path | |
| from pkg_resources import resource_listdir, resource_stream | |
| from pymongo import Connection, errors | |
| from pymongo.objectid import ObjectId, InvalidId | |
| from bson import DBRef | |
| connection = None | |
| db = None |
| import csv | |
| from StringIO import StringIO | |
| # National statistics for tax paid per household income decile, 2008/9. | |
| # Taken from Table 14 in http://www.statistics.gov.uk/CCI/article.asp?ID=2440 | |
| # Row 1 is average gross income per decile - including benefits, pensions etc | |
| # Row 2 is average direct taxation - income tax, employee NI and council tax | |
| # Row 3 is average total indirect taxation MINUS VAT, tobacco, alcohol, & car costs | |
| # Row 4 is average total VAT paid | |
| # Row 5 is average total tobacco tax paid |
| import csv | |
| from StringIO import StringIO | |
| # National statistics for tax paid per household income decile, 2008/9. | |
| # Taken from Table 14 in http://www.statistics.gov.uk/CCI/article.asp?ID=2440 | |
| # Row 1 is average gross income per decile - including benefits, pensions etc | |
| # Row 2 is average direct taxation - income tax, employee NI and council tax | |
| # Row 3 is average total indirect taxation MINUS VAT, tobacco, alcohol, & car costs | |
| # Row 4 is average total VAT paid | |
| # Row 5 is average total tobacco tax paid |
| { | |
| "dataset": { | |
| "model_rev": 1, | |
| "name": "bg-budget", | |
| "label": "Приходна част на бюджета за 2011 година", | |
| "description": "Визуализация на приходната част на Бюджета на Република България за 2011 година", | |
| "currency": "BGN" | |
| }, | |
| "mapping": { | |
| "from": { |
| /* Proposed OpenSpending data model, v2 */ | |
| /* Core issues we want to address: | |
| * | |
| * - Merge "entities" and "classifiers". | |
| * - Use better terminology. | |
| * - Decide whether to still have value dimensions. | |
| * - Handle time better (no "end_column") | |
| * | |
| * Secondary but long-term goals: |
| /* Proposed OpenSpending data model, v2 */ | |
| /* Core issues we want to address: | |
| * | |
| * - Merge "entities" and "classifiers". | |
| * - Use better terminology. | |
| * - Decide whether to still have value dimensions. | |
| * - Handle time better (no "end_column") | |
| * | |
| * Secondary but long-term goals: |
| class DateAttributeType(AttributeType): | |
| """ Date parsing. """ | |
| # TODO: simplify this, its hell! | |
| SUFFIX = ('in the format "yyyy-mm-dd", "yyyy-mm" or "yyyy", ' | |
| 'e.g. "2011-12-31".') | |
| def test(self, row, meta): | |
| value = unicode(self._column_or_default(row, meta)) | |
| end_value = row.get(meta.get('end_column')) | |
| for value, is_end in [(value, False), (end_value, True)]: |
| CREATE TABLE bund_bund ( | |
| id INTEGER NOT NULL, name TEXT, label TEXT, color TEXT, pdf_url TEXT, source_url TEXT, bund_kapitel TEXT, description TEXT, bund_titel TEXT, bund_titelgruppe TEXT, | |
| PRIMARY KEY (id) | |
| ); | |
| CREATE TABLE bund_entity ( | |
| id INTEGER NOT NULL, label TEXT, name TEXT, color TEXT, pdf_url TEXT, source_url TEXT, bund_ep TEXT, | |
| PRIMARY KEY (id) | |
| ); | |
| CREATE TABLE bund_entry ( | |
| id INTEGER NOT NULL, hauptgruppe_id INTEGER, kapitel_id INTEGER, from_id INTEGER, titel_id INTEGER, funktion_id INTEGER, gruppe_id INTEGER, flow TEXT, data_year TEXT, financial_type TEXT, to_id INTEGER, hauptfunktion_id INTEGER, titelgruppe_id INTEGER, time TEXT, remarks TEXT, flexible TEXT, oberfunktion_id INTEGER, obergruppe_id INTEGER, amount FLOAT, |
| from openspending.model import meta as db | |
| from openspending.model.attribute import Attribute | |
| from openspending.model.common import TableHandler | |
| class Dimension(object): | |
| """ A base class for dimensions. """ | |
| def __init__(self, dataset, name, data): | |
| self._data = data |