Files
cal_counter/app.py
Stef c552a4571e Add barcode-based meal logging workflow
Introduces a new add_meal blueprint with routes and templates for scanning barcodes, adding new food items, and logging meals. Updates FoodItemForm and FoodLogForm validation, changes FoodLog.amount to float, and integrates the new workflow into the daily log UI. Refactors user routes and templates to support the new meal logging process.
2025-08-07 17:00:56 +02:00

92 lines
2.1 KiB
Python

from flask import render_template, redirect, url_for, request
from flask_login import (
login_required,
logout_user,
login_user,
current_user,
)
from forms import LoginForm
from models import User
from application import db, app, login_manager
from application.admin.routes import admin_bp
from application.user.routes import user_bp
from application.add_meal.routes import bp as add_meal_bp
from typing import Optional
# Config
app.config["SECRET_KEY"] = "Stef123"
login_manager.login_view = "login" # type: ignore
@login_manager.user_loader # type: ignore
def load_user(user_id: int):
return db.session.get(User, user_id)
# Register blueprints
app.register_blueprint(admin_bp)
app.register_blueprint(user_bp)
app.register_blueprint(add_meal_bp)
# Routes
def default_return(next_page: Optional[str] = None):
return redirect(url_for("user.dashboard"))
if next_page:
return redirect(next_page)
if current_user.is_admin:
return redirect(url_for("admin.food_items"))
return redirect(url_for("dashboard"))
@app.route("/")
@login_required
def index():
return redirect(url_for("login"))
@app.route("/login", methods=["GET", "POST"])
def login():
if current_user.is_authenticated:
return default_return()
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and user.check_password(password=form.password.data):
# User found and password correct
next_page = request.args.get("next") # Get next page if given
login_user(user) # Log in the user
return default_return(next_page=next_page)
else:
pass
# invalid user
return render_template("login.html", form=form)
@app.route("/logout")
@login_required
def logout():
logout_user()
return redirect(url_for("index"))
@app.route("/scan")
@login_required
def scan():
return render_template("scan.html")
# Run
if __name__ == "__main__":
app.run(
host="0.0.0.0",
port=443,
debug=True,
ssl_context=("cert.pem", "key.pem"),
)