From 2fdc1b686232a2f0bf8020c1453630c062dbd037 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Tue, 18 Apr 2023 16:49:41 +0200 Subject: [PATCH] index view only shows grouped orders organized by logged user --- la_chariotte/helpers/fixtures.py | 8 +++ .../0011_alter_groupedorder_orga.py | 22 +++++++ la_chariotte/order/models.py | 3 +- la_chariotte/order/templates/order/index.html | 1 - la_chariotte/order/tests/test_views.py | 59 ++++++++++++++++--- la_chariotte/order/views.py | 17 +++--- 6 files changed, 93 insertions(+), 17 deletions(-) create mode 100644 la_chariotte/order/migrations/0011_alter_groupedorder_orga.py diff --git a/la_chariotte/helpers/fixtures.py b/la_chariotte/helpers/fixtures.py index 86dd43c..2aa45d3 100644 --- a/la_chariotte/helpers/fixtures.py +++ b/la_chariotte/helpers/fixtures.py @@ -8,3 +8,11 @@ def client_log(client, django_user_model): user = django_user_model.objects.create_user(username=username, password=password) client.login(username=username, password=password) 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 diff --git a/la_chariotte/order/migrations/0011_alter_groupedorder_orga.py b/la_chariotte/order/migrations/0011_alter_groupedorder_orga.py new file mode 100644 index 0000000..626ff35 --- /dev/null +++ b/la_chariotte/order/migrations/0011_alter_groupedorder_orga.py @@ -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 + ), + ), + ] diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 4c4881f..ba823d1 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -1,10 +1,11 @@ +from django.contrib.auth.models import User from django.db import models from django.utils import timezone class GroupedOrder(models.Model): 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") deadline = models.DateTimeField("Date limite de commande") diff --git a/la_chariotte/order/templates/order/index.html b/la_chariotte/order/templates/order/index.html index 26060cd..fa38737 100644 --- a/la_chariotte/order/templates/order/index.html +++ b/la_chariotte/order/templates/order/index.html @@ -6,7 +6,6 @@

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.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 %} diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index dd4c314..a8766e4 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -2,6 +2,7 @@ import datetime import pytest from django.contrib import auth +from django.contrib.auth.models import User from django.urls import reverse 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) deadline = timezone.now() + datetime.timedelta(days=days_before_deadline) 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 """ 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( days_before_delivery_date=2, days_before_deadline=-1, name="crossed deadline", + orga_user=auth.get_user(client_log), ) 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")) @@ -129,7 +137,10 @@ class TestGroupedOrderIndexView: According to their delivery date and deadline, grouped orders are placed in correct section : only old gr 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")) @@ -166,7 +177,10 @@ class TestGroupedOrderIndexView: According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr 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")) @@ -198,14 +212,45 @@ class TestGroupedOrderIndexView: == 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: - 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 """ 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) detail_url = reverse( diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index e91c33a..2f3cd43 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -9,20 +9,21 @@ from .models import GroupedOrder, Item, Order, OrderedItem 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é""" - - """No permissions restriction""" + """View showing all the grouped orders organized by the authenticated user""" template_name = "order/index.html" context_object_name = "grouped_order_list" 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""" now = timezone.now() today = now.date() """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 delivery_date__lt=today ).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""" crossed_dealine_grouped_orders = ( - GroupedOrder.objects.filter(delivery_date__gte=today) + logged_user_grouped_orders.filter(delivery_date__gte=today) .filter(deadline__lt=now) .order_by("-delivery_date") ) # delivery date >= today (not delivered) and deadline < today (we cannot order) """Return all incoming grouped orders""" - incoming_grouped_orders = GroupedOrder.objects.filter( + incoming_grouped_orders = logged_user_grouped_orders.filter( deadline__gte=now ).order_by( "deadline" @@ -50,7 +51,7 @@ class IndexView(LoginRequiredMixin, generic.ListView): 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 template_name = "order/grouped_order_detail.html" @@ -58,7 +59,7 @@ class GroupedOrderDetailView(generic.DetailView): class GroupedOrderOrgaView(generic.DetailView): - """Vue de supervision d'une commande groupée""" + """Overview of a grouped order, for the organizer""" model = GroupedOrder template_name = "order/grouped_order_orga.html"