# -*- coding: utf-8 -*- """ app.api.utils ~~~~~~~~~~~~~ This module implements useful functions for the API. :copyright: (c) 2017 European Spallation Source ERIC :license: BSD 2-Clause, see LICENSE for more details. """ import sqlalchemy as sa from flask import current_app, jsonify, request from ..extensions import db from .. import utils def commit(): try: db.session.commit() except (sa.exc.IntegrityError, sa.exc.DataError) as e: db.session.rollback() raise utils.CSEntryError(str(e), status_code=422) def get_generic_model(model, args, order_by=None): """Return data from model as json :param model: model class :param MultiDict args: args from the request :param order_by: column to order the result by :returns: data from model as json """ query = utils.get_query(model.query, request.args) if order_by is None: order_by = getattr(model, 'name') instances = query.order_by(order_by) data = [instance.to_dict() for instance in instances] return jsonify(data) def create_generic_model(model, mandatory_fields=('name',), **kwargs): data = request.get_json() if data is None: raise utils.CSEntryError('Body should be a JSON object') current_app.logger.debug(f'Received: {data}') data.update(kwargs) for mandatory_field in mandatory_fields: if mandatory_field not in data: raise utils.CSEntryError(f"Missing mandatory field '{mandatory_field}'", status_code=422) try: instance = model(**data) except TypeError as e: message = str(e).replace('__init__() got an ', '') raise utils.CSEntryError(message, status_code=422) except ValueError as e: raise utils.CSEntryError(str(e), status_code=422) db.session.add(instance) commit() return jsonify(instance.to_dict()), 201