From d4872c372e63a12122bba06fd6bdcc5355f26f92 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 23 Mar 2023 18:00:00 +0100 Subject: [PATCH] =?UTF-8?q?les=20commandes=20group=C3=A9es=20sont=20list?= =?UTF-8?q?=C3=A9es=20selon=20leurs=20dates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0008_grouped_order_deadline.py | 20 ++++++ ...rename_date_grouped_order_delivery_date.py | 18 +++++ la_chariotte/order/models.py | 2 +- la_chariotte/order/templates/order/index.html | 32 +++++++-- la_chariotte/order/tests.py | 67 +++++++++++++++++++ la_chariotte/order/views.py | 10 ++- 6 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 la_chariotte/order/migrations/0008_grouped_order_deadline.py create mode 100644 la_chariotte/order/migrations/0009_rename_date_grouped_order_delivery_date.py diff --git a/la_chariotte/order/migrations/0008_grouped_order_deadline.py b/la_chariotte/order/migrations/0008_grouped_order_deadline.py new file mode 100644 index 0000000..ae453d0 --- /dev/null +++ b/la_chariotte/order/migrations/0008_grouped_order_deadline.py @@ -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, + ), + ] diff --git a/la_chariotte/order/migrations/0009_rename_date_grouped_order_delivery_date.py b/la_chariotte/order/migrations/0009_rename_date_grouped_order_delivery_date.py new file mode 100644 index 0000000..1998119 --- /dev/null +++ b/la_chariotte/order/migrations/0009_rename_date_grouped_order_delivery_date.py @@ -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', + ), + ] diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 5bec1f1..ef55d2e 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -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): diff --git a/la_chariotte/order/templates/order/index.html b/la_chariotte/order/templates/order/index.html index 433e46a..0961efc 100644 --- a/la_chariotte/order/templates/order/index.html +++ b/la_chariotte/order/templates/order/index.html @@ -8,16 +8,40 @@

Index des commandes que l'utilisateur·ice connecté·e organise

Pour l'instant, index de toutes les commandes groupées qui existent

- {% 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 %} +

Commandes groupées à venir :

+ {% endif %} + {% if grouped_order_list.orders_over_grouped_orders %} +

Livraison à venir, date limite de commande dépassée :

+ + {% endif %} + {% if grouped_order_list.old_grouped_orders %} +

Livraison passée :

+ + {% endif %} {% else %}

Pas de commande groupée pour l'instant

{% endif %} diff --git a/la_chariotte/order/tests.py b/la_chariotte/order/tests.py index 37453f1..06df934 100644 --- a/la_chariotte/order/tests.py +++ b/la_chariotte/order/tests.py @@ -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) \ No newline at end of file diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 9c90b4b..72ce0ec 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -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):