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 73f3091..5aa5bb8 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 %} +
+{% if delivery.id %} +

Passage de la référence (transmission)

+ +

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 %} + +
+
+ + + + + + + + + +

Emails des référent·es

+

Si il y a un changement de référence pour les producteurs·rices, mettez les info à jour :

+ + {% for producer_name, producer in delivery.producers.items() %} +

{{ producer.name }}

+ + + + + {% endfor %} +
+ +
+
+
+{% endblock body %} diff --git a/copanier/templates/delivery/show_delivery.html b/copanier/templates/delivery/show_delivery.html index 7c9c2fd..ab6b2bf 100644 --- a/copanier/templates/delivery/show_delivery.html +++ b/copanier/templates/delivery/show_delivery.html @@ -48,6 +48,8 @@
Tu es la personne contact pour l'organisation de cette distribution, merci :-) Pour t'aider, tu peux accéder à  la boîte à outils ! + +{% if delivery.status == delivery.CLOSED %}

La distribution est maintenant terminée. C'est le moment de passer le relai, merci !

{% endif %}
{% endif %} {% if delivery.has_products %} diff --git a/copanier/templates/emails/handover_delivery.html b/copanier/templates/emails/handover_delivery.html new file mode 100644 index 0000000..0506c9d --- /dev/null +++ b/copanier/templates/emails/handover_delivery.html @@ -0,0 +1,37 @@ +

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 :

+ + + +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.

    + +

    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 ?DatesCoordinatrice⋅eurRé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 prixDu {{ 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
    AjustementsDu {{ delivery.dates.order_before | date }} au {{ delivery.dates.adjustment_deadline | date }}S'assurer que les ajustements sont bien faits par les participant⋅e⋅sFaire les ajustements à la main si besoin
    ApprovisionnementsDu {{ delivery.dates.adjustment_deadline | date }} au {{ delivery.dates.delivery_date | date }}Envoyer les infos de commande aux référent⋅e⋅sFaire les commandes aux producteurs⋅rices, récupérer les produits
    Préparation de la distributionLa 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èquesArriver 30mn avant le début de la distribution, répartir les produits par coloc
    TransmissionAprès la distributionPasser le relai à la nouvelle personne référente
    \ No newline at end of file diff --git a/copanier/templates/includes/delivery_table.html b/copanier/templates/includes/delivery_table.html index f4fa7f4..e8ce4d2 100644 --- a/copanier/templates/includes/delivery_table.html +++ b/copanier/templates/includes/delivery_table.html @@ -14,7 +14,7 @@ {% endif %} -
    {% if producer_obj.description %}{{ producer_obj.description }}{% endif %}Référent⋅e : {{ producer_obj.referent_name }} / {{ producer_obj.referent_tel }}. +
    {% if producer_obj.description %}{{ producer_obj.description }}. {% endif %}Référent⋅e : {{ producer_obj.referent_name }} / {{ producer_obj.referent_tel }}. {% if not edit_mode and producer_obj.has_rupture_products(delivery) %}

    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)