View raw

1 # -*- mode: python; -*- 2 3 import inspect 4 from flask import Blueprint, request, render_template, redirect, flash, jsonify 5 from flask_login import login_required, current_user 6 7 from .. import db 8 from .. import models 9 # from . import forms 10 11 from wtforms import SelectField 12 13 14 common = Blueprint("common", __name__) 15 16 17 @common.route("/modules/<module>/add/<table>", methods=["GET", "POST"]) 18 @login_required 19 def add_item(module, table): 20 """Add new item to table accessible via module.""" 21 # print("db table keys are", db.metadata.tables.keys()) 22 if table not in db.metadata.tables.keys(): 23 return render_template("errors/item-not-found.html", table=table) 24 form = getattr(forms, f"Add{table}")() 25 if form.validate_on_submit(): 26 model = getattr(models, table) 27 table_fields = inspect.signature(model).parameters 28 form_values = {key: request.form.get(key) for key in table_fields} 29 print(f"Ready to insert in {table} from {module} {form_values}") 30 record = model(**form_values) 31 db.session.add(record) 32 db.session.commit() 33 item_pk = model.query.order_by(model.primary_key.desc()).first().primary_key 34 flash(f"Successfully added item #{item_pk} to {table} table.", "info") 35 return redirect(f"/modules/{module}") 36 return render_template("modules/add-item.html", table=table, form=form) 37 38 39 @common.route("/modules/<module>/edit/<table>/<int:pk>", methods=["GET", "POST"]) 40 @login_required 41 def edit_item(module, table, pk): 42 """Edit existing item in table accessible via module.""" 43 if table not in db.metadata.tables.keys(): 44 return render_template("errors/item-not-found.html", table=table) 45 model = getattr(models, table) 46 item = model.query.filter_by(primary_key=pk).first() 47 # Instantiate form with selected item's field values. 48 form = getattr(forms, f"Add{table}")(**item.__dict__) 49 if form.validate_on_submit(): 50 table_fields = inspect.signature(model).parameters 51 form_values = {key: request.form.get(key) for key in table_fields} 52 print(f"Ready to update {form_values}") 53 model.query.filter_by(primary_key=pk).update(form_values) 54 db.session.commit() 55 flash(f"Successfully edited item #{pk} in {table} table.", "info") 56 return redirect(f"/modules/{module}") 57 return render_template("modules/edit-item.html", table=table, pk=pk, form=form) 58 59 60 @common.route("/modules/<module>/delete/<table>/<int:pk>", methods=["POST"]) 61 @login_required 62 def delete_item(module, table, pk): 63 """Delete item with Primary Key = pk from table in module.""" 64 model = getattr(models, table) 65 record = model.query.filter_by(primary_key=pk).first() 66 db.session.delete(record) 67 db.session.commit() 68 flash(f"Successfully removed item #{pk} from {table} table.", "info") 69 return redirect(f"/modules/{module}") 70 71 72 @common.route("/modules/settings") 73 @login_required 74 def settings(): 75 return render_template("modules/settings.html", user=current_user) 76