diff --git a/compendium_v2/db/model.py b/compendium_v2/db/model.py index 5c14487bb21992a136ab8fb804d46e6533af9440..1cc54238c5c108206fbf4edbca2f30f9eef85131 100644 --- a/compendium_v2/db/model.py +++ b/compendium_v2/db/model.py @@ -21,7 +21,7 @@ def _enum_names(enum_class): class BudgetEntry(base_schema): __tablename__ = 'budgets' - id = sa.Column(sa.Integer, autoincrement=True) + id = sa.Column(sa.Sequence('budgetentry_seq_id_seq'), nullable=False) nren = sa.Column(sa.String(128), primary_key=True) budget = sa.Column(sa.String(128), nullable=True) - year = sa.Column(sa.String(128), primary_key=True) + year = sa.Column(sa.Integer, primary_key=True) diff --git a/compendium_v2/migrations/versions/366dfd333305_initial_db_setup.py b/compendium_v2/migrations/versions/366dfd333305_initial_db_setup.py deleted file mode 100644 index 30661f6333594e7aa63fe138e0c348a451be5e6b..0000000000000000000000000000000000000000 --- a/compendium_v2/migrations/versions/366dfd333305_initial_db_setup.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Initial DB setup - -Revision ID: 366dfd333305 -Revises: -Create Date: 2023-02-07 11:37:56.576183 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '366dfd333305' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade(): - op.create_table('budgets', - sa.Column('id', sa.Integer(), autoincrement=True, nullable=True), - sa.Column('nren', sa.String(length=128), nullable=False), - sa.Column('budget', sa.String(length=128), nullable=True), - sa.Column('year', sa.String(length=128), nullable=False), - sa.PrimaryKeyConstraint('nren', 'year') - ) - - -def downgrade(): - op.drop_table('budgets') diff --git a/compendium_v2/migrations/versions/cbcd21fcc151_initial_db.py b/compendium_v2/migrations/versions/cbcd21fcc151_initial_db.py new file mode 100644 index 0000000000000000000000000000000000000000..8ff0e48cc2f8f5c0de79a22e16aea14d46b71369 --- /dev/null +++ b/compendium_v2/migrations/versions/cbcd21fcc151_initial_db.py @@ -0,0 +1,36 @@ +"""Initial DB + +Revision ID: cbcd21fcc151 +Revises: +Create Date: 2023-02-07 15:56:22.086064 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'cbcd21fcc151' +down_revision = None +branch_labels = None +depends_on = None + +budget_id_seq = sa.Sequence('budgetentry_seq_id_seq') # represents the sequence + + + +def upgrade(): + op.execute(sa.schema.CreateSequence(budget_id_seq)) # create the sequence + op.create_table('budgets', + sa.Column('id', sa.Integer, budget_id_seq, nullable=False, server_default=budget_id_seq.next_value()), + sa.Column('nren', sa.String(length=128), nullable=False), + sa.Column('budget', sa.String(length=128), nullable=True), + sa.Column('year', sa.Integer, nullable=False), + sa.PrimaryKeyConstraint('nren', 'year') + ) + + +def downgrade(): + op.execute( + sa.schema.DropSequence(sa.Sequence('budgetentry_seq_id_seq'))) + op.drop_table('budgets') diff --git a/compendium_v2/routes/budget.py b/compendium_v2/routes/budget.py index b55dd181c9a17645bf10aa0ad7bfb234dc1b6c78..7c5090ade591a0eb77736d5226bac9b8208d94bb 100644 --- a/compendium_v2/routes/budget.py +++ b/compendium_v2/routes/budget.py @@ -1,9 +1,11 @@ import logging +from collections import defaultdict from typing import Any from flask import Blueprint, jsonify, current_app from compendium_v2 import db, survey_db +from compendium_v2.db import model from compendium_v2.survey_db import model as survey_model from compendium_v2.routes import common @@ -19,7 +21,6 @@ def before_request(): survey_db.init_db_model(dsn_survey) - logger = logging.getLogger(__name__) col_pal = ['#fd7f6f', '#7eb0d5', '#b2e061', @@ -61,24 +62,44 @@ def budget_view() -> Any: :return: """ - try: - with survey_db.session_scope() as session: - data = session.query(survey_model.Nrens).join(survey_model.Budgets, - survey_model.Budgets.country_code == survey_model.Nrens.country_code) - for nren in data: - print(nren) - except Exception as e: - print(e) - - - # def _extract_data(entry: model.BudgetEntry): - # return { - # 'id': entry.id, - # 'NREN': entry.NREN, - # 'BUDGET': entry.BUDGET, - # 'BUDGET_YEAR': entry.BUDGET_YEAR, - # } - - # entries = [_extract_data(entry) for entry in data] - # - # return jsonify(entries) + + + + with survey_db.session_scope() as survey_session, \ + db.session_scope() as session: + + _entries = session.query(model.BudgetEntry) + + inserted = defaultdict(dict) + + + for entry in _entries: + inserted[entry.nren][entry.year] = entry.budget + + data = survey_session.query(survey_model.Nrens) + for nren in data: + for budget in nren.budgets: + abbrev = nren.abbreviation + year = budget.year + + if inserted.get(abbrev, {}).get(year): + continue + else: + inserted[abbrev][year] = True + entry = model.BudgetEntry( + nren=abbrev, budget=budget.budget, year=year) + session.add(entry) + + def _extract_data(entry: model.BudgetEntry): + return { + 'id': entry.id, + 'NREN': entry.nren, + 'BUDGET': entry.budget, + 'BUDGET_YEAR': entry.year, + } + + with db.session_scope() as session: + entries = sorted([_extract_data(entry) + for entry in session.query(model.BudgetEntry)], key=lambda d: (d['BUDGET_YEAR'], d['NREN'])) + + return jsonify(entries) diff --git a/compendium_v2/survey_db/model.py b/compendium_v2/survey_db/model.py index 50605eb17439f62bd05bef88124d25751b524266..ef05e057c0c3f60480fe92bf3832d87bc69ced70 100644 --- a/compendium_v2/survey_db/model.py +++ b/compendium_v2/survey_db/model.py @@ -1,7 +1,6 @@ import enum import logging import sqlalchemy as sa -from sqlalchemy.orm import sessionmaker from typing import Any @@ -23,11 +22,9 @@ class Budgets(base_schema): id = sa.Column(sa.Integer, primary_key=True) budget = sa.Column(sa.String) year = sa.Column(sa.Integer) - country_code = sa.Column(sa.String) - # nren = relationship( - # 'Nrens', foreign_keys=[country_code], - # primaryjoin='Nrens.country_code == Budgets.country_code', - # back_populates='budgets') + country_code = sa.Column('country_code', sa.String, + sa.ForeignKey('nrens.country_code')) + nren = relationship('Nrens', back_populates='budgets') class Nrens(base_schema): @@ -35,9 +32,7 @@ class Nrens(base_schema): id = sa.Column(sa.Integer, primary_key=True) abbreviation = sa.Column(sa.String) country_code = sa.Column(sa.String) - # budgets = relationship( - # 'Budgets', foreign_keys=[country_code], - # primaryjoin='Nrens.country_code == Budgets.country_code') + budgets = relationship('Budgets', back_populates='nren') # class BudgetEntry(base_schema):