From 5ae82e379e01eadb2e99b9e633d075ee5647fe6d Mon Sep 17 00:00:00 2001 From: Stef Date: Tue, 8 Jul 2025 11:43:22 +0200 Subject: [PATCH] Refactor food item flow and barcode handling Updated routes and templates to improve the process of adding and logging food items by barcode. The add_food_item route now accepts a barcode parameter, and barcode lookups redirect to item creation if not found. The log_food flow now uses session variables for item and meal selection, and the get_item.html template uses fetch to handle barcode lookups and redirects accordingly. --- application/user/routes.py | 66 +++++++++++-------- application/user/templates/add_food_item.html | 2 +- application/user/templates/get_item.html | 18 ++++- 3 files changed, 57 insertions(+), 29 deletions(-) diff --git a/application/user/routes.py b/application/user/routes.py index a8ab62c..b376641 100644 --- a/application/user/routes.py +++ b/application/user/routes.py @@ -59,9 +59,9 @@ fields = [ ] -@user_bp.route("/add_food_item", methods=["POST"]) -def add_food_item(): - form = FoodItemForm() +@user_bp.route("/add_food_item/", methods=["GET", "POST"]) +def add_food_item(barcode): + form = FoodItemForm(barcode=barcode) if form.validate_on_submit(): print("[DEBUG] Valid form") @@ -92,9 +92,9 @@ def add_food_item(): else: print("[DEBUG] Invalid form") if form.barcode.data: - return redirect(url_for("user.food_item", barcode=form.barcode.data)) + return render_template("add_food_item.html", form=form) else: - return redirect(url_for("scan")) + return redirect("/") @user_bp.route("/edit_food_item/", methods=["GET", "POST"]) @@ -119,7 +119,7 @@ def edit_food_item(id: int): return redirect(url_for("user.dashboard")) -@user_bp.route("/food_item/", methods=["GET"]) +@user_bp.route("/food_item/", methods=["GET"]) def food_item(barcode): food = FoodItem.query.filter_by(barcode=barcode).first() if food: @@ -161,24 +161,27 @@ def add_food_item_manual(): return render_template("add_food_item_manual.html", form=form) -@user_bp.route("/log_food/", methods=["GET", "POST"]) -def log_food(item_id): +@user_bp.route("/log_food", methods=["GET", "POST"]) +def log_food(): form = FoodLogForm() - if item_id is not None: - if db.session.get(FoodItem, item_id): - if form.validate_on_submit(): - assert form.amount.data is not None - db.session.add( - FoodLog( - item_id, - current_user.id, - form.amount.data, - part_of_day=0, - ) + item_id = session["item_id"] + meal_type = session["meal_type"] + if item_id is None or meal_type is None: + return redirect("/") + if db.session.get(FoodItem, item_id): + if form.validate_on_submit(): + assert form.amount.data is not None + db.session.add( + FoodLog( + item_id, + current_user.id, + form.amount.data, + part_of_day=meal_type, ) - db.session.commit() - return redirect(url_for("user.dashboard")) - return render_template("log_food.html", item_id=item_id, form=form) + ) + db.session.commit() + return redirect(url_for("user.dashboard")) + return render_template("log_food.html", form=form) @user_bp.route("/overview", methods=["GET"]) @@ -193,7 +196,14 @@ def select_meal(meal_type: int): return redirect(url_for("user.scan_product")) -@user_bp.route("/get_userid", methods=["GET"]) +@user_bp.route("/select_item/", methods=["GET"]) +def select_item(item_id: int): + assert type(item_id) is int + session["item_id"] = item_id + return redirect(url_for("user.log_food")) + + +@user_bp.route("/get_foodid", methods=["GET"]) def scan_product(): return render_template("get_item.html") @@ -221,9 +231,13 @@ def test(): @user_bp.route("/foodId_from_barcode/", methods=["GET"]) def foodId_from_barcode(barcode: str): - if barcode.isdigit(): - return jsonify({"food_id": barcode}) - else: + # Check if barcode contains only digits + if not barcode.isdigit(): return abort( 400, description="Invalid barcode: must contain only digits" ) + + item = current_user.food_items.filter_by(barcode=barcode).first() + if item is None: + return redirect(url_for("user.add_food_item", barcode=barcode)) + return jsonify({"item_id": item.id}) diff --git a/application/user/templates/add_food_item.html b/application/user/templates/add_food_item.html index e167d55..04b77bc 100644 --- a/application/user/templates/add_food_item.html +++ b/application/user/templates/add_food_item.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -
+ {{ form.hidden_tag() }}
diff --git a/application/user/templates/get_item.html b/application/user/templates/get_item.html index f168aa9..51d3b9a 100644 --- a/application/user/templates/get_item.html +++ b/application/user/templates/get_item.html @@ -49,8 +49,22 @@ if (result) { // Result found, this should post the barcode const codeText = result.getText(); - const baseURL = "{{url_for('user.food_item', barcode='0')}}" - window.location.href = baseURL.replace("0", encodeURIComponent(codeText)) + const baseURL = "{{url_for('user.foodId_from_barcode', barcode='!')}}" + fetch(baseURL.replace("!", encodeURIComponent(codeText))) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not OK'); + } + return response.json(); // or response.text(), response.blob(), etc. + }) + .then(data => { + const baseURL2 = "{{url_for('user.select_item', item_id='0')}}" + window.location.href = baseURL2.replace("0", encodeURIComponent(data["item_id"])) + }) + .catch(error => { + console.error('Fetch error:', error); + }); + } }); });