From 6b0592f04058a1fab07c5c33aaf13e7a642dfc02 Mon Sep 17 00:00:00 2001
From: Jude Hutton <jude2.hutton@live.uwe.ac.uk>
Date: Mon, 24 Apr 2023 11:46:56 +0100
Subject: [PATCH] Fixed basket conflicts with items in item sets.

---
 store/models.py  |  2 +-
 store/routes.py  | 28 ++++++++++++++++++----------
 store/utility.py |  6 ++++++
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/store/models.py b/store/models.py
index a5d31d2..d84ac9d 100644
--- a/store/models.py
+++ b/store/models.py
@@ -74,7 +74,7 @@ class ItemSet(db.Model):
         return len(self.items)
 
     def __repr__(self):
-        return f"id: {self.id}, description: {self.description}, items: {self.items}, quantity: {self.price}, price: { self.calculate_price() }"  # TODO: Rename price to quantity
+        return f"id: {self.id}, description: {self.description}, items: {self.items}, quantity: {self.price}, price: { self.price() }"  # TODO: Rename price to quantity
 
 
 class User(db.Model, UserMixin):
diff --git a/store/routes.py b/store/routes.py
index fa669fb..fd157b0 100644
--- a/store/routes.py
+++ b/store/routes.py
@@ -575,11 +575,10 @@ def order_summary():
     if "basket" in session:
         address = session.get("address", "")
         for item_id, item in session["basket"].items():
-            
             items.append(item)
             total_price = total_price + item["price"]
         session.clear()
-        
+
         return render_template(
             "order_summary.html", items=items, address=address, total_price=total_price
         )
@@ -643,14 +642,21 @@ def add_to_basket():
         "id": item_obj.id,
         "description": item_obj.description,
         "price": item_obj.price,
-        "is_item_set" : False
+        "is_item_set": False,
     }
+
     if "basket" not in session:
         session["basket"] = {}
+    item_sets = get_itemsets_by_item_id(item_id)
+    is_in_basket = False
+    for item_set in item_sets:
+        if item_set.id in session["basket"]:
+            is_in_basket = True
+            flash("Item already in basket in set")
 
     if item_id in session["basket"]:
         flash("Item already in basket")
-    else:
+    elif not is_in_basket:
         session["basket"][item_id] = item_dict
         flash("Item added to basket: " + item_obj.description)
 
@@ -660,22 +666,24 @@ def add_to_basket():
 @app.route("/add_to_basket_set", methods=["POST"])
 def add_to_basket_set():
     item_id = request.form["item_id"]
-
     item_obj = get_item_set_by_id(item_id)
 
     item_dict = {
         "id": item_obj.id,
         "description": item_obj.description,
-        "price": item_obj.price, 
-        "is_item_set" : True
+        "price": item_obj.price,
+        "is_item_set": True,
     }
     if "basket" not in session:
         session["basket"] = {}
-
+    is_in_basket = False
+    for item in item_obj.items:
+        if item.id in session["basket"]:
+            is_in_basket = True
+            flash("Item already in basket in item set.")
     if item_id in session["basket"]:
         flash("Item already in basket")
-
-    else:
+    elif not is_in_basket:
         session["basket"][item_id] = item_dict
         flash("Item added to basket: " + item_obj.description)
         print(session["basket"])
diff --git a/store/utility.py b/store/utility.py
index 8029ff9..8100bee 100644
--- a/store/utility.py
+++ b/store/utility.py
@@ -102,6 +102,12 @@ def get_item_by_id(id):
     return Item.query.get(id)
 
 
+def get_items_by_itemset_id(item_set_id):
+    item_set = get_item_set_by_id(item_set_id)
+    items = item_set.items
+    return items
+
+
 def add_item(description, price, date_sold=None):
     item = Item(description=description, price=price, date_sold=date_sold)
     db.session.add(item)
-- 
GitLab