Pass commands as group, not individual

This commit is contained in:
Alexis M 2019-09-23 22:45:00 +02:00
parent 90b2a92894
commit fe960c13f5
4 changed files with 49 additions and 20 deletions

View file

@ -365,20 +365,29 @@ async def view_delivery(request, response, id):
@app.route("/livraison/{id}/commander", methods=["POST", "GET"]) @app.route("/livraison/{id}/commander", methods=["POST", "GET"])
async def place_order(request, response, id): async def place_order(request, response, id):
delivery = Delivery.load(id) delivery = Delivery.load(id)
email = request.query.get("email", None) # email = request.query.get("email", None)
user = session.user.get(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}" delivery_url = f"/livraison/{delivery.id}"
if not email and user: if not orderer and user:
email = user.email orderer = user
if not email:
if not orderer:
response.message("Impossible de comprendre pour qui passer commande…", "error") response.message("Impossible de comprendre pour qui passer commande…", "error")
response.redirect = delivery_url response.redirect = delivery_url
return return
if request.method == "POST": 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.message("La livraison est fermée", "error")
response.redirect = delivery_url response.redirect = delivery_url
return return
form = request.form form = request.form
order = Order(paid=form.bool("paid", False)) order = Order(paid=form.bool("paid", False))
for product in delivery.products: for product in delivery.products:
@ -394,29 +403,41 @@ async def place_order(request, response, id):
order.products[product.ref] = ProductOrder( order.products[product.ref] = ProductOrder(
wanted=wanted, adjustment=adjustment wanted=wanted, adjustment=adjustment
) )
if not delivery.orders: if not delivery.orders:
delivery.orders = {} delivery.orders = {}
if not order.products: if not order.products:
if email in delivery.orders: if orderer.id in delivery.orders:
del delivery.orders[email] del delivery.orders[orderer.id]
delivery.persist() delivery.persist()
response.message("La commande est vide.", status="warning") response.message("La commande est vide.", status="warning")
response.redirect = delivery_url response.redirect = delivery_url
return return
delivery.orders[email] = order delivery.orders[orderer.id] = order
delivery.persist() 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. # Only send email if order has been placed by the user itself.
emails.send_order( # Send the emails to everyone in the group.
request, env, person=Person(email=email), delivery=delivery, order=order from pdb import set_trace; set_trace()
) groups = request['groups'].groups
response.message(f"La commande pour «{email}» a bien été prise en compte!") 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}" response.redirect = f"/livraison/{delivery.id}"
else: else:
order = delivery.orders.get(email) or Order() order = delivery.orders.get(orderer.id) or Order()
response.html( response.html(
"place_order.html", "place_order.html",
{"delivery": delivery, "person": Person(email=email), "order": order}, {"delivery": delivery, "person": orderer, "order": order},
) )

View file

@ -95,6 +95,14 @@ class Person(Base):
def is_staff(self): def is_staff(self):
return not config.STAFF or self.email in config.STAFF 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 @dataclass
class Group(Base): class Group(Base):

View file

@ -9,12 +9,12 @@
<th class="packing">Conditionnement</th> <th class="packing">Conditionnement</th>
{% endif %} {% endif %}
<th class="amount">Total</th> <th class="amount">Total</th>
{% for email, order in delivery.orders.items() %} {% for orderer, order in delivery.orders.items() %}
<th class="person{% if delivery.is_passed and not order.paid %} not-paid{% endif %}"> <th class="person{% if delivery.is_passed and not order.paid %} not-paid{% endif %}">
{% if request.user and request.user.is_staff %} {% if request.user and request.user.is_staff %}
<a href="/livraison/{{ delivery.id }}/commander?email={{ email }}" title="{{ email }}">{{ email }}</a> <a href="/livraison/{{ delivery.id }}/commander?orderer={{ orderer }}" title="{{ orderer }}">{{ orderer }}</a>
{% else %} {% else %}
<span title="{{ email }}">{{ email }}</span> <span title="{{ orderer }}">{{ orderer }}</span>
{% endif %} {% endif %}
</th> </th>
{% endfor %} {% endfor %}

View file

@ -2,7 +2,7 @@
{% block body %} {% block body %}
<article class="order"> <article class="order">
<h3><a href="/livraison/{{ delivery.id }}">{{ delivery.name }}</a> — Commande pour « {{ person.email }} »</h3> <h3><a href="/livraison/{{ delivery.id }}">{{ delivery.name }}</a> — Commande pour « {{ person.name }} »</h3>
{% include "includes/delivery_head.html" %} {% include "includes/delivery_head.html" %}
<form method="post"> <form method="post">