From d87efdbe7ced9b5afad170fe090a5d2fbd4a716e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Wed, 7 Apr 2021 23:17:53 +0200 Subject: [PATCH 1/2] Facilitate the transmission of information at the end of a delivery. This is made in order to have moving reponsabilities, and avoid having people taking too much responsability. --- .gitignore | 3 +- copanier/config.py | 1 - copanier/emails.py | 7 ++- copanier/static/app.css | 4 ++ .../templates/delivery/handover_delivery.html | 61 +++++++++++++++++++ .../templates/delivery/show_delivery.html | 2 + .../templates/emails/handover_delivery.html | 37 +++++++++++ .../templates/emails/handover_delivery.txt | 30 +++++++++ .../includes/delivery_dates_table.html | 57 +++++++++++++++++ .../templates/includes/delivery_table.html | 2 +- .../templates/includes/order_summary.html | 2 +- copanier/views/delivery.py | 55 +++++++++++++++-- 12 files changed, 249 insertions(+), 12 deletions(-) create mode 100644 copanier/templates/delivery/handover_delivery.html create mode 100644 copanier/templates/emails/handover_delivery.html create mode 100644 copanier/templates/emails/handover_delivery.txt create mode 100644 copanier/templates/includes/delivery_dates_table.html 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 %} +
+{% 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) From d175e8d6e317a646e0ca92ce495800cfad342fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Sat, 10 Apr 2021 11:48:45 +0200 Subject: [PATCH 2/2] Add missing files for delivery transmission --- copanier/models.py | 4 ++ copanier/static/app.css | 8 +++ .../templates/delivery/show_delivery.html | 6 ++- copanier/templates/delivery/show_toolbox.html | 52 +------------------ .../templates/emails/handover_delivery.html | 36 ++++++++----- .../templates/emails/handover_delivery.txt | 36 +++++++++---- .../templates/includes/delivery_progress.html | 4 +- .../templates/includes/delivery_status.html | 1 + copanier/views/delivery.py | 5 ++ 9 files changed, 76 insertions(+), 76 deletions(-) diff --git a/copanier/models.py b/copanier/models.py index bd4bdaf..ceb6b96 100644 --- a/copanier/models.py +++ b/copanier/models.py @@ -319,6 +319,7 @@ class Delivery(PersistedBase): OPEN = 2 ADJUSTMENT = 3 WAITING_PRODUCTS = 4 + OVER = 5 name: str from_date: datetime_field @@ -332,6 +333,7 @@ class Delivery(PersistedBase): producers: Dict[str, Producer] = field(default_factory=dict) orders: Dict[str, Order] = field(default_factory=dict) shipping: Dict[str, price_field] = field(default_factory=dict) + over: bool = False def __post_init__(self): self.id = None # Not a field because we don't want to persist it. @@ -339,6 +341,8 @@ class Delivery(PersistedBase): @property def status(self): + if self.over: + return self.OVER if not self.products: return self.EMPTY if self.products_need_price_update(): diff --git a/copanier/static/app.css b/copanier/static/app.css index bfa6ae7..41985a2 100644 --- a/copanier/static/app.css +++ b/copanier/static/app.css @@ -788,4 +788,12 @@ small { #instructions { height: 100px; +} + +.important-message { + padding: 1em; + text-align: center; + + background-color: rgba(233, 161, 28, 0.2); + border: 2px black dashed; } \ No newline at end of file diff --git a/copanier/templates/delivery/show_delivery.html b/copanier/templates/delivery/show_delivery.html index ab6b2bf..1f118d4 100644 --- a/copanier/templates/delivery/show_delivery.html +++ b/copanier/templates/delivery/show_delivery.html @@ -2,6 +2,11 @@ {% block is_wide %}{% endblock %} {% block body %} +{% if delivery.status == delivery.CLOSED %} +
    Une fois la distribution terminée, reviens ici pour passer le relai !
    +{% endif %} + +

    {{ delivery.name }}

    {% include "includes/delivery_progress.html" %} @@ -49,7 +54,6 @@ 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/delivery/show_toolbox.html b/copanier/templates/delivery/show_toolbox.html index fe7ce26..81eadae 100644 --- a/copanier/templates/delivery/show_toolbox.html +++ b/copanier/templates/delivery/show_toolbox.html @@ -12,57 +12,7 @@ {% include "includes/delivery_head.html" %}

    Rappel des dates

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    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 }}Coordoner la distribution, faire la répartition des chèquesArriver 30mn avant le début de la distribution, répartir les produits par coloc
    +{% include "includes/delivery_dates_table.html" %}

    Emails des référent⋅e⋅s

    Ça peut être utile pour leur envoyer un email groupé.

    diff --git a/copanier/templates/emails/handover_delivery.html b/copanier/templates/emails/handover_delivery.html index 0506c9d..020e6af 100644 --- a/copanier/templates/emails/handover_delivery.html +++ b/copanier/templates/emails/handover_delivery.html @@ -2,25 +2,18 @@

    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 :-)

    +

    Voici donc quelques infos !

    -{% if email_body %} -

    Elle vous a même laissé un petit message :

    - -

    {{ email_body}}

    - -{% endif %} - -

    Voici les informations renseignées :

    +

    Infos de distrib

    • Nom : {{ delivery.name }}
    • Date et heure : {{ delivery.from_date|date }} de {{ delivery.from_date|time }} à {{ delivery.to_date|time }}.
    • -
    • Lieu : {{ delivery.location }}
    • +
    • Lieu : {{ delivery.where }}
    • Commandes avant le {{ delivery.order_before|date }}
    -Référent·es produits : +

    Référent·es produits

      @@ -29,8 +22,27 @@ Référent·es produits :
    • {{ producer.name }} : {{ producer.referent_name }} - {{ producer.referent }} - {{ producer.referent_tel }}
    • {% endfor %} +

      Liens utiles

      + -

      Si vous avez besoin de modifier ces informations, vous pouvez le faire en suivant ce lien.

      +

      Au cas où, voici les contacts de dernière personne référente : mail {{ old_delivery.contact }}, tel {{ old_delivery.contact_phone }}

      + +{% if email_body %} +

      Elle vous a même laissé un petit message :

      +
      + +

      {{ email_body}}

      + +
      +{% endif %} + +

      Rappel des dates

      + +

      (Les dates sont calculées en fonction de ce qui à été renseigné)

      +{% include "includes/delivery_dates_table.html" %}

      Bonne journée,

      diff --git a/copanier/templates/emails/handover_delivery.txt b/copanier/templates/emails/handover_delivery.txt index 52a38c7..d70b78e 100644 --- a/copanier/templates/emails/handover_delivery.txt +++ b/copanier/templates/emails/handover_delivery.txt @@ -2,29 +2,45 @@ 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 :-) +Voici donc quelques infos ! -{% if email_body %} -Elle vous a même laissé un petit message : {{ email_body }} - -{% endif %} -Voici les informations renseignées : +Info de distrib +——————————————— Nom : {{ delivery.name }} Date et heure : {{ delivery.from_date|date }} de {{ delivery.from_date|time }} à {{ delivery.to_date|time }}. -Lieu : {{ delivery.location }} +Lieu : {{ delivery.where }} Commandes avant le {{ delivery.order_before|date }}. -Référent·es produits : +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 : +Liens utiles +———————————— - {{ url_for('show_delivery', id=delivery.id) }} +- Distribution : {{ url_for('show_delivery', id=delivery.id) }} +- Boîte à outils : {{ url_for('show_delivery_toolbox', id=delivery.id) }} (avec un rappel des dates) +Au cas où, voici les contacts de dernière personne référente : + +- mail {{ old_delivery.contact }} +- tel {{ old_delivery.contact_phone }} + +{% if email_body %} + +Elle vous a même laissé un petit message : + +———— + +{{ email_body}} + +———— + +{% endif %} Bonne journée, {{ config.EMAIL_SIGNATURE }} diff --git a/copanier/templates/includes/delivery_progress.html b/copanier/templates/includes/delivery_progress.html index af4d04d..8c03e73 100644 --- a/copanier/templates/includes/delivery_progress.html +++ b/copanier/templates/includes/delivery_progress.html @@ -4,7 +4,7 @@
    • Commande
    • Ajustements
    • Récupération des commandes
    • -
    • Distribution
    • -
    • Répartition des paiements
    • +
    • Distribution
    • +
    • Répartition des paiements
    \ No newline at end of file diff --git a/copanier/templates/includes/delivery_status.html b/copanier/templates/includes/delivery_status.html index b0707d0..3fbcbe6 100644 --- a/copanier/templates/includes/delivery_status.html +++ b/copanier/templates/includes/delivery_status.html @@ -1,5 +1,6 @@ {% if delivery.status == delivery.OPEN %}Commandes ouvertes jusqu'au {{ delivery.order_before|date }} {% elif delivery.status == delivery.ADJUSTMENT %}Ajustements en cours {% elif delivery.status == delivery.CLOSED %}Fermée +{% elif delivery.status == delivery.OVER %}Terminée {% elif delivery.status == delivery.NEED_PRICE_UPDATE %}Mise à jour des prix* {% endif %} \ No newline at end of file diff --git a/copanier/views/delivery.py b/copanier/views/delivery.py index 8f0e4bf..96f43f7 100644 --- a/copanier/views/delivery.py +++ b/copanier/views/delivery.py @@ -78,6 +78,10 @@ async def hand_over_delivery_post(request, response, id): new_delivery.producers[producer_id] = producer new_delivery.persist() + # Mark the old delivery as over. + old_delivery.over = True + old_delivery.persist() + emails.send_from_template( env, "handover_delivery", @@ -88,6 +92,7 @@ async def hand_over_delivery_post(request, response, id): email_body = form.get('email_body'), hostname=request.host, url_for=app.url_for, + old_delivery=old_delivery ) response.message("La distribution à bien été créée et le mail envoyé, merci !")