index view only shows grouped orders organized by logged user

This commit is contained in:
Laetitia Getti 2023-04-18 16:49:41 +02:00
parent e16447dcff
commit 2fdc1b6862
6 changed files with 93 additions and 17 deletions

View file

@ -8,3 +8,11 @@ def client_log(client, django_user_model):
user = django_user_model.objects.create_user(username=username, password=password) user = django_user_model.objects.create_user(username=username, password=password)
client.login(username=username, password=password) client.login(username=username, password=password)
return client return client
@pytest.fixture
def other_user(django_user_model):
username = "other@user.fr"
password = "azertypassword"
user = django_user_model.objects.create_user(username=username, password=password)
return user

View file

@ -0,0 +1,22 @@
# Generated by Django 4.2 on 2023-04-18 13:08
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("order", "0010_rename_grouped_order_groupedorder"),
]
operations = [
migrations.AlterField(
model_name="groupedorder",
name="orga",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
),
),
]

View file

@ -1,10 +1,11 @@
from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
class GroupedOrder(models.Model): class GroupedOrder(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.ForeignKey(User, on_delete=models.CASCADE)
delivery_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")

View file

@ -6,7 +6,6 @@
</head> </head>
<body> <body>
<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>
{% if grouped_order_list.incoming_grouped_orders or grouped_order_list.crossed_deadline_grouped_orders or grouped_order_list.old_grouped_orders %} {% if grouped_order_list.incoming_grouped_orders or grouped_order_list.crossed_deadline_grouped_orders or grouped_order_list.old_grouped_orders %}
{% if grouped_order_list.incoming_grouped_orders %} {% if grouped_order_list.incoming_grouped_orders %}

View file

@ -2,6 +2,7 @@ import datetime
import pytest import pytest
from django.contrib import auth from django.contrib import auth
from django.contrib.auth.models import User
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
@ -17,7 +18,7 @@ def create_grouped_order(days_before_delivery_date,days_before_deadline,name):
date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date) date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date)
deadline = timezone.now() + datetime.timedelta(days=days_before_deadline) deadline = timezone.now() + datetime.timedelta(days=days_before_deadline)
return GroupedOrder.objects.create( return GroupedOrder.objects.create(
name=name, orga="test orga", delivery_date=date, deadline=deadline name=name, orga=orga_user, delivery_date=date, deadline=deadline
) )
@ -57,15 +58,22 @@ class TestGroupedOrderIndexView:
According to their delivery date and deadline, grouped orders are placed in the correct section : several gr orders According to their delivery date and deadline, grouped orders are placed in the correct section : several gr orders
""" """
future_grouped_order = create_grouped_order( future_grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_deadline=2, name="future" days_before_delivery_date=5,
days_before_deadline=2,
name="future",
orga_user=auth.get_user(client_log),
) )
crossed_deadline_gr_order = create_grouped_order( crossed_deadline_gr_order = create_grouped_order(
days_before_delivery_date=2, days_before_delivery_date=2,
days_before_deadline=-1, days_before_deadline=-1,
name="crossed deadline", name="crossed deadline",
orga_user=auth.get_user(client_log),
) )
old_gr_order = create_grouped_order( old_gr_order = create_grouped_order(
days_before_delivery_date=-1, days_before_deadline=-3, name="old" days_before_delivery_date=-1,
days_before_deadline=-3,
name="old",
orga_user=auth.get_user(client_log),
) )
response = client.get(reverse("order:index")) response = client.get(reverse("order:index"))
@ -129,7 +137,10 @@ class TestGroupedOrderIndexView:
According to their delivery date and deadline, grouped orders are placed in correct section : only old gr order According to their delivery date and deadline, grouped orders are placed in correct section : only old gr order
""" """
old_gr_order = create_grouped_order( old_gr_order = create_grouped_order(
days_before_delivery_date=-1, days_before_deadline=-3, name="passée" days_before_delivery_date=-1,
days_before_deadline=-3,
name="passée",
orga_user=auth.get_user(client_log),
) )
response = client.get(reverse("order:index")) response = client.get(reverse("order:index"))
@ -166,7 +177,10 @@ class TestGroupedOrderIndexView:
According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr order According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr order
""" """
future_grouped_order = create_grouped_order( future_grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_deadline=2, name="future" days_before_delivery_date=5,
days_before_deadline=2,
name="future",
orga_user=auth.get_user(client_log),
) )
response = client.get(reverse("order:index")) response = client.get(reverse("order:index"))
@ -198,14 +212,45 @@ class TestGroupedOrderIndexView:
== future_grouped_order == future_grouped_order
) )
def test_gr_order_not_organized_by_logged_user(self, client_log, other_user):
"""
If the logged user is not the organizer of a grouped order they don't see it on IndexView
"""
logged_user = auth.get_user(client_log)
future_grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="future",
orga_user=other_user,
)
assert future_grouped_order.orga is not logged_user
response = client_log.get(reverse("order:index"))
assert response.status_code == 200
assert "Pas de commande groupée pour l'instant" in response.content.decode()
assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0
assert (
len(
response.context["grouped_order_list"][
"crossed_deadline_grouped_orders"
]
)
== 0
)
assert (
len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0
)
class TestGroupedOrderDetailView: class TestGroupedOrderDetailView:
def test_order_item(self, client): def test_order_item(self, client, other_user):
""" """
From the OrderDetailView, we order an item using the order form, and it creates an Order woth and Ordered_item inside From the OrderDetailView, we order an item using the order form, and it creates an Order woth and Ordered_item inside
""" """
grouped_order = create_grouped_order( grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_deadline=2, name="gr order test" days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=other_user,
) )
item = Item.objects.create(name="test item", grouped_order=grouped_order) item = Item.objects.create(name="test item", grouped_order=grouped_order)
detail_url = reverse( detail_url = reverse(

View file

@ -9,20 +9,21 @@ from .models import GroupedOrder, Item, Order, OrderedItem
class IndexView(LoginRequiredMixin, generic.ListView): class IndexView(LoginRequiredMixin, generic.ListView):
"""Vue de toutes les commandes groupées existantes - plus tard, de toutes les commandes groupées de l'utilisateur connecté""" """View showing all the grouped orders organized by the authenticated user"""
"""No permissions restriction"""
template_name = "order/index.html" template_name = "order/index.html"
context_object_name = "grouped_order_list" context_object_name = "grouped_order_list"
def get_queryset(self): def get_queryset(self):
"""Only grouped orders organized by logged user"""
logged_user_grouped_orders = GroupedOrder.objects.filter(orga=self.request.user)
"""3 grouped_order status : incoming, crossed_deadline, and old""" """3 grouped_order status : incoming, crossed_deadline, and old"""
now = timezone.now() now = timezone.now()
today = now.date() today = now.date()
"""Return the 5 most recent old grouped orders""" """Return the 5 most recent old grouped orders"""
old_grouped_orders = GroupedOrder.objects.filter( old_grouped_orders = logged_user_grouped_orders.filter(
# is_to_be_delivered=False # is_to_be_delivered=False
delivery_date__lt=today delivery_date__lt=today
).order_by("-delivery_date")[ ).order_by("-delivery_date")[
@ -31,13 +32,13 @@ class IndexView(LoginRequiredMixin, generic.ListView):
"""Return all grouped orders, that have crossed their ordering deadline but the delivery date is still to come""" """Return all grouped orders, that have crossed their ordering deadline but the delivery date is still to come"""
crossed_dealine_grouped_orders = ( crossed_dealine_grouped_orders = (
GroupedOrder.objects.filter(delivery_date__gte=today) logged_user_grouped_orders.filter(delivery_date__gte=today)
.filter(deadline__lt=now) .filter(deadline__lt=now)
.order_by("-delivery_date") .order_by("-delivery_date")
) # delivery date >= today (not delivered) and deadline < today (we cannot order) ) # delivery date >= today (not delivered) and deadline < today (we cannot order)
"""Return all incoming grouped orders""" """Return all incoming grouped orders"""
incoming_grouped_orders = GroupedOrder.objects.filter( incoming_grouped_orders = logged_user_grouped_orders.filter(
deadline__gte=now deadline__gte=now
).order_by( ).order_by(
"deadline" "deadline"
@ -50,7 +51,7 @@ class IndexView(LoginRequiredMixin, generic.ListView):
class GroupedOrderDetailView(generic.DetailView): class GroupedOrderDetailView(generic.DetailView):
"""Vue de détail d'une commande groupée - possibilité de commander si elle est en cours""" """Detail view for a grouped order - possibility to order if it is ongoing - No permissions restriction"""
model = GroupedOrder model = GroupedOrder
template_name = "order/grouped_order_detail.html" template_name = "order/grouped_order_detail.html"
@ -58,7 +59,7 @@ class GroupedOrderDetailView(generic.DetailView):
class GroupedOrderOrgaView(generic.DetailView): class GroupedOrderOrgaView(generic.DetailView):
"""Vue de supervision d'une commande groupée""" """Overview of a grouped order, for the organizer"""
model = GroupedOrder model = GroupedOrder
template_name = "order/grouped_order_orga.html" template_name = "order/grouped_order_orga.html"