Author: Pedro Lucas Porcellis <pedrolucasporcellis@gmail.com>
Add selected products to the current order
src/blueprints/orders.py | 12 +++++++++++- src/templates/cycle.html | 4 ++-- src/types/order.py | 20 ++++++++++++++++++++ src/types/order_product.py | 22 ++++++++++++++++++++++
diff --git a/src/blueprints/orders.py b/src/blueprints/orders.py index 6a8a37c89e36e154fbc76c6a2664939ffe524c48..a8e8f0d5df5267363c7b2ec980eab19b178241fb 100644 --- a/src/blueprints/orders.py +++ b/src/blueprints/orders.py @@ -15,4 +15,14 @@ return '', 401 Order.create_for(current_user, current_cycle) return redirect(url_for('cycles.show', id = current_cycle.id)) - + +@orders.route('/<id>', methods = ['POST']) +def update(id): + order = Order.query.filter_by(id = id).first() + + if not order: + order = Order.create_for(current_user, current_cycle) + + order.add_products(request.form.getlist('product_ids')) + + return order.to_json() diff --git a/src/templates/cycle.html b/src/templates/cycle.html index 13f498542578d167ca684b79b4b855e37e04ba29..a70e9665cfab79abcd6bfd919f4c7648524c9916 100644 --- a/src/templates/cycle.html +++ b/src/templates/cycle.html @@ -10,7 +10,7 @@ {% endif %} </section> <section class="products"> - <form action="" method="post"> + <form action="{{url_for('orders.update', id = current_order.id)}}" method="POST"> <table> <thead> <tr> @@ -25,7 +25,7 @@ {% for product in products %} <tr> <td> {% if current_order %} - <input type="checkbox" name="product_ids" > + <input type="checkbox" name="product_ids" value="{{product.id}}"> {% endif %} </td> <td> {{ product.title }} </td> diff --git a/src/types/order.py b/src/types/order.py index f115753b9b9c57c14413acb54d9d042d9259d718..6312222d1a1d7371655018a29223cfc4c0318ee0 100644 --- a/src/types/order.py +++ b/src/types/order.py @@ -1,5 +1,6 @@ from . import db from datetime import datetime as dt +from .order_product import OrderProduct class Order(db.Model): __tablename__ = 'orders' @@ -9,6 +10,8 @@ user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable = False) cycle_id = db.Column(db.Integer, db.ForeignKey('cycles.id'), nullable = False) created_at = db.Column(db.DateTime, default = dt.utcnow) updated_at = db.Column(db.DateTime, default = dt.utcnow) + + order_products = db.relationship('OrderProduct', backref="order", lazy = True) def __init__(self, user_id, cycle_id): self.user_id = user_id @@ -21,3 +24,20 @@ def create(self): db.session.add(self) db.session.commit() + + def add_products(self, product_ids): + # Delete the current products for this order + for product in self.order_products: + db.session.delete(product) + db.session.commit() + + # Create the new entries + for product_id in product_ids: + OrderProduct(self.id, product_id, 1).create() + + def to_json(self): + return { + "user_id": self.user_id, + "cycle_id": self.cycle_id, + "products": list(map(lambda x: x.product_id, self.order_products)) + } diff --git a/src/types/order_product.py b/src/types/order_product.py new file mode 100644 index 0000000000000000000000000000000000000000..69b044f6b7116eedd1ba091a81f38fc70a241c98 --- /dev/null +++ b/src/types/order_product.py @@ -0,0 +1,22 @@ +from . import db +from datetime import datetime as dt + +class OrderProduct(db.Model): + __tablename__ = "order_products" + + id = db.Column(db.Integer, primary_key = True) + product_id = db.Column(db.Integer, db.ForeignKey('products.id'), nullable = False) + order_id = db.Column(db.Integer, db.ForeignKey('orders.id'), nullable = False) + quantity = db.Column(db.Integer, default = 1, nullable = False) + + created_at = db.Column(db.DateTime, default = dt.utcnow) + updated_at = db.Column(db.DateTime, default = dt.utcnow) + + def __init__(self, order_id, product_id, quantity): + self.order_id = order_id + self.product_id = product_id + self.quantity = quantity + + def create(self): + db.session.add(self) + db.session.commit()