diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2020-06-23 23:18:07 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2020-06-23 23:18:07 +0200 |
| commit | 3cf70771cb45cc16ec33ffe44e7a1a4799d8f395 (patch) | |
| tree | 55f0edb53141d5f043b486d722f507bfd94abdea /animism-align/cli/app/controllers/crud_controller.py | |
| parent | 014816dc724c1be60b7dd28d4e608c89b4ed451c (diff) | |
adding web app base
Diffstat (limited to 'animism-align/cli/app/controllers/crud_controller.py')
| -rw-r--r-- | animism-align/cli/app/controllers/crud_controller.py | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/animism-align/cli/app/controllers/crud_controller.py b/animism-align/cli/app/controllers/crud_controller.py new file mode 100644 index 0000000..595825d --- /dev/null +++ b/animism-align/cli/app/controllers/crud_controller.py @@ -0,0 +1,156 @@ +from flask import request, jsonify +from flask_classful import FlaskView, route +from werkzeug.datastructures import MultiDict + +from app.sql.common import db, Session +from app.server.helpers import parse_search_args, parse_sort_args + +class CrudView(FlaskView): + # to subclass CrudView, specify the model + form: + # model = Collection + # form = CollectionForm + index_all = True + excluded_methods = ['on_index', 'on_show', 'on_create', 'on_update', 'on_destroy'] + default_sort = "id" + default_order = "asc" + + # implement these methods: + def where(self, query, args): + return query + def on_index(self, session, data): + return data + def on_show(self, session, data): + return data + def on_create(self, session, form, item): + pass + def on_update(self, session, form, item): + pass + def on_destroy(self, session, item): + pass + + def index(self): + """ + List all {model}s + """ + session = Session() + if self.index_all: + items = session.query(self.model).all() + else: + offset, limit = parse_search_args(request.args) + sort, order, order_by, order_by_id = parse_sort_args(request.args, self.model, self.default_sort, self.default_order) + query = session.query(self.model) + query = self.where(query, request.args) + if order_by_id is not None: + query = query.order_by(order_by, order_by_id) + else: + query = query.order_by(order_by) + items = query.offset(offset).limit(limit).all() + + res = self.on_index(session, { + 'status': 'ok', + 'res': [ item.toJSON() for item in items ], + }) + session.close() + return jsonify(res) + + def get(self, id: int): + """ + Fetch a single {model}. + """ + session = Session() + item = session.query(self.model).get(id) + if not item: + session.close() + return jsonify({ + 'status': 'error', + 'error': 'item not found' + }) + result = self.on_show(session, { + 'status': 'ok', + 'res': item.toFullJSON() if hasattr(item, 'toFullJSON') else item.toJSON(), + }) + session.close() + return jsonify(result) + + def post(self): + """ + Create a new {model}. + + * JSON params: {jsonparams} + """ + session = Session() + raw_form = MultiDict(request.json) if request.json is not None else request.form + form = self.form(raw_form) + if form.validate(): + item = self.model() + form.populate_obj(item) + self.on_create(session, raw_form, item) + session.add(item) + session.commit() + res = { + 'status': 'ok', + 'res': item.toJSON(), + } + else: + res = { + 'error': 'error', + 'errors': form.errors, + } + session.close() + return jsonify(res) + + def put(self, id: int): + """ + Update a {model}. + + * JSON params: {jsonparams} + """ + session = Session() + item = session.query(self.model).get(id) + if item: + raw_form = MultiDict(request.json) if request.json is not None else request.form + form = self.form(raw_form, obj=item) + # print(item.toJSON()) + if form.validate(): + form.populate_obj(item) + self.on_update(session, raw_form, item) + session.add(item) + session.commit() + res = { + 'status': 'ok', + 'res': item.toJSON(), + } + else: + res = { + 'status': 'error', + 'error': form.errors, + } + else: + res = { + 'status': 'error', + 'error': 'not found', + } + session.close() + return jsonify(res) + + def delete(self, id: int): + """ + Delete a {model}. + """ + session = Session() + item = session.query(self.model).get(id) + if item: + self.on_destroy(session, item) + session.delete(item) + session.commit() + res = { + 'status': 'ok', + 'id': id, + } + else: + res = { + 'status': 'error', + 'error': 'not found', + } + session.close() + return jsonify(res) |
