summaryrefslogtreecommitdiff
path: root/app/routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/routes.py')
-rw-r--r--app/routes.py254
1 files changed, 87 insertions, 167 deletions
diff --git a/app/routes.py b/app/routes.py
index d2bd3f0..11cd3c2 100644
--- a/app/routes.py
+++ b/app/routes.py
@@ -19,161 +19,26 @@ placeholder data for posts' content.
from flask import Flask, render_template, request, redirect, flash, url_for, jsonify
-from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
-from flask_wtf import FlaskForm
-from wtforms import (
- SubmitField,
- SelectField,
- RadioField,
- HiddenField,
- StringField,
- IntegerField,
- FloatField,
-)
-from wtforms.validators import InputRequired, Length, Regexp, NumberRange
from datetime import datetime
+import inspect
-import placeholders as p
+from model import *
+from forms import *
app = Flask(__name__)
-# Flask-Bootstrap requires this line
-Bootstrap(app)
-
-
-# Flask-WTF encryption key
-app.config["SECRET_KEY"] = "Scooby_Lu,_where_are_you?"
-
-# Our database name
-db_name = "fapg.db"
-app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + db_name
-app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
-db = SQLAlchemy(app)
-
-
-class Users(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name_first = db.Column(db.String(20), nullable=False)
- name_last = db.Column(db.String(20), nullable=False)
- email = db.Column(db.String(20), nullable=False)
- phone_mobile = db.Column(db.Integer, nullable=False)
- phone_alternative = db.Column(db.Integer)
- updated = db.Column(db.String)
-
- def __init__(
- self, name_first, name_last, email, phone_mobile, phone_alternative, updated
- ):
- self.name_first = name_first
- self.name_last = name_last
- self.email = email
- self.phone_mobile = phone_mobile
- self.phone_alternative = phone_alternative
- self.updated = updated
-
- def __repr__(self):
- return f"<User {self.name_first} {self.name_last}>"
-
-
-class Products(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(20), nullable=False)
- supplier = db.Column(db.String(20), nullable=False)
- price = db.Column(db.Float(10), nullable=False)
- updated = db.Column(db.String)
-
- def __init__(self, name, supplier, price, updated):
- self.name = name
- self.supplier = supplier
- self.price = price
- self.updated = updated
-
- def __repr__(self):
- return f"<Product {self.name} by {self.supplier}>"
-
-
-class Projects(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(20), nullable=False)
- name_full = db.Column(db.String(20), nullable=False)
- nickname = db.Column(db.String(20), nullable=False)
- city = db.Column(db.String(20), nullable=False)
-
- def __repr__(self):
- return f"<Project {self.name}>"
-
-
-class Modules(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- name = db.Column(db.String(20), unique=True, nullable=False)
- description = db.Column(db.String(50), nullable=False)
-
- def __init__(self, name, description, updated):
- self.name = name
- self.description = description
- self.updated = updated
-
- def __repr__(self):
- return f"<Module {self.name}>"
-
-
-class AddProduct(FlaskForm):
- # id used only by update/edit
- id = HiddenField()
- name = StringField("Product name", validators=[InputRequired()])
- supplier = SelectField(
- "Choose a supplier",
- choices=[
- ("", ""),
- ("Mister Brown", "Mister Brown"),
- ("Madame Cerise", "Madame Cerise"),
- ("Biton la Malice", "G. Biton la Malice"),
- ("Leroy Merlin", "Leroy Merlin"),
- ("other", "Other"),
- ],
- )
- price = FloatField("Retail price per unit")
- # updated - date - handled in the route function
- updated = HiddenField()
- submit = SubmitField("Add/Update Product")
-
-
-# add a new product to the database
-@app.route("/add_product", methods=["GET", "POST"])
-def add_product():
- form = AddProduct()
- if form.validate_on_submit():
- name = request.form["name"]
- supplier = request.form["supplier"]
- price = request.form["price"]
- # get today's date from function, above all the routes
- updated = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- # the data to be inserted into FAPG model - the table, products
- record = Products(name, supplier, price, updated)
- # Flask-SQLAlchemy magic adds record to database
- db.session.add(record)
- db.session.commit()
- # create a message to send to the template
- message = f"The data for product {name} has been submitted."
- return render_template("add_product.html", message=message)
- else:
- # show validaton errors
- # see https://pythonprogramming.net/flash-flask-tutorial/
- for field, errors in form.errors.items():
- for error in errors:
- flash(
- "Error in {}: {}".format(getattr(form, field).label.text, error),
- "error",
- )
- return render_template("add_product.html", form=form)
+
+app.config.from_pyfile("../config.py")
+db.init_app(app)
@app.route("/")
@app.route("/fapg/home")
def project():
"""This is our project welcome page."""
- michel = Users(
+ michel = User(
name_first="Michel",
name_last="Peter",
email="le-boss@fapg.com",
@@ -181,35 +46,90 @@ def project():
phone_alternative="0000000000",
updated="2022-04-21",
)
- modules = Modules.query.all()
+ modules = Module.query.all()
print(module.name for module in modules)
- return render_template("home.html", user=michel, project=fapg, modules=modules)
+ return render_template("home.html", user=michel, project="fapg", modules=modules)
-@app.route("/module/<module>")
+@app.route("/modules")
+def all_modules():
+ return redirect("/")
+
+
+@app.route("/modules/<module>")
def render_module(module):
- modules = Modules.query.all()
- catalog = Products.query.all()
- user_modules = [module.name for module in modules]
- print(user_modules)
- # If a module was purchased by a user and added to their database,
- # they have access to the corresponding module route.
- if module in user_modules:
- return render_template(
- f"modules/{module}.html",
- modules=modules,
- catalog=catalog,
- )
- else:
+ modules = Module.query.all()
+ if module not in [mod.name for mod in modules]:
return render_template("errors/module-not-found.html", module=module)
+ customers = Customer.query.order_by(Customer.primary_key.desc())
+ products = Product.query.order_by(Product.primary_key.desc())
+ logs = Log.query.order_by(Log.primary_key.desc())
+ latest_target = (
+ Log.query.filter_by(target="True").order_by(Log.primary_key.desc()).first()
+ )
+ flash(f"Successfully accessed module {module}.", "info")
+ flash(f"Still fighting against styling in {module}.", "error")
+ return render_template(
+ f"modules/{module}.html",
+ module=module,
+ modules=modules,
+ customers=customers,
+ products=products,
+ logs=logs,
+ target=latest_target,
+ )
+
+
+@app.route("/delete-<pk>-from-<table>", methods=["POST"])
+def delete_item(pk, table):
+ """Delete item with Primary Key = pk from corresponding database
+ table.
+ """
+ model = globals()[table]
+ record = model.query.filter_by(primary_key=pk).first()
+ db.session.delete(record)
+ db.session.commit()
+ flash(f"Successfully removed item #{pk} from {table} table.", "info")
+ return redirect("/modules")
+
+
+@app.route("/add-<item>", methods=["GET", "POST"])
+def add_item(item):
+ """Add a new item to a corresponding database table.
+
+ The item must match a database model class name (table). Then, we
+ match the model class attributes with request.form values.
+
+ """
+ if item not in db.metadata.tables.keys():
+ return render_template("errors/item-not-found.html", item=item)
+ if request.method == "GET":
+ form = globals()[f"Add{item.capitalize()}"]()
+ return render_template("add-item.html", item=item, form=form)
+ if request.method == "POST":
+ table = globals()[item.capitalize()]
+ table_fields = inspect.signature(table).parameters
+ form_values = [request.form[key] for key in table_fields]
+ debug = f"Ready to insert {form_values}"
+ record = table(*form_values)
+ db.session.add(record)
+ db.session.commit()
+ item_pk = table.query.order_by(table.primary_key.desc()).first().primary_key
+ flash(
+ f"Successfully added item #{item_pk} to {table.__table__.name.capitalize()} table.",
+ "info",
+ )
+ return redirect(f"/modules")
+
+
+@app.route("/add-invoice", methods=["GET", "POST"])
+def add_invoice():
+ form = AddInvoice()
+ if request.method == "GET":
+ return render_template("add-invoice.html")
-# If this file is executed as a script (i.e. double-clicked),
-# the Python interpreter will run the Flask process and begin serving
-# the web pages on the standard localhost address (127.0.0.1).
-# But if this file is called as a module by another Python script, it will not
-# serve content to the web pages, but the function definitions contained in
-# this file will be available to the calling script.
-# E.g. calling script will know what the yes() function is.
-if __name__ == "__main__":
- app.run(debug=True)
+@app.route("/preview-invoice", methods=["GET", "POST"])
+def preview_invoice():
+ if request.method == "GET":
+ return render_template("preview-invoice.html")
Copyright 2019--2024 Marius PETER