From 2c838c25a3b86323aed490e08fbfa1e8d0a960fb Mon Sep 17 00:00:00 2001
From: b4-sharp <Bradley2.Sharp@live.uwe.ac.uk>
Date: Wed, 5 Apr 2023 16:48:32 +0100
Subject: [PATCH] [Frontend] Add item, itemsets

---
 store/forms.py                                | 14 +++++++-
 store/models.py                               |  5 ++-
 store/routes.py                               | 35 ++++++++++++++++++-
 store/templates/userContent/admin.html        |  4 ++-
 .../userContent/database_management.html      |  4 +--
 .../userContent/database_management_add.html  | 34 ++++++++++++++++++
 6 files changed, 90 insertions(+), 6 deletions(-)
 create mode 100644 store/templates/userContent/database_management_add.html

diff --git a/store/forms.py b/store/forms.py
index 25703ed..7f088a7 100644
--- a/store/forms.py
+++ b/store/forms.py
@@ -48,6 +48,18 @@ class SearchForm(FlaskForm):
 
 
 class AccessDataForm(FlaskForm):
-    table = SelectField("Table", choices=["Item", "Item Set"])
+    table = SelectField(
+        "Table", choices=["Item", "Item Set"], validators=[validators.DataRequired()]
+    )
     id = IntegerField("ID", [validators.DataRequired()])
     submit = SubmitField("Submit")
+
+
+class AddForm(FlaskForm):
+    table = SelectField(
+        "Table", choices=["Item", "Item Set"], validators=[validators.DataRequired()]
+    )
+    description = StringField("Description", validators=[validators.DataRequired()])
+    # Default value so item set doesn't have validation errors despite not needing it.
+    price = IntegerField(default=0, validators=[validators.DataRequired()])
+    submit = SubmitField("Submit")
diff --git a/store/models.py b/store/models.py
index 06b869c..076efd6 100644
--- a/store/models.py
+++ b/store/models.py
@@ -58,7 +58,6 @@ class ItemSet(db.Model):
 
     id = db.Column(db.Integer, primary_key=True)
     description = db.Column(db.String(256), nullable=False)
-    quantity = db.Column(db.Integer, nullable=False)
     items = db.relationship(
         "Item",
         secondary=itemSets,
@@ -70,6 +69,10 @@ class ItemSet(db.Model):
     def price(self):
         return sum(int(item.price) for item in self.items)
 
+    @property
+    def quantity(self):
+        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
 
diff --git a/store/routes.py b/store/routes.py
index 7e17103..a8f3b35 100644
--- a/store/routes.py
+++ b/store/routes.py
@@ -362,7 +362,40 @@ def database_management():
     )
 
 
-# 25701, 12522
+@app.route("/database_management_add", methods=["GET", "POST"])
+@login_required
+def database_management_add():
+    if current_user.userType != "admin":
+        flash("Unauthorized access")
+        return redirect(url_for("home"))
+
+    form = AddForm()
+    if form.validate_on_submit():
+        description = form.description.data
+        price = form.price.data
+
+        item = None
+        if form.table.data == "Item":
+            item = Item(description=description, price=price)
+        elif form.table.data == "Item Set":
+            item = ItemSet(description=description)
+        db.session.add(item)
+        db.session.commit()
+
+        access_data_form = AccessDataForm()
+        return render_template(
+            "userContent/database_management.html",
+            access_data_form=access_data_form,
+            main_item=item,
+            is_item=type(item) is Item,
+        )
+
+    return render_template(
+        "userContent/database_management_add.html",
+        form=form,
+    )
+
+
 @app.route("/add_item_to_set", methods=["GET", "POST"])
 def add_item_to_set():
     print("Adding Item", file=sys.stderr)
diff --git a/store/templates/userContent/admin.html b/store/templates/userContent/admin.html
index 1632a25..35187f8 100644
--- a/store/templates/userContent/admin.html
+++ b/store/templates/userContent/admin.html
@@ -6,6 +6,8 @@
 <ul>
     <li><a href="{{ url_for('accountDetails')}}">View my Account details</a></li>
     <li><a href="{{ url_for('view_address')}}">View my shipping address</a></li>
-    <li><a href="{{ url_for('database_management')}}">View database management</a></li>
+    <li><a href="{{ url_for('database_management')}}">Edit existing entries</a></li>
+    <li><a href="{{ url_for('database_management_add')}}">Add new entries</a></li>
+
 </ul>
 {% endblock %}
\ No newline at end of file
diff --git a/store/templates/userContent/database_management.html b/store/templates/userContent/database_management.html
index 8a382d4..1c73113 100644
--- a/store/templates/userContent/database_management.html
+++ b/store/templates/userContent/database_management.html
@@ -33,7 +33,7 @@
     <button onclick="deleteItemSet({{main_item.id}})">Delete</button>
     {% endif %}
 
-    {% if main_item.items %}
+    {% if not is_item %}
     <div>
         <h1>Items contained in set: </h1>
         <table>
@@ -49,8 +49,8 @@
                 <tr>
                     <td>{{ item['description'] }}</td>
                     <td>£{{ item['price'] }}</td>
+                    <button onclick="deleteItemFromSet({{item.id}}, {{main_item.id}})">Delete</button>
                 </tr>
-                <button onclick="deleteItemFromSet({{item.id}}, {{main_item.id}})">Delete</button>
                 {% endfor %}
             </tbody>
         </table>
diff --git a/store/templates/userContent/database_management_add.html b/store/templates/userContent/database_management_add.html
new file mode 100644
index 0000000..1ebfc8a
--- /dev/null
+++ b/store/templates/userContent/database_management_add.html
@@ -0,0 +1,34 @@
+{% from "_formhelpers.html" import render_field %}
+{%extends 'base.html' %}
+{% block title %} Database Management | Antiques Online {% endblock %}
+{% block content %}
+<form method="POST">
+    {{form.hidden_tag()}}
+    <dl>
+        <table>
+            <tr>
+                <td>{{ render_field(form.table) }} </td>
+            </tr>
+            <tr>
+                <td>{{ render_field(form.description) }} </td>
+            </tr>
+            <tr id="price_optional">
+                <td>{{ render_field(form.price) }} </td>
+            </tr>
+            </div>
+        </table>
+    </dl>
+    <br>
+    {{form.submit()}}
+    <br>
+</form>
+
+<script>
+    $(document).ready(function () {
+        $('#table').change(function () {
+            $('#price_optional').toggle();
+        });
+    });
+</script>
+
+{% endblock %}
\ No newline at end of file
-- 
GitLab