From 539410ba66184335326217b278eb7ed4657adcec Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Mon, 15 May 2023 14:47:09 +0200 Subject: [PATCH] overview page --- la_chariotte/order/admin.py | 3 +- ...der_total_price_alter_orderauthor_email.py | 25 +++++ la_chariotte/order/models.py | 15 ++- .../templates/order/grouped_order_detail.html | 2 - .../order/grouped_order_overview.html | 104 +++++++++++++----- la_chariotte/order/tests/test_views.py | 3 + la_chariotte/order/views.py | 8 +- 7 files changed, 126 insertions(+), 34 deletions(-) create mode 100644 la_chariotte/order/migrations/0020_groupedorder_total_price_alter_orderauthor_email.py diff --git a/la_chariotte/order/admin.py b/la_chariotte/order/admin.py index 5aab8b9..8182731 100644 --- a/la_chariotte/order/admin.py +++ b/la_chariotte/order/admin.py @@ -1,8 +1,9 @@ from django.contrib import admin -from .models import GroupedOrder, Item, Order, OrderedItem +from .models import GroupedOrder, Item, Order, OrderAuthor, OrderedItem admin.site.register(GroupedOrder) admin.site.register(Order) admin.site.register(Item) admin.site.register(OrderedItem) +admin.site.register(OrderAuthor) diff --git a/la_chariotte/order/migrations/0020_groupedorder_total_price_alter_orderauthor_email.py b/la_chariotte/order/migrations/0020_groupedorder_total_price_alter_orderauthor_email.py new file mode 100644 index 0000000..a2398f6 --- /dev/null +++ b/la_chariotte/order/migrations/0020_groupedorder_total_price_alter_orderauthor_email.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2 on 2023-05-15 12:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("order", "0019_order_price"), + ] + + operations = [ + migrations.AddField( + model_name="groupedorder", + name="total_price", + field=models.DecimalField(decimal_places=2, default=0, max_digits=10), + ), + migrations.AlterField( + model_name="orderauthor", + name="email", + field=models.CharField( + help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin", + verbose_name="Adresse mail", + ), + ), + ] diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 25fb651..622cd01 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -19,10 +19,18 @@ class GroupedOrder(models.Model): max_length=100, null=True, blank=True, verbose_name="Lieu de livraison" ) description = models.TextField("Description", null=True, blank=True) + total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) class Meta: unique_together = ["delivery_date", "name", "orga"] + def compute_total_price(self): + price = 0 + for order in self.order_set.all(): + price += order.price + self.total_price = price + self.save() + def is_ongoing(self): """Returns True if the grouped order is open for new Orders - False if it's too late""" return self.deadline >= timezone.now() @@ -66,7 +74,8 @@ class OrderAuthor(models.Model): help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin", ) email = models.CharField( - verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin" + verbose_name="Adresse mail", + help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin", ) def __str__(self): # pragma: no cover @@ -95,6 +104,10 @@ class Item(models.Model): ordered_nb = models.IntegerField(default=0) + def get_total_price(self): + """Returns the price of all orders on this item""" + return self.price * self.ordered_nb + def get_absolute_url(self): return reverse("order:manage_items", kwargs={"pk": self.grouped_order.pk}) diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index b3f3c50..b9af304 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -44,7 +44,6 @@ Produit Prix unitaire Quantité - Total @@ -54,7 +53,6 @@ {{ item.name }} {{ item.price }} € - Total pour ce produit {% endfor %} diff --git a/la_chariotte/order/templates/order/grouped_order_overview.html b/la_chariotte/order/templates/order/grouped_order_overview.html index 664aeb5..168cda4 100644 --- a/la_chariotte/order/templates/order/grouped_order_overview.html +++ b/la_chariotte/order/templates/order/grouped_order_overview.html @@ -1,33 +1,83 @@ {% extends 'base.html' %} -{% block title %}{{ grouped_order }} - Organisateur·ice{% endblock %} +{% block title %}{{ grouped_order }} - Gestion{% endblock %} + +{% block content_title %}{{ grouped_order }} : gestion de la commande{% endblock %} {% block content %} -

Vue d'organisation de la commande groupée {{ grouped_order.id }}, avec les produits commandés et les commandes individuelles

-
-

{{ grouped_order }} -

Organisateur·ice : {{ grouped_order.orga }}

-

Date de livraison : {{ grouped_order.delivery_date }}

-

Date limite de commande : {{ grouped_order.deadline }}

- {% if grouped_order.description %}

{{ grouped_order.description }}

{% endif %} +
+ Retour à la page de commande +
+
+
+
+

{{ grouped_order }}

+ {% if grouped_order.description %}

{{ grouped_order.description }}

{% endif %} +
+
+ {% if grouped_order.place %} +

Lieu : {{ grouped_order.place }}

+ {% endif %} +

Date de livraison : {{ grouped_order.delivery_date }}

+

Date limite de commande : {{ grouped_order.deadline }}

+ Retour à la page de commande +
+
+
+
+

Produits commandés

+ + + + + + + + + + + {% for item in grouped_order.item_set.all %} + + + + + + + {% endfor %} + + + + + + + +
ProduitPrix unitaireQuantitéTotal
{{ item.name }}{{ item.price }} €{{ item.ordered_nb }}{{ item.get_total_price }} €
Total pour la commande groupée{{ grouped_order.total_price }} €
+
- les produits commandés pour cette commande groupée : - - - les commandes passées pour cette commande groupée : - - - Retour à la page de commande +
+

Liste des commandes

+ + + + + + + + + + {% for order in grouped_order.order_set.all %} + + + + + + {% endfor %} + + + + + + +
Participant·eMontantContact
{{ order.author }}{{ order.price }} €{{ order.author.email }}
Total pour la commande groupée{{ grouped_order.total_price }} €
+
{% endblock %} \ No newline at end of file diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 4b7cc66..dfbc8ba 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -260,11 +260,14 @@ class TestGroupedOrderDetailView: item.refresh_from_db() item2.refresh_from_db() assert OrderAuthor.objects.first().first_name == "Prénom" + assert OrderAuthor.objects.first().email == "test@mail.fr" + assert OrderAuthor.objects.first().phone == "0645632569" assert item.ordered_nb == 4 assert item2.ordered_nb == 1 order = Order.objects.first() assert order.ordered_items.count() == 2 assert order.articles_nb == 5 + assert order.grouped_order.total_price == 9 def test_order_item__no_articles_ordered(self, client, other_user): """ diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 9ab3602..175591e 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -133,8 +133,9 @@ def order(request, grouped_order_id): last_name = request.POST["last_name"] phone = request.POST["phone"] email = request.POST["email"] - # selected_item = grouped_order.item_set.get(pk=request.POST["item"]) - author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name) + author = OrderAuthor.objects.create( + first_name=first_name, last_name=last_name, email=email, phone=phone + ) order = Order.objects.create(author=author, grouped_order=grouped_order) for k, v in orders_dict.items(): if v == "": @@ -144,7 +145,6 @@ def order(request, grouped_order_id): OrderedItem.objects.create(nb=v, order=order, item=item) compute_ordered_nb(item) compute_order_articles_nb(order) - compute_order_price(order) if order.articles_nb == 0: # Redisplay the order form for this grouped order. return render( @@ -156,6 +156,8 @@ def order(request, grouped_order_id): }, ) else: + compute_order_price(order) + order.grouped_order.compute_total_price() # Always return an HttpResponseRedirect after successfully dealing # with POST data. This prevents data from being posted twice if a # user hits the Back button.