mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-02 20:01:51 +02:00
overview page
This commit is contained in:
parent
141a2dd2b1
commit
539410ba66
7 changed files with 126 additions and 34 deletions
|
@ -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)
|
||||
|
|
|
@ -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",
|
||||
),
|
||||
),
|
||||
]
|
|
@ -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})
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue