overview page

This commit is contained in:
Laetitia Getti 2023-05-15 14:47:09 +02:00
parent 141a2dd2b1
commit 539410ba66
7 changed files with 126 additions and 34 deletions

View file

@ -1,8 +1,9 @@
from django.contrib import admin 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(GroupedOrder)
admin.site.register(Order) admin.site.register(Order)
admin.site.register(Item) admin.site.register(Item)
admin.site.register(OrderedItem) admin.site.register(OrderedItem)
admin.site.register(OrderAuthor)

View file

@ -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",
),
),
]

View file

@ -19,10 +19,18 @@ class GroupedOrder(models.Model):
max_length=100, null=True, blank=True, verbose_name="Lieu de livraison" max_length=100, null=True, blank=True, verbose_name="Lieu de livraison"
) )
description = models.TextField("Description", null=True, blank=True) description = models.TextField("Description", null=True, blank=True)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
class Meta: class Meta:
unique_together = ["delivery_date", "name", "orga"] 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): def is_ongoing(self):
"""Returns True if the grouped order is open for new Orders - False if it's too late""" """Returns True if the grouped order is open for new Orders - False if it's too late"""
return self.deadline >= timezone.now() 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", help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
) )
email = models.CharField( 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 def __str__(self): # pragma: no cover
@ -95,6 +104,10 @@ class Item(models.Model):
ordered_nb = models.IntegerField(default=0) 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): def get_absolute_url(self):
return reverse("order:manage_items", kwargs={"pk": self.grouped_order.pk}) return reverse("order:manage_items", kwargs={"pk": self.grouped_order.pk})

View file

@ -44,7 +44,6 @@
<th>Produit</th> <th>Produit</th>
<th>Prix unitaire</th> <th>Prix unitaire</th>
<th>Quantité</th> <th>Quantité</th>
<th>Total</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -54,7 +53,6 @@
<td>{{ item.name }}</td> <td>{{ item.name }}</td>
<td>{{ item.price }} €</td> <td>{{ item.price }} €</td>
<td><input name="quantity_{{ item.id }}" size="2" type="number" value="0" min="0"></input></td> <td><input name="quantity_{{ item.id }}" size="2" type="number" value="0" min="0"></input></td>
<td>Total pour ce produit</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View file

@ -1,33 +1,83 @@
{% extends 'base.html' %} {% 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 %} {% block content %}
<p>Vue d'organisation de la commande groupée {{ grouped_order.id }}, avec les produits commandés et les commandes individuelles</p> <div class="buttons">
<br> <a class="button is-primary is-light" href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a>
<p>{{ grouped_order }} </div>
<p>Organisateur·ice : {{ grouped_order.orga }}</p> <div class="box">
<div class="columns">
<div class="column is-8">
<p class="title">{{ grouped_order }}</p>
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
</div>
<div class="column">
{% if grouped_order.place %}
<p>Lieu : {{ grouped_order.place }}</p>
{% endif %}
<p>Date de livraison : {{ grouped_order.delivery_date }}</p> <p>Date de livraison : {{ grouped_order.delivery_date }}</p>
<p>Date limite de commande : {{ grouped_order.deadline }}</p> <p>Date limite de commande : {{ grouped_order.deadline }}</p>
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %} <a class="button is-primary is-light" href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a>
</div>
les produits commandés pour cette commande groupée : </div>
<ul> </div>
<div class="box">
<p class="title">Produits commandés</p>
<table class="table">
<thead>
<tr>
<th>Produit</th>
<th>Prix unitaire</th>
<th>Quantité</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{% for item in grouped_order.item_set.all %} {% for item in grouped_order.item_set.all %}
<li> <tr>
{{ item }}, avec {{ item.ordered_nb }} commande{{ item.ordered_nb|pluralize }} <td>{{ item.name }}</td>
</li> <td>{{ item.price }} €</td>
<td>{{ item.ordered_nb }}</td>
<td>{{ item.get_total_price }} €</td>
</tr>
{% endfor %} {% endfor %}
</ul> </tbody>
<tfoot>
<th>Total pour la commande groupée</th>
<th></th>
<th></th>
<th>{{ grouped_order.total_price }} €</th>
</tfoot>
</table>
</div>
les commandes passées pour cette commande groupée : <div class="box">
<ul> <p class="title">Liste des commandes</p>
<table class="table">
<thead>
<tr>
<th>Participant·e</th>
<th>Montant</th>
<th>Contact</th>
</tr>
</thead>
<tbody>
{% for order in grouped_order.order_set.all %} {% for order in grouped_order.order_set.all %}
<li> <tr>
{{ order }} : {{ order.articles_nb }} : order_id = {{ order.id }} <td>{{ order.author }}</td>
</li> <td>{{ order.price }} €</td>
<td><a href="mailto:{{ order.author.email }}">{{ order.author.email }}</a></td>
</tr>
{% endfor %} {% endfor %}
</ul> </tbody>
<tfoot>
<a href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a> <th>Total pour la commande groupée</th>
<th>{{ grouped_order.total_price }} €</th>
<th></th>
</tfoot>
</table>
</div>
{% endblock %} {% endblock %}

View file

@ -260,11 +260,14 @@ class TestGroupedOrderDetailView:
item.refresh_from_db() item.refresh_from_db()
item2.refresh_from_db() item2.refresh_from_db()
assert OrderAuthor.objects.first().first_name == "Prénom" 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 item.ordered_nb == 4
assert item2.ordered_nb == 1 assert item2.ordered_nb == 1
order = Order.objects.first() order = Order.objects.first()
assert order.ordered_items.count() == 2 assert order.ordered_items.count() == 2
assert order.articles_nb == 5 assert order.articles_nb == 5
assert order.grouped_order.total_price == 9
def test_order_item__no_articles_ordered(self, client, other_user): def test_order_item__no_articles_ordered(self, client, other_user):
""" """

View file

@ -133,8 +133,9 @@ def order(request, grouped_order_id):
last_name = request.POST["last_name"] last_name = request.POST["last_name"]
phone = request.POST["phone"] phone = request.POST["phone"]
email = request.POST["email"] email = request.POST["email"]
# selected_item = grouped_order.item_set.get(pk=request.POST["item"]) author = OrderAuthor.objects.create(
author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name) first_name=first_name, last_name=last_name, email=email, phone=phone
)
order = Order.objects.create(author=author, grouped_order=grouped_order) order = Order.objects.create(author=author, grouped_order=grouped_order)
for k, v in orders_dict.items(): for k, v in orders_dict.items():
if v == "": if v == "":
@ -144,7 +145,6 @@ def order(request, grouped_order_id):
OrderedItem.objects.create(nb=v, order=order, item=item) OrderedItem.objects.create(nb=v, order=order, item=item)
compute_ordered_nb(item) compute_ordered_nb(item)
compute_order_articles_nb(order) compute_order_articles_nb(order)
compute_order_price(order)
if order.articles_nb == 0: if order.articles_nb == 0:
# Redisplay the order form for this grouped order. # Redisplay the order form for this grouped order.
return render( return render(
@ -156,6 +156,8 @@ def order(request, grouped_order_id):
}, },
) )
else: else:
compute_order_price(order)
order.grouped_order.compute_total_price()
# Always return an HttpResponseRedirect after successfully dealing # Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a # with POST data. This prevents data from being posted twice if a
# user hits the Back button. # user hits the Back button.