mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-02 11:52:27 +02:00
les commandes groupées sont listées selon leurs dates
This commit is contained in:
parent
95a0e3fcdd
commit
d4872c372e
6 changed files with 142 additions and 7 deletions
20
la_chariotte/order/migrations/0008_grouped_order_deadline.py
Normal file
20
la_chariotte/order/migrations/0008_grouped_order_deadline.py
Normal 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,
|
||||
),
|
||||
]
|
|
@ -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',
|
||||
),
|
||||
]
|
|
@ -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):
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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)
|
|
@ -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):
|
||||
|
|
Loading…
Reference in a new issue