Skip to content
Snippets Groups Projects
budget.py 1.49 KiB
import logging
from typing import Any

from flask import Blueprint, jsonify

from compendium_v2.db.presentation_models import BudgetEntry
from compendium_v2.routes import common


routes = Blueprint('budget', __name__)
logger = logging.getLogger(__name__)

BUDGET_RESPONSE_SCHEMA = {
    '$schema': 'http://json-schema.org/draft-07/schema#',

    'definitions': {
        'budget': {
            'type': 'object',
            'properties': {
                'nren': {'type': 'string'},
                'nren_country': {'type': 'string'},
                'budget': {'type': 'number'},
                'year': {'type': 'integer'},
            },
            'required': ['nren', 'nren_country', 'budget', 'year'],
            'additionalProperties': False
        }
    },

    'type': 'array',
    'items': {'$ref': '#/definitions/budget'}
}


@routes.route('/', methods=['GET'])
@common.require_accepts_json
def budget_view() -> Any:
    """
    handler for /api/budget/ requests

    response will be formatted as:

    .. asjson::
        compendium_v2.routes.budget.BUDGET_RESPONSE_SCHEMA

    :return:
    """

    def _extract_data(entry: BudgetEntry):
        return {
            'nren': entry.nren.name,
            'nren_country': entry.nren.country,
            'budget': float(entry.budget),
            'year': entry.year,
        }

    entries = sorted(
        [_extract_data(entry) for entry in common.get_data(BudgetEntry)],
        key=lambda d: (d['year'], d['nren'])
    )
    return jsonify(entries)