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

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"
)
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})

View file

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

View file

@ -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 %}
<p>Vue d'organisation de la commande groupée {{ grouped_order.id }}, avec les produits commandés et les commandes individuelles</p>
<br>
<p>{{ grouped_order }}
<p>Organisateur·ice : {{ grouped_order.orga }}</p>
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
<div class="buttons">
<a class="button is-primary is-light" href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a>
</div>
<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 limite de commande : {{ grouped_order.deadline }}</p>
<a class="button is-primary is-light" href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a>
</div>
</div>
</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 %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.price }} €</td>
<td>{{ item.ordered_nb }}</td>
<td>{{ item.get_total_price }} €</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<th>Total pour la commande groupée</th>
<th></th>
<th></th>
<th>{{ grouped_order.total_price }} €</th>
</tfoot>
</table>
</div>
les produits commandés pour cette commande groupée :
<ul>
{% for item in grouped_order.item_set.all %}
<li>
{{ item }}, avec {{ item.ordered_nb }} commande{{ item.ordered_nb|pluralize }}
</li>
{% endfor %}
</ul>
les commandes passées pour cette commande groupée :
<ul>
{% for order in grouped_order.order_set.all %}
<li>
{{ order }} : {{ order.articles_nb }} : order_id = {{ order.id }}
</li>
{% endfor %}
</ul>
<a href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a>
<div class="box">
<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 %}
<tr>
<td>{{ order.author }}</td>
<td>{{ order.price }} €</td>
<td><a href="mailto:{{ order.author.email }}">{{ order.author.email }}</a></td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<th>Total pour la commande groupée</th>
<th>{{ grouped_order.total_price }} €</th>
<th></th>
</tfoot>
</table>
</div>
{% endblock %}

View file

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

View file

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