diff --git a/.gitignore b/.gitignore index f771574..0c925f3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ db/* venv .env .vscode -.pytest_cache \ No newline at end of file +.pytest_cache +crac.env diff --git a/copanier/config.py b/copanier/config.py index 8b60cad..8cb7e73 100644 --- a/copanier/config.py +++ b/copanier/config.py @@ -20,7 +20,6 @@ SITE_URL = "http://localhost:2244" SITE_DESCRIPTION = "Shared orders" EMAIL_SIGNATURE = "The kind people behind copanier" - def init(): for key, value in globals().items(): if key.isupper(): diff --git a/copanier/emails.py b/copanier/emails.py index 44d38bd..d1686c7 100644 --- a/copanier/emails.py +++ b/copanier/emails.py @@ -3,7 +3,7 @@ from emails import Message from . import config -def send(to, subject, body, html=None, copy=None, attachments=None): +def send(to, subject, body, html=None, copy=None, attachments=None, mail_from=None): if not attachments: attachments = [] @@ -20,6 +20,7 @@ def send(to, subject, body, html=None, copy=None, attachments=None): message.send( to=to, + mail_from=mail_from, smtp={ "host": config.SMTP_HOST, "user": config.SMTP_LOGIN, @@ -30,11 +31,11 @@ def send(to, subject, body, html=None, copy=None, attachments=None): ) -def send_from_template(env, template, to, subject, **params): +def send_from_template(env, template, to, subject, mail_from=None, **params): params["config"] = config html = env.get_template(f"emails/{template}.html").render(**params) txt = env.get_template(f"emails/{template}.txt").render(**params) - send(to, subject, body=txt, html=html) + send(to, subject, body=txt, html=html, mail_from=mail_from) def send_order(request, env, person, delivery, order, group_id, **kwargs): diff --git a/copanier/static/app.css b/copanier/static/app.css index c0f4cd2..bfa6ae7 100644 --- a/copanier/static/app.css +++ b/copanier/static/app.css @@ -784,4 +784,8 @@ small { } .progressbar li.active + li:after { background-color: #55b776; +} + +#instructions { + height: 100px; } \ No newline at end of file diff --git a/copanier/templates/delivery/handover_delivery.html b/copanier/templates/delivery/handover_delivery.html new file mode 100644 index 0000000..4fc81f8 --- /dev/null +++ b/copanier/templates/delivery/handover_delivery.html @@ -0,0 +1,61 @@ +{% extends "base.html" %} + +{% block toplink %}{% if delivery.id %}↶ Retourner à la distribution{% endif %}{% endblock %} +{% block body %} +
La distribution est maintenant terminée ! Il est temps de passer le relai à une autre personne.
+Le plus simple est de remplir les détails pour la prochaine distribution, ainsi que les informations pour les référent·es qui vont évoluer
+Et puis on créera la prochaine distribution et on enverra un petit mail à la nouvelle personne référente.
+{% endif %} + +La distribution est maintenant terminée. C'est le moment de passer le relai, merci !
{% endif %}Bonjour,
+ +La personne référente de la dernière distribution vient de la clôturer, et a indiqué que vous étiez la personne référente pour la prochaine distribution.
+ +Bravo :-)
+ +{% if email_body %} +Elle vous a même laissé un petit message :
+ +{{ email_body}}
+ +{% endif %} + +Voici les informations renseignées :
+ +Si vous avez besoin de modifier ces informations, vous pouvez le faire en suivant ce lien.
+ +Bonne journée,
+ +{{ config.EMAIL_SIGNATURE }}
diff --git a/copanier/templates/emails/handover_delivery.txt b/copanier/templates/emails/handover_delivery.txt new file mode 100644 index 0000000..52a38c7 --- /dev/null +++ b/copanier/templates/emails/handover_delivery.txt @@ -0,0 +1,30 @@ +Bonjour, + +La personne référente de la dernière distribution vient de la clôturer, et a indiqué que vous étiez la personne référente pour la prochaine distribution. + +Bravo :-) + +{% if email_body %} +Elle vous a même laissé un petit message : {{ email_body }} + +{% endif %} +Voici les informations renseignées : + +Nom : {{ delivery.name }} +Date et heure : {{ delivery.from_date|date }} de {{ delivery.from_date|time }} à {{ delivery.to_date|time }}. +Lieu : {{ delivery.location }} +Commandes avant le {{ delivery.order_before|date }}. + +Référent·es produits : + +{% for producer_name, producer in delivery.producers.items() %} +- {{ producer.name }} : {{ producer.referent_name }} - {{ producer.referent }} - {{ producer.referent_tel }} +{% endfor %} + +Si vous avez besoin de modifier ces informations, vous pouvez le faire en suivant ce lien : + + {{ url_for('show_delivery', id=delivery.id) }} + + +Bonne journée, +{{ config.EMAIL_SIGNATURE }} diff --git a/copanier/templates/includes/delivery_dates_table.html b/copanier/templates/includes/delivery_dates_table.html new file mode 100644 index 0000000..cdcb49c --- /dev/null +++ b/copanier/templates/includes/delivery_dates_table.html @@ -0,0 +1,57 @@ +Quoi ? | Dates | Coordinatrice⋅eur | Référent⋅e⋅s produits | +
---|---|---|---|
Création de la distribution | +{{ delivery.dates.creation_date | date}} | +Rappeler aux référent⋅e⋅s produit de mettre leurs prix à jour, vérifier que tous les producteurs⋅rices sont bien présentes, en ajouter si besoin | +- | +
Mise à jour des prix | +Du {{ delivery.dates.price_update_start | date }} au {{ delivery.dates.price_update_deadline | date}} | +— | +Les référent⋅e⋅s produit mettent les prix à jour. | +
Commandes + | Du {{ delivery.dates.price_update_deadline | date }} au {{ delivery.dates.order_before | date }} | +Envoyer le lien de commande aux groupes pour qu'iels commandent | +— | +
Ajustements | +Du {{ delivery.dates.order_before | date }} au {{ delivery.dates.adjustment_deadline | date }} | +S'assurer que les ajustements sont bien faits par les participant⋅e⋅s | +Faire les ajustements à la main si besoin | +
Approvisionnements | +Du {{ delivery.dates.adjustment_deadline | date }} au {{ delivery.dates.delivery_date | date }} | +Envoyer les infos de commande aux référent⋅e⋅s | +Faire les commandes aux producteurs⋅rices, récupérer les produits | +
Préparation de la distribution | +La veille du {{ delivery.dates.delivery_date | date }} | +Imprimer les bons de commandes par colocation | +— | +
Distribution | +{{ delivery.dates.delivery_date | date }} | +Coordonner la distribution, faire la répartition des chèques | +Arriver 30mn avant le début de la distribution, répartir les produits par coloc | +
Transmission | +Après la distribution | +Passer le relai à la nouvelle personne référente | +— | +
Certains produits sont en rupture de stock.
{% endif %} diff --git a/copanier/templates/includes/order_summary.html b/copanier/templates/includes/order_summary.html index 4b2ff41..171dbf0 100644 --- a/copanier/templates/includes/order_summary.html +++ b/copanier/templates/includes/order_summary.html @@ -15,4 +15,4 @@ {% endif %} {% endfor %} -Total: {{ order.total(delivery.products, delivery, group_id) if order else 0 }} € (dont {{ order.compute_shipping(delivery, delivery.producers, group_id) | round(2) }} de port)
+Total: {{ order.total(delivery.products, delivery, group_id) if order else 0 }} € (dont {{ order.compute_shipping(delivery, delivery.producers, group_id) | round(2) }} de port)
\ No newline at end of file diff --git a/copanier/views/delivery.py b/copanier/views/delivery.py index 52d538f..8f0e4bf 100644 --- a/copanier/views/delivery.py +++ b/copanier/views/delivery.py @@ -33,22 +33,67 @@ async def home(request, response): async def new_delivery(request, response): response.html("delivery/edit_delivery.html", delivery={}) - -@app.route("/distribution", methods=["POST"]) -async def create_delivery(request, response): - form = request.form +def create_delivery_from_form(form): data = {} data["from_date"] = f"{form.get('date')} {form.get('from_time')}" data["to_date"] = f"{form.get('date')} {form.get('to_time')}" for name in Delivery.__dataclass_fields__.keys(): if name in form: data[name] = form.get(name) - delivery = Delivery(**data) + return Delivery(**data) + + +@app.route("/distribution", methods=["POST"]) +async def create_delivery(request, response): + delivery = create_delivery_from_form(request.form) delivery.persist() response.message("La distribution a bien été créée!") response.redirect = f"/distribution/{delivery.id}" +@app.route("/distribution/{id}/transmettre", methods=["GET"]) +async def hand_over_delivery(request, response, id): + delivery = Delivery.load(id) + + response.html( + "delivery/handover_delivery.html", + delivery=delivery, + ) + + +@app.route("/distribution/{id}/transmettre", methods=["POST"]) +async def hand_over_delivery_post(request, response, id): + old_delivery = Delivery.load(id) + + form = request.form + new_delivery = create_delivery_from_form(form) + new_delivery.producers = old_delivery.producers + new_delivery.products = old_delivery.products + + # Update referent fields + for producer_id, producer in new_delivery.producers.items(): + producer.referent = form.get(f'producer_{producer_id}_referent_email') + producer.referent_name = form.get(f'producer_{producer_id}_referent_name') + producer.referent_tel = form.get(f'producer_{producer_id}_referent_tel') + new_delivery.producers[producer_id] = producer + new_delivery.persist() + + emails.send_from_template( + env, + "handover_delivery", + new_delivery.contact, + f"{config.SITE_NAME} - Passage de flambeau", + old_delivery.contact, + delivery=new_delivery, + email_body = form.get('email_body'), + hostname=request.host, + url_for=app.url_for, + ) + + response.message("La distribution à bien été créée et le mail envoyé, merci !") + response.redirect = f"/distribution/{new_delivery.id}" + + @app.route("/distribution/{id}/{producer}/bon-de-commande.pdf", methods=["GET"]) async def pdf_for_producer(request, response, id, producer): delivery = Delivery.load(id)