diff --git a/copanier/__init__.py b/copanier/__init__.py index 75fc2a8..14b4fa8 100644 --- a/copanier/__init__.py +++ b/copanier/__init__.py @@ -365,20 +365,29 @@ async def view_delivery(request, response, id): @app.route("/livraison/{id}/commander", methods=["POST", "GET"]) async def place_order(request, response, id): delivery = Delivery.load(id) - email = request.query.get("email", None) + # email = request.query.get("email", None) user = session.user.get(None) + orderer = request.query.get("orderer", None) + if orderer: + orderer = Person(email=orderer, group_id=orderer) + delivery_url = f"/livraison/{delivery.id}" - if not email and user: - email = user.email - if not email: + if not orderer and user: + orderer = user + + if not orderer: response.message("Impossible de comprendre pour qui passer commande…", "error") response.redirect = delivery_url return + if request.method == "POST": - if not (user and user.is_staff) and delivery.status == delivery.CLOSED: + + # When the delivery is closed, only staff can access. + if delivery.status == delivery.CLOSED and not (user and user.is_staff) : response.message("La livraison est fermée", "error") response.redirect = delivery_url return + form = request.form order = Order(paid=form.bool("paid", False)) for product in delivery.products: @@ -394,29 +403,41 @@ async def place_order(request, response, id): order.products[product.ref] = ProductOrder( wanted=wanted, adjustment=adjustment ) + if not delivery.orders: delivery.orders = {} + if not order.products: - if email in delivery.orders: - del delivery.orders[email] + if orderer.id in delivery.orders: + del delivery.orders[orderer.id] delivery.persist() response.message("La commande est vide.", status="warning") response.redirect = delivery_url return - delivery.orders[email] = order + delivery.orders[orderer.id] = order delivery.persist() - if user and user.email == email: + + if user and orderer.id == user.id: # Only send email if order has been placed by the user itself. - emails.send_order( - request, env, person=Person(email=email), delivery=delivery, order=order - ) - response.message(f"La commande pour «{email}» a bien été prise en compte!") + # Send the emails to everyone in the group. + from pdb import set_trace; set_trace() + groups = request['groups'].groups + if orderer.group_id in groups.keys(): + for email in groups[orderer.group_id].members: + emails.send_order( + request, env, person=Person(email=email), delivery=delivery, order=order + ) + else: + emails.send_order( + request, env, person=Person(email=orderer.email), delivery=delivery, order=order + ) + response.message(f"La commande pour « {orderer.name} » a bien été prise en compte!") response.redirect = f"/livraison/{delivery.id}" else: - order = delivery.orders.get(email) or Order() + order = delivery.orders.get(orderer.id) or Order() response.html( "place_order.html", - {"delivery": delivery, "person": Person(email=email), "order": order}, + {"delivery": delivery, "person": orderer, "order": order}, ) diff --git a/copanier/models.py b/copanier/models.py index daf2a02..4cf4fdf 100644 --- a/copanier/models.py +++ b/copanier/models.py @@ -94,6 +94,14 @@ class Person(Base): @property def is_staff(self): return not config.STAFF or self.email in config.STAFF + + @property + def id(self): + return self.group_id or self.email + + @property + def name(self): + return self.group_name or self.email @dataclass @@ -145,7 +153,7 @@ class Groups(PersistedBase): if email in group.members: return group return None - + @classmethod def init_fs(cls): cls.get_root().mkdir(parents=True, exist_ok=True) diff --git a/copanier/templates/includes/delivery_table.html b/copanier/templates/includes/delivery_table.html index 1ed617a..1779e8c 100644 --- a/copanier/templates/includes/delivery_table.html +++ b/copanier/templates/includes/delivery_table.html @@ -9,12 +9,12 @@ Conditionnement {% endif %} Total - {% for email, order in delivery.orders.items() %} + {% for orderer, order in delivery.orders.items() %} {% if request.user and request.user.is_staff %} - {{ email }} + {{ orderer }} {% else %} - {{ email }} + {{ orderer }} {% endif %} {% endfor %} diff --git a/copanier/templates/place_order.html b/copanier/templates/place_order.html index 994fa87..497d7df 100644 --- a/copanier/templates/place_order.html +++ b/copanier/templates/place_order.html @@ -2,7 +2,7 @@ {% block body %}
-

{{ delivery.name }} — Commande pour « {{ person.email }} »

+

{{ delivery.name }} — Commande pour « {{ person.name }} »

{% include "includes/delivery_head.html" %}