diff --git a/app.py b/app.py index b937434..6fcdea0 100644 --- a/app.py +++ b/app.py @@ -11,8 +11,8 @@ 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 application.auth.routes import bp as auth_bp +from application.add_meal_v2.routes import bp as add_meal_v2_bp from typing import Optional # Config @@ -29,13 +29,13 @@ def load_user(user_id: int): # Register blueprints app.register_blueprint(admin_bp) app.register_blueprint(user_bp) -app.register_blueprint(add_meal_bp) app.register_blueprint(auth_bp) +app.register_blueprint(add_meal_v2_bp) # Routes def default_return(next_page: Optional[str] = None): - return redirect(url_for("user.daily_log")) + return redirect(url_for("user.daily_log2")) if next_page: return redirect(next_page) if current_user.is_admin: diff --git a/application/add_meal/routes.py b/application/add_meal_v2/routes.py similarity index 67% rename from application/add_meal/routes.py rename to application/add_meal_v2/routes.py index 7efdf0e..fbe3aa2 100644 --- a/application/add_meal/routes.py +++ b/application/add_meal_v2/routes.py @@ -6,50 +6,52 @@ from flask import ( session, request, jsonify, - abort, ) from flask_login import current_user from forms import FoodItemForm, FoodLogForm from application import db from models import FoodItem, FoodLog from sqlalchemy import and_, or_ -from datetime import datetime, timedelta, timezone +from datetime import datetime from sqlalchemy.sql.elements import BinaryExpression from typing import cast bp = Blueprint( - "add_meal", + "add_meal_v2", __name__, - url_prefix="/add_meal", + url_prefix="/add_meal_v2", template_folder="templates", ) +def date_present(func): + def check_date(): + if "selected_date" not in session: + return redirect(url_for("user.daily_log2")) + + +def item_selected(func): + def check_item(): + if check_item(): + if "item_id" not in session: + return redirect(url_for("add_meal_v2.get_barcode")) + + @bp.before_request def login_required(): if not current_user.is_authenticated: return redirect(url_for("auth.login")) -@bp.route("/select_meal/", methods=["GET"]) -def step1(meal_type: int): - assert type(meal_type) is int - assert 0 <= meal_type <= 3 - session["meal_type"] = meal_type - return redirect(url_for("add_meal.step2")) - - +@date_present @bp.route("/get_barcode", methods=["GET"]) -def step2(): - return render_template("scan_barcode.html") +def get_barcode(): + return render_template("scan_barcode_v2.html") -@bp.route("/step3/", methods=["GET"]) -def step3(input: str): - # check if meal_type cookie is set - if "meal_type" not in session: - return redirect("/") - +@date_present +@bp.route("/add_existing/", methods=["GET"]) +def add_existing(input: str): # Check if input is a barcode if input.isdigit(): item = current_user.food_items.filter_by(barcode=input).first() @@ -59,15 +61,16 @@ def step3(input: str): if item is None: # Does not exist, add item - return redirect(url_for("add_meal.step3_alt1", input=input)) + return redirect(url_for("add_meal_v2.add_new", input=input)) # Track item to add and continue to next step session["item_id"] = item.id - return redirect(url_for("add_meal.step4")) + return redirect(url_for("add_meal_v2.step4")) -@bp.route("/step3_alt1/", methods=["GET"]) -def step3_alt1(input: str): +@date_present +@bp.route("/add_new/", methods=["GET"]) +def add_new(input: str): form = FoodItemForm() if input.isdigit(): @@ -77,8 +80,9 @@ def step3_alt1(input: str): return render_template("add_item.html", form=form) -@bp.route("/step3_alt1/", methods=["POST"]) -def step3_alt1_post(input: str): +@date_present +@bp.route("/add_new/", methods=["POST"]) +def add_new_post(input: str): form = FoodItemForm() if form.validate_on_submit(): @@ -122,25 +126,20 @@ def step3_alt1_post(input: str): print(f"Item exists: {item.barcode} {item.name}") # Item added or already present, return to step 3. - return redirect(url_for("add_meal.step3", input=input)) + return redirect(url_for("add_meal_v2.add_existing", input=input)) else: print("[DEBUG] Form Invalid") - return redirect(url_for("add_meal.step3_alt1", input=input)) + return redirect(url_for("add_meal_v2.add_new", input=input)) +@date_present +@item_selected @bp.route("/step4", methods=["GET", "POST"]) def step4(): - if "item_id" not in session: - return redirect(url_for("add_meal.step2")) form = FoodLogForm() item = db.session.get(FoodItem, session["item_id"]) - - offset = session["offset"] - if offset is None or item is None: - abort(404) - - today = datetime.now(timezone.utc).date() - day = today + timedelta(days=offset) + if not item: + return redirect(url_for("add_meal_v2.get_barcode")) if form.validate_on_submit(): assert form.amount.data @@ -149,29 +148,20 @@ def step4(): food_item_id=item.id, user_id=current_user.id, amount=form.amount.data, - part_of_day=session["meal_type"], - date_=day, + date_=datetime.strptime( + session["selected_date"], "%Y-%m-%d" + ).date(), ) ) db.session.commit() - session.pop("meal_type") session.pop("item_id") - return redirect(url_for("user.daily_log", offset=offset)) + session.pop("selected_date") + return redirect(url_for("user.daily_log2")) - match session["meal_type"]: - case 0: - tod = "Breakfast" - case 1: - tod = "Lunch" - case 2: - tod = "Dinner" - case 3: - tod = "Snack" - case _: - tod = "Unknown" - return render_template("step4.html", tod=tod, item=item, form=form) + return render_template("step4.html", tod="idk", item=item, form=form) +@date_present @bp.route("/query", methods=["GET"]) def query(): q = request.args.get("q", "").strip().lower() diff --git a/application/add_meal/templates/add_item.html b/application/add_meal_v2/templates/add_item.html similarity index 100% rename from application/add_meal/templates/add_item.html rename to application/add_meal_v2/templates/add_item.html diff --git a/application/add_meal/templates/scan_barcode.html b/application/add_meal_v2/templates/scan_barcode_v2.html similarity index 96% rename from application/add_meal/templates/scan_barcode.html rename to application/add_meal_v2/templates/scan_barcode_v2.html index 1169b99..dd6655d 100644 --- a/application/add_meal/templates/scan_barcode.html +++ b/application/add_meal_v2/templates/scan_barcode_v2.html @@ -85,7 +85,7 @@ goButton.addEventListener('click', () => { const value = searchBox.value.trim(); if (value) { - const baseURL = "{{url_for('add_meal.step3', input='!')}}"; + const baseURL = "{{url_for('add_meal_v2.add_existing', input='!')}}"; window.location.href = baseURL.replace("!", encodeURIComponent(value)); } }); @@ -121,7 +121,7 @@ if (result) { // Result found, this should post the barcode const codeText = result.getText(); - const baseURL = "{{url_for('add_meal.step3', input='!')}}"; + const baseURL = "{{url_for('add_meal_v2.add_existing', input='!')}}"; window.location.href = baseURL.replace("!", encodeURIComponent(codeText)); } }) diff --git a/application/add_meal/templates/step4.html b/application/add_meal_v2/templates/step4.html similarity index 100% rename from application/add_meal/templates/step4.html rename to application/add_meal_v2/templates/step4.html diff --git a/application/auth/routes.py b/application/auth/routes.py index 6d6f4b2..b14c3f9 100644 --- a/application/auth/routes.py +++ b/application/auth/routes.py @@ -1,8 +1,8 @@ -from flask import Blueprint, request, render_template, redirect, url_for +from flask import Blueprint, render_template, redirect, url_for from flask_login import current_user, login_user, logout_user from forms import LoginForm, ChangePasswordForm from models import User -from application.utils import default_return +from application.utils import default_return, is_valid_timezone from application import db bp = Blueprint( @@ -19,12 +19,16 @@ def login(): form = LoginForm() if form.validate_on_submit(): + assert form.timezone.data 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 + tz = form.timezone.data + if is_valid_timezone(tz): + user.set_timezone(tz) + db.session.commit() login_user(user) # Log in the user - return default_return(next_page=next_page) + return default_return() else: pass # invalid user diff --git a/application/auth/templates/login.html b/application/auth/templates/login.html index 69597be..e33c8db 100644 --- a/application/auth/templates/login.html +++ b/application/auth/templates/login.html @@ -3,7 +3,10 @@ {% block content %}
-

Login

+

Login

+

+ Your timezone will be saved to show times correctly. +

{{ form.hidden_tag() }} @@ -27,10 +30,21 @@ {% endif %}
+ {{ form.timezone(id="timezone") }} +
{{ form.submit(class="btn btn-primary btn-lg") }}
-{% endblock%} \ No newline at end of file +{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/application/static/css/macros.css b/application/static/css/macros.css deleted file mode 100644 index e69de29..0000000 diff --git a/application/templates/base.html b/application/templates/base.html index a6e2fd3..70ef8ad 100644 --- a/application/templates/base.html +++ b/application/templates/base.html @@ -22,9 +22,6 @@