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