les commandes groupées sont listées selon leurs dates

This commit is contained in:
Laetitia Getti 2023-03-23 18:00:00 +01:00
parent 95a0e3fcdd
commit d4872c372e
6 changed files with 142 additions and 7 deletions

View file

@ -0,0 +1,20 @@
# Generated by Django 4.1.7 on 2023-03-23 14:38
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('order', '0007_alter_ordereditem_item_alter_ordereditem_order'),
]
operations = [
migrations.AddField(
model_name='grouped_order',
name='deadline',
field=models.DateTimeField(default=datetime.datetime(2023, 3, 23, 14, 38, 17, 365192, tzinfo=datetime.timezone.utc), verbose_name='Date limite de commande'),
preserve_default=False,
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 4.1.7 on 2023-03-23 17:11
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('order', '0008_grouped_order_deadline'),
]
operations = [
migrations.RenameField(
model_name='grouped_order',
old_name='date',
new_name='delivery_date',
),
]

View file

@ -7,7 +7,7 @@ from django.utils import timezone
class Grouped_order(models.Model):
name = models.CharField(max_length=100, null=True) # optionnal
orga = models.CharField(max_length=100) # a changer, utiliser ForeignKey de user
date = models.DateField('Date de livraison')
delivery_date = models.DateField('Date de livraison')
deadline = models.DateTimeField('Date limite de commande')
def is_ongoing(self):

View file

@ -8,16 +8,40 @@
<p>Index des commandes que l'utilisateur·ice connecté·e organise</p>
<p>Pour l'instant, index de toutes les commandes groupées qui existent</p>
{% if grouped_order_list %}
{% if grouped_order_list.incoming_grouped_orders or grouped_order_list.orders_over_grouped_orders or grouped_order_list.old_grouped_orders %}
{% if grouped_order_list.incoming_grouped_orders %}
<p>Commandes groupées à venir :</p>
<ul>
{% for gr_order in grouped_order_list %}
{% for gr_order in grouped_order_list.incoming_grouped_orders %}
<li>
<a href="{% url 'order:grouped_order_detail' gr_order.id %}"
>Commande groupée {{ gr_order.id }} organisée par {{ gr_order.orga }}</a
>
>{{gr_order.name}}</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% if grouped_order_list.orders_over_grouped_orders %}
<p>Livraison à venir, date limite de commande dépassée :</p>
<ul>
{% for gr_order in grouped_order_list.orders_over_grouped_orders %}
<li>
<a href="{% url 'order:grouped_order_detail' gr_order.id %}"
>{{gr_order.name}}</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% if grouped_order_list.old_grouped_orders %}
<p>Livraison passée :</p>
<ul>
{% for gr_order in grouped_order_list.old_grouped_orders %}
<li>
<a href="{% url 'order:grouped_order_detail' gr_order.id %}"
>{{gr_order.name}}</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% else %}
<p>Pas de commande groupée pour l'instant</p>
{% endif %}

View file

@ -1,10 +1,22 @@
import datetime
from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
from .models import Grouped_order
def create_grouped_order(days_before_delivery_date,days_before_deadline,name):
"""
Create a question with the given `question_text` and published the
given number of `days` offset to now (negative for questions published
in the past, positive for questions that have yet to be published).
"""
date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date)
deadline = timezone.now() + datetime.timedelta(days=days_before_deadline)
return Grouped_order.objects.create(name=name, orga="test orga",delivery_date=date,deadline=deadline)
class GroupedOrderModelTests(TestCase):
def test_is_ongoing_with_ongoing_grouped_order(self):
@ -23,3 +35,58 @@ class GroupedOrderModelTests(TestCase):
ongoing_gr_order = Grouped_order(deadline=deadline)
self.assertIs(ongoing_gr_order.is_ongoing(), False)
class GroupedOrderIndexViewTests(TestCase):
def test_no_grouped_orders(self):
"""
If no grouped order exist, an appropriate message is displayed
"""
response = self.client.get(reverse('order:index'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Pas de commande groupée pour l'instant")
self.assertQuerysetEqual(response.context['grouped_order_list']['old_grouped_orders'], [])
self.assertQuerysetEqual(response.context['grouped_order_list']['orders_over_grouped_orders'], [])
self.assertQuerysetEqual(response.context['grouped_order_list']['incoming_grouped_orders'], [])
def test_grouped_orders_in_right_section(self):
"""
According to their delivery date and deadline, grouped orders are placed in correct section
"""
future_grouped_order = create_grouped_order(days_before_delivery_date=5,days_before_deadline=2,name="future")
crossed_deadline_gr_order = create_grouped_order(days_before_delivery_date=2, days_before_deadline=-1,name="crossed deadline")
passed_deadline_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="passée")
response = self.client.get(reverse('order:index'))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, "Pas de commande groupée pour l'instant")
self.assertContains(response, "Commandes groupées à venir")
self.assertContains(response, "Livraison à venir")
self.assertContains(response, "Livraison passée")
self.assertIs(len(response.context['grouped_order_list']['old_grouped_orders']), 1)
self.assertIs(len(response.context['grouped_order_list']['orders_over_grouped_orders']), 1)
self.assertIs(len(response.context['grouped_order_list']['incoming_grouped_orders']), 1)
def test_grouped_orders_in_right_section__with_only_passed(self):
"""
According to their delivery date and deadline, grouped orders are placed in correct section
"""
passed_deadline_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="passée")
response = self.client.get(reverse('order:index'))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, "Pas de commande groupée pour l'instant")
self.assertNotContains(response, "Commandes groupées à venir")
self.assertNotContains(response, "Livraison à venir")
self.assertContains(response, "Livraison passée")
self.assertIs(len(response.context['grouped_order_list']['old_grouped_orders']), 1)
def test_grouped_orders_in_right_section__with_only_future(self):
"""
According to their delivery date and deadline, grouped orders are placed in correct section
"""
future_grouped_order = create_grouped_order(days_before_delivery_date=5,days_before_deadline=2,name="future")
response = self.client.get(reverse('order:index'))
self.assertEqual(response.status_code, 200)
self.assertNotContains(response, "Pas de commande groupée pour l'instant")
self.assertNotContains(response, "Commandes groupées à venir")
self.assertContains(response, "Livraison à venir")
self.assertNotContains(response, "Livraison passée")
self.assertIs(len(response.context['grouped_order_list']['incoming_grouped_orders']), 1)

View file

@ -1,6 +1,7 @@
from django.shortcuts import render, get_object_or_404, get_list_or_404
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.urls import reverse
from django.utils import timezone
from django.views import generic
from .models import Grouped_order, Item, Order, OrderedItem
@ -12,8 +13,13 @@ class IndexView(generic.ListView):
context_object_name = 'grouped_order_list'
def get_queryset(self):
"""Return some 10 grouped orders.""" # changer envoyer les plus proches d'aujourd'hui dans le futur
return Grouped_order.objects.order_by('-date')[:10]
"""Return the 5 most recent old grouped orders"""
old_grouped_orders = Grouped_order.objects.filter(delivery_date__lt=timezone.now().date()).order_by("-delivery_date")[:5] # delivery date < today (delivered)
"""Return all grouped orders, for which we cannot order anymore but the delivery date is still to come"""
orders_over_grouped_orders = Grouped_order.objects.filter(delivery_date__gte=timezone.now().date()).filter(deadline__lt=timezone.now()).order_by("-delivery_date") # delivery date >= today (not delivered) and deadline < today (we cannot order)
"""Return all incoming grouped orders"""
incoming_grouped_orders = Grouped_order.objects.filter(deadline__gte=timezone.now()).order_by("deadline") # dealine >= today (we can still order)
return {'old_grouped_orders': old_grouped_orders,'orders_over_grouped_orders': orders_over_grouped_orders,'incoming_grouped_orders': incoming_grouped_orders}
class GroupedOrderDetailView(generic.DetailView):