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"])
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.
# 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
)
response.message(f"La commande pour «{email}» a bien été prise en compte!")
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},
)

View file

@ -95,6 +95,14 @@ class Person(Base):
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
class Group(Base):

View file

@ -9,12 +9,12 @@
<th class="packing">Conditionnement</th>
{% endif %}
<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 %}">
{% 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 %}
<span title="{{ email }}">{{ email }}</span>
<span title="{{ orderer }}">{{ orderer }}</span>
{% endif %}
</th>
{% endfor %}

View file

@ -2,7 +2,7 @@
{% block body %}
<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" %}
<form method="post">