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): class Grouped_order(models.Model):
name = models.CharField(max_length=100, null=True) # optionnal name = models.CharField(max_length=100, null=True) # optionnal
orga = models.CharField(max_length=100) # a changer, utiliser ForeignKey de user 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') deadline = models.DateTimeField('Date limite de commande')
def is_ongoing(self): def is_ongoing(self):

View file

@ -8,16 +8,40 @@
<p>Index des commandes que l'utilisateur·ice connecté·e organise</p> <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> <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> <ul>
{% for gr_order in grouped_order_list %} {% for gr_order in grouped_order_list.incoming_grouped_orders %}
<li> <li>
<a href="{% url 'order:grouped_order_detail' gr_order.id %}" <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> </li>
{% endfor %} {% endfor %}
</ul> </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 %} {% else %}
<p>Pas de commande groupée pour l'instant</p> <p>Pas de commande groupée pour l'instant</p>
{% endif %} {% endif %}

View file

@ -1,10 +1,22 @@
import datetime import datetime
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from .models import Grouped_order 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): class GroupedOrderModelTests(TestCase):
def test_is_ongoing_with_ongoing_grouped_order(self): def test_is_ongoing_with_ongoing_grouped_order(self):
@ -23,3 +35,58 @@ class GroupedOrderModelTests(TestCase):
ongoing_gr_order = Grouped_order(deadline=deadline) ongoing_gr_order = Grouped_order(deadline=deadline)
self.assertIs(ongoing_gr_order.is_ongoing(), False) 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.shortcuts import render, get_object_or_404, get_list_or_404
from django.http import HttpResponse, Http404, HttpResponseRedirect from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from django.views import generic from django.views import generic
from .models import Grouped_order, Item, Order, OrderedItem from .models import Grouped_order, Item, Order, OrderedItem
@ -12,8 +13,13 @@ class IndexView(generic.ListView):
context_object_name = 'grouped_order_list' context_object_name = 'grouped_order_list'
def get_queryset(self): def get_queryset(self):
"""Return some 10 grouped orders.""" # changer envoyer les plus proches d'aujourd'hui dans le futur """Return the 5 most recent old grouped orders"""
return Grouped_order.objects.order_by('-date')[:10] 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): class GroupedOrderDetailView(generic.DetailView):