mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-03 04:11:52 +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 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)
|
||||||
|
|
|
@ -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"
|
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})
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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">
|
||||||
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
|
<div class="columns">
|
||||||
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
|
<div class="column is-8">
|
||||||
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
|
<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 :
|
<div class="box">
|
||||||
<ul>
|
<p class="title">Liste des commandes</p>
|
||||||
{% for item in grouped_order.item_set.all %}
|
<table class="table">
|
||||||
<li>
|
<thead>
|
||||||
{{ item }}, avec {{ item.ordered_nb }} commande{{ item.ordered_nb|pluralize }}
|
<tr>
|
||||||
</li>
|
<th>Participant·e</th>
|
||||||
{% endfor %}
|
<th>Montant</th>
|
||||||
</ul>
|
<th>Contact</th>
|
||||||
|
</tr>
|
||||||
les commandes passées pour cette commande groupée :
|
</thead>
|
||||||
<ul>
|
<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>
|
||||||
{% endfor %}
|
<td><a href="mailto:{{ order.author.email }}">{{ order.author.email }}</a></td>
|
||||||
</ul>
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
<a href={% url 'order:grouped_order_detail' grouped_order.id %}>Retour à la page de commande</a>
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<th>Total pour la commande groupée</th>
|
||||||
|
<th>{{ grouped_order.total_price }} €</th>
|
||||||
|
<th></th>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue