From 1a1ee02c51f33f7b36d251f936bbd9d61a39ad84 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Fri, 17 Mar 2023 16:04:09 +0100 Subject: [PATCH 01/18] =?UTF-8?q?possibilit=C3=A9=20de=20commander=201=20p?= =?UTF-8?q?roduit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- la_chariotte/order/tests.py | 3 + la_chariotte/readMe.md | 166 ++++++++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 la_chariotte/order/tests.py create mode 100644 la_chariotte/readMe.md diff --git a/la_chariotte/order/tests.py b/la_chariotte/order/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/la_chariotte/order/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/la_chariotte/readMe.md b/la_chariotte/readMe.md new file mode 100644 index 0000000..6e6799f --- /dev/null +++ b/la_chariotte/readMe.md @@ -0,0 +1,166 @@ +Exemple de MCD en markdown avec mermaid : + + +```mermaid +erDiagram +CourseSubmission{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField title +DateField date +FSMField state +} +CourseSubmissionProduct{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +PositiveSmallIntegerField quantity +} +Pricing{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField name +} +Product{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField name +CharField code +BooleanField submission_enabled +} +ProductPrice{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +PositiveSmallIntegerField year +CharField price_type +DecimalField price_flat +PositiveSmallIntegerField price_percent +DecimalField price_percent_minimum +CharField unit +} +ProductPriceRange{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +PositiveSmallIntegerField range_start +PositiveSmallIntegerField range_end +DecimalField unit_price +DecimalField minimum +} +ProductPricePackLine_included_products{ +AutoField id +} +ProductPricePackLine{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField quantity_type +PositiveSmallIntegerField quantity +} +Contract{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +DateField start +DateField end +FileField file +} +Transaction_products{ +AutoField id +} +Transaction{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +PositiveIntegerField debit +PositiveIntegerField credit +BooleanField unlimited_credit +} +Quote{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField external_ref +FSMField state +} +QuoteLine{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +TextField label +DecimalField unit_price +DecimalField quantity +} +Invoice{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField external_ref +FSMField state +} +InvoiceLine{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +TextField label +DecimalField unit_price +DecimalField quantity +} +User{ +CharField password +DateTimeField last_login +BooleanField is_superuser +CharField username +CharField first_name +CharField last_name +EmailField email +BooleanField is_staff +BooleanField is_active +DateTimeField date_joined +UUIDField id +DateTimeField created_on +DateTimeField updated_on +ManyToManyField groups +ManyToManyField user_permissions +} +Organization{ +UUIDField id +DateTimeField created_on +DateTimeField updated_on +CharField code +CharField representative +FileField signature +FileField logo +} +CourseSubmission||--|{User : user +CourseSubmission||--|{Organization : organization +CourseSubmissionProduct||--|{CourseSubmission : course_submission +CourseSubmissionProduct||--|{Product : product +ProductPrice||--|{Pricing : pricing +ProductPrice||--|{Product : product +ProductPriceRange||--|{ProductPrice : product_price +ProductPricePackLine_included_products||--|{ProductPricePackLine : productpricepackline +ProductPricePackLine_included_products||--|{Product : product +ProductPricePackLine||--|{ProductPrice : product_price +ProductPricePackLine}|--|{Product : included_products +Contract||--|{Organization : organization +Contract||--|{Pricing : pricing +Transaction_products||--|{Transaction : transaction +Transaction_products||--|{Product : product +Transaction||--|{Invoice : invoice +Transaction||--|{CourseSubmission : course_submission +Transaction}|--|{Product : products +Quote||--|{Organization : organization +QuoteLine||--|{Quote : quote +QuoteLine||--|{Product : product +Invoice||--|{Organization : organization +InvoiceLine||--|{Invoice : invoice +InvoiceLine||--|{Product : product +Organization||--|{User : representative_user +Organization||--|{Organization : parent + +``` From 09e21f7e5b21825b5d04350bc51ed2f7084366b4 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Fri, 17 Mar 2023 17:39:25 +0100 Subject: [PATCH 02/18] fonction is_ongoing et tests --- la_chariotte/order/models.py | 2 ++ la_chariotte/order/tests.py | 26 ++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 4c4881f..0a3033b 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -1,3 +1,5 @@ +import datetime + from django.db import models from django.utils import timezone diff --git a/la_chariotte/order/tests.py b/la_chariotte/order/tests.py index 7ce503c..37453f1 100644 --- a/la_chariotte/order/tests.py +++ b/la_chariotte/order/tests.py @@ -1,3 +1,25 @@ -from django.test import TestCase +import datetime + +from django.test import TestCase +from django.utils import timezone +from .models import Grouped_order + + +class GroupedOrderModelTests(TestCase): + + def test_is_ongoing_with_ongoing_grouped_order(self): + """ + is_ongoing() returns True if the deadline is not crossed + """ + deadline = timezone.now() + datetime.timedelta(days=10) + ongoing_gr_order = Grouped_order(deadline=deadline) + self.assertIs(ongoing_gr_order.is_ongoing(), True) + + def test_is_ongoing_with_old_grouped_order(self): + """ + is_ongoing() returns False if the deadline is crossed + """ + deadline = timezone.now() - datetime.timedelta(hours=1) + ongoing_gr_order = Grouped_order(deadline=deadline) + self.assertIs(ongoing_gr_order.is_ongoing(), False) -# Create your tests here. From 0aaef7aea88fb3177a71d692e2e96e67252e64e2 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 30 Mar 2023 14:14:32 +0200 Subject: [PATCH 03/18] install pytest --- la_chariotte/order/tests/test_models.py | 19 +++++++ la_chariotte/order/tests/test_views.py | 73 +++++++++++++++++++++++++ setup.cfg | 2 + 3 files changed, 94 insertions(+) create mode 100644 setup.cfg diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index d5fff17..7398620 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -1,6 +1,7 @@ import datetime from django.utils import timezone +<<<<<<< HEAD from la_chariotte.order.models import GroupedOrder @@ -8,19 +9,33 @@ from la_chariotte.order.models import GroupedOrder class TestGroupedOrdersModel: """Tests for Grouped orders model""" +======= +from la_chariotte.order.models import Grouped_order + + + +class TestGroupedOrdersModel(): + """Tests for Grouped orders model""" +>>>>>>> 9cc7783 (install pytest) def test_is_ongoing_with_ongoing_grouped_order(self): """ is_ongoing() returns True if the deadline is not crossed """ deadline = timezone.now() + datetime.timedelta(days=10) +<<<<<<< HEAD ongoing_gr_order = GroupedOrder(deadline=deadline) assert ongoing_gr_order.is_ongoing() +======= + ongoing_gr_order = Grouped_order(deadline=deadline) + assert ongoing_gr_order.is_ongoing() == True +>>>>>>> 9cc7783 (install pytest) def test_is_ongoing_with_old_grouped_order(self): """ is_ongoing() returns False if the deadline is crossed """ deadline = timezone.now() - datetime.timedelta(hours=1) +<<<<<<< HEAD old_gr_order = GroupedOrder(deadline=deadline) assert not old_gr_order.is_ongoing() @@ -48,3 +63,7 @@ class TestGroupedOrdersModel: del_date = timezone.now().date() + datetime.timedelta(days=1) old_gr_order = GroupedOrder(deadline=deadline, delivery_date=del_date) assert old_gr_order.is_to_be_delivered() +======= + ongoing_gr_order = Grouped_order(deadline=deadline) + assert not ongoing_gr_order.is_ongoing() +>>>>>>> 9cc7783 (install pytest) diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 9e241bc..5e9edb3 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -1,6 +1,7 @@ import datetime import pytest +<<<<<<< HEAD from django.urls import reverse from django.utils import timezone @@ -10,11 +11,22 @@ pytestmark = pytest.mark.django_db def create_grouped_order(days_before_delivery_date, days_before_deadline, name): +======= + +from django.urls import reverse +from django.utils import timezone +from la_chariotte.order.models import Grouped_order + +pytestmark = pytest.mark.django_db + +def create_grouped_order(days_before_delivery_date,days_before_deadline,name): +>>>>>>> 9cc7783 (install pytest) """ Creates a grouped order. """ date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date) deadline = timezone.now() + datetime.timedelta(days=days_before_deadline) +<<<<<<< HEAD return GroupedOrder.objects.create( name=name, orga="test orga", delivery_date=date, deadline=deadline ) @@ -57,11 +69,36 @@ class TestGroupedOrderIndexView: days_before_delivery_date=-1, days_before_deadline=-3, name="old" ) response = client.get(reverse("order:index")) +======= + return Grouped_order.objects.create(name=name, orga="test orga",delivery_date=date,deadline=deadline) + +class TestGroupedOrderIndexView: + def test_no_grouped_orders(self,client): + """ + If no grouped order exist, an appropriate message is displayed + """ + response = client.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']['orders_over_grouped_orders']) == 0 + assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 0 + + def test_grouped_orders_in_right_section(self,client): + """ + 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") + crossed_deadline_gr_order = create_grouped_order(days_before_delivery_date=2, days_before_deadline=-1,name="crossed deadline") + old_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="old") + response = client.get(reverse('order:index')) +>>>>>>> 9cc7783 (install pytest) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() assert "Livraison à venir" in response.content.decode() assert "Livraison passée" in response.content.decode() +<<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 assert ( len( @@ -95,11 +132,27 @@ class TestGroupedOrderIndexView: days_before_delivery_date=-1, days_before_deadline=-3, name="passée" ) response = client.get(reverse("order:index")) +======= + assert len(response.context['grouped_order_list']['old_grouped_orders']) == 1 + assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 1 + assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 1 + assert response.context['grouped_order_list']['old_grouped_orders'][0] == old_gr_order + assert response.context['grouped_order_list']['orders_over_grouped_orders'][0] == crossed_deadline_gr_order + assert response.context['grouped_order_list']['incoming_grouped_orders'][0] == future_grouped_order + + def test_grouped_orders_in_right_section__with_only_old(self,client): + """ + 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") + response = client.get(reverse('order:index')) +>>>>>>> 9cc7783 (install pytest) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" not in response.content.decode() assert "Livraison à venir" not in response.content.decode() assert "Livraison passée" in response.content.decode() +<<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 assert ( len( @@ -125,11 +178,25 @@ class TestGroupedOrderIndexView: days_before_delivery_date=5, days_before_deadline=2, name="future" ) response = client.get(reverse("order:index")) +======= + assert len(response.context['grouped_order_list']['old_grouped_orders']) == 1 + assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 0 + assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 0 + assert response.context['grouped_order_list']['old_grouped_orders'][0] == old_gr_order + + def test_grouped_orders_in_right_section__with_only_future(self,client): + """ + 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") + response = client.get(reverse('order:index')) +>>>>>>> 9cc7783 (install pytest) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() assert "Livraison à venir" not in response.content.decode() assert "Livraison passée" not in response.content.decode() +<<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0 assert ( len( @@ -191,3 +258,9 @@ class TestGroupedOrderDetailView: assert item.ordered_nb == 1 order = Order.objects.first() assert order.ordered_items.count() == 1 +======= + assert len(response.context['grouped_order_list']['old_grouped_orders']) == 0 + assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 0 + assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 1 + assert response.context['grouped_order_list']['incoming_grouped_orders'][0] == future_grouped_order +>>>>>>> 9cc7783 (install pytest) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..fdfd88b --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[tool:pytest] +DJANGO_SETTINGS_MODULE = la_chariotte.settings \ No newline at end of file From 5ec40a5ea3145d1cee97228a8462f984f0dc51b0 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 30 Mar 2023 14:44:14 +0200 Subject: [PATCH 04/18] install black and format files --- la_chariotte/order/models.py | 20 ++++++ la_chariotte/order/tests/test_models.py | 10 ++- la_chariotte/order/tests/test_views.py | 93 ++++++++++++++++++++++--- 3 files changed, 113 insertions(+), 10 deletions(-) diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 0a3033b..4b5f4e7 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -14,11 +14,15 @@ class GroupedOrder(models.Model): """Returns True if the grouped order is open for new Orders - False if it's too late""" return self.deadline >= timezone.now() +<<<<<<< HEAD def is_to_be_delivered(self): """Returns True if the grouped order has not been delivered yet - False if it's old""" return self.delivery_date >= timezone.now().date() def __str__(self): # pragma: no cover +======= + def __str__(self): +>>>>>>> f6ec481 (install black and format files) return ( self.name if self.name @@ -28,20 +32,32 @@ class GroupedOrder(models.Model): class Order(models.Model): grouped_order = models.ForeignKey( +<<<<<<< HEAD GroupedOrder, on_delete=models.CASCADE, related_name="order_set" +======= + Grouped_order, on_delete=models.CASCADE, related_name="order_set" +>>>>>>> f6ec481 (install black and format files) ) author = models.CharField( max_length=100, verbose_name="Personne qui passe la commande" ) # a changer, utiliser ForeignKey de user +<<<<<<< HEAD def __str__(self): # pragma: no cover +======= + def __str__(self): +>>>>>>> f6ec481 (install black and format files) return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}" class Item(models.Model): name = models.CharField(max_length=100) grouped_order = models.ForeignKey( +<<<<<<< HEAD GroupedOrder, on_delete=models.CASCADE +======= + Grouped_order, on_delete=models.CASCADE +>>>>>>> f6ec481 (install black and format files) ) # à transformer en manytomany quand il y aura un catalogue ordered_nb = models.IntegerField(default=0) @@ -58,5 +74,9 @@ class OrderedItem(models.Model): ) item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name="orders") +<<<<<<< HEAD def __str__(self): # pragma: no cover +======= + def __str__(self): +>>>>>>> f6ec481 (install black and format files) return f"{self.nb} {self.item}, dans la commande {self.order.pk}" diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index 7398620..63563bc 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -13,10 +13,13 @@ class TestGroupedOrdersModel: from la_chariotte.order.models import Grouped_order - -class TestGroupedOrdersModel(): +class TestGroupedOrdersModel: """Tests for Grouped orders model""" +<<<<<<< HEAD >>>>>>> 9cc7783 (install pytest) +======= + +>>>>>>> f6ec481 (install black and format files) def test_is_ongoing_with_ongoing_grouped_order(self): """ is_ongoing() returns True if the deadline is not crossed @@ -66,4 +69,7 @@ class TestGroupedOrdersModel(): ======= ongoing_gr_order = Grouped_order(deadline=deadline) assert not ongoing_gr_order.is_ongoing() +<<<<<<< HEAD >>>>>>> 9cc7783 (install pytest) +======= +>>>>>>> f6ec481 (install black and format files) diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 5e9edb3..d56052a 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -19,13 +19,19 @@ from la_chariotte.order.models import Grouped_order pytestmark = pytest.mark.django_db +<<<<<<< HEAD def create_grouped_order(days_before_delivery_date,days_before_deadline,name): >>>>>>> 9cc7783 (install pytest) +======= + +def create_grouped_order(days_before_delivery_date, days_before_deadline, name): +>>>>>>> f6ec481 (install black and format files) """ Creates a grouped order. """ date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date) deadline = timezone.now() + datetime.timedelta(days=days_before_deadline) +<<<<<<< HEAD <<<<<<< HEAD return GroupedOrder.objects.create( name=name, orga="test orga", delivery_date=date, deadline=deadline @@ -71,33 +77,60 @@ class TestGroupedOrderIndexView: response = client.get(reverse("order:index")) ======= return Grouped_order.objects.create(name=name, orga="test orga",delivery_date=date,deadline=deadline) +======= + return Grouped_order.objects.create( + name=name, orga="test orga", delivery_date=date, deadline=deadline + ) + +>>>>>>> f6ec481 (install black and format files) class TestGroupedOrderIndexView: - def test_no_grouped_orders(self,client): + def test_no_grouped_orders(self, client): """ If no grouped order exist, an appropriate message is displayed """ - response = client.get(reverse('order:index')) + response = client.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']['orders_over_grouped_orders']) == 0 - assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 0 + assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0 + assert ( + len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) + == 0 + ) + assert ( + len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0 + ) - def test_grouped_orders_in_right_section(self,client): + def test_grouped_orders_in_right_section(self, client): """ According to their delivery date and deadline, grouped orders are placed in the correct section : several gr orders """ +<<<<<<< HEAD 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") old_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="old") response = client.get(reverse('order:index')) >>>>>>> 9cc7783 (install pytest) +======= + 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", + ) + old_gr_order = create_grouped_order( + days_before_delivery_date=-1, days_before_deadline=-3, name="old" + ) + response = client.get(reverse("order:index")) +>>>>>>> f6ec481 (install black and format files) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() assert "Livraison à venir" in response.content.decode() assert "Livraison passée" in response.content.decode() +<<<<<<< HEAD <<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 assert ( @@ -106,6 +139,11 @@ class TestGroupedOrderIndexView: "crossed_deadline_grouped_orders" ] ) +======= + assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 + assert ( + len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) +>>>>>>> f6ec481 (install black and format files) == 1 ) assert ( @@ -116,13 +154,18 @@ class TestGroupedOrderIndexView: == old_gr_order ) assert ( +<<<<<<< HEAD response.context["grouped_order_list"]["crossed_deadline_grouped_orders"][0] +======= + response.context["grouped_order_list"]["orders_over_grouped_orders"][0] +>>>>>>> f6ec481 (install black and format files) == crossed_deadline_gr_order ) assert ( response.context["grouped_order_list"]["incoming_grouped_orders"][0] == future_grouped_order ) +<<<<<<< HEAD def test_grouped_orders_in_right_section__with_only_old(self, client): """ @@ -139,19 +182,29 @@ class TestGroupedOrderIndexView: assert response.context['grouped_order_list']['old_grouped_orders'][0] == old_gr_order assert response.context['grouped_order_list']['orders_over_grouped_orders'][0] == crossed_deadline_gr_order assert response.context['grouped_order_list']['incoming_grouped_orders'][0] == future_grouped_order +======= +>>>>>>> f6ec481 (install black and format files) - def test_grouped_orders_in_right_section__with_only_old(self,client): + def test_grouped_orders_in_right_section__with_only_old(self, client): """ According to their delivery date and deadline, grouped orders are placed in correct section : only old gr order """ +<<<<<<< HEAD old_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="passée") response = client.get(reverse('order:index')) >>>>>>> 9cc7783 (install pytest) +======= + old_gr_order = create_grouped_order( + days_before_delivery_date=-1, days_before_deadline=-3, name="passée" + ) + response = client.get(reverse("order:index")) +>>>>>>> f6ec481 (install black and format files) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" not in response.content.decode() assert "Livraison à venir" not in response.content.decode() assert "Livraison passée" in response.content.decode() +<<<<<<< HEAD <<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 assert ( @@ -160,6 +213,11 @@ class TestGroupedOrderIndexView: "crossed_deadline_grouped_orders" ] ) +======= + assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 + assert ( + len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) +>>>>>>> f6ec481 (install black and format files) == 0 ) assert ( @@ -169,6 +227,7 @@ class TestGroupedOrderIndexView: response.context["grouped_order_list"]["old_grouped_orders"][0] == old_gr_order ) +<<<<<<< HEAD def test_grouped_orders_in_right_section__with_only_future(self, client): """ @@ -183,19 +242,29 @@ class TestGroupedOrderIndexView: assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 0 assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 0 assert response.context['grouped_order_list']['old_grouped_orders'][0] == old_gr_order +======= +>>>>>>> f6ec481 (install black and format files) - def test_grouped_orders_in_right_section__with_only_future(self,client): + def test_grouped_orders_in_right_section__with_only_future(self, client): """ According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr order """ +<<<<<<< HEAD future_grouped_order = create_grouped_order(days_before_delivery_date=5,days_before_deadline=2,name="future") response = client.get(reverse('order:index')) >>>>>>> 9cc7783 (install pytest) +======= + future_grouped_order = create_grouped_order( + days_before_delivery_date=5, days_before_deadline=2, name="future" + ) + response = client.get(reverse("order:index")) +>>>>>>> f6ec481 (install black and format files) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() assert "Livraison à venir" not in response.content.decode() assert "Livraison passée" not in response.content.decode() +<<<<<<< HEAD <<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0 assert ( @@ -204,6 +273,11 @@ class TestGroupedOrderIndexView: "crossed_deadline_grouped_orders" ] ) +======= + assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0 + assert ( + len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) +>>>>>>> f6ec481 (install black and format files) == 0 ) assert ( @@ -213,6 +287,7 @@ class TestGroupedOrderIndexView: response.context["grouped_order_list"]["incoming_grouped_orders"][0] == future_grouped_order ) +<<<<<<< HEAD class TestGroupedOrderDetailView: @@ -264,3 +339,5 @@ class TestGroupedOrderDetailView: assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 1 assert response.context['grouped_order_list']['incoming_grouped_orders'][0] == future_grouped_order >>>>>>> 9cc7783 (install pytest) +======= +>>>>>>> f6ec481 (install black and format files) From d650ec29136712f27319bbcd0a7a1b53316cf910 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 30 Mar 2023 14:51:09 +0200 Subject: [PATCH 05/18] install flake8 and check files --- la_chariotte/order/models.py | 22 ---------------------- la_chariotte/order/tests/test_models.py | 4 ++++ setup.cfg | 6 +++++- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 4b5f4e7..4c4881f 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -1,5 +1,3 @@ -import datetime - from django.db import models from django.utils import timezone @@ -14,15 +12,11 @@ class GroupedOrder(models.Model): """Returns True if the grouped order is open for new Orders - False if it's too late""" return self.deadline >= timezone.now() -<<<<<<< HEAD def is_to_be_delivered(self): """Returns True if the grouped order has not been delivered yet - False if it's old""" return self.delivery_date >= timezone.now().date() def __str__(self): # pragma: no cover -======= - def __str__(self): ->>>>>>> f6ec481 (install black and format files) return ( self.name if self.name @@ -32,32 +26,20 @@ class GroupedOrder(models.Model): class Order(models.Model): grouped_order = models.ForeignKey( -<<<<<<< HEAD GroupedOrder, on_delete=models.CASCADE, related_name="order_set" -======= - Grouped_order, on_delete=models.CASCADE, related_name="order_set" ->>>>>>> f6ec481 (install black and format files) ) author = models.CharField( max_length=100, verbose_name="Personne qui passe la commande" ) # a changer, utiliser ForeignKey de user -<<<<<<< HEAD def __str__(self): # pragma: no cover -======= - def __str__(self): ->>>>>>> f6ec481 (install black and format files) return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}" class Item(models.Model): name = models.CharField(max_length=100) grouped_order = models.ForeignKey( -<<<<<<< HEAD GroupedOrder, on_delete=models.CASCADE -======= - Grouped_order, on_delete=models.CASCADE ->>>>>>> f6ec481 (install black and format files) ) # à transformer en manytomany quand il y aura un catalogue ordered_nb = models.IntegerField(default=0) @@ -74,9 +56,5 @@ class OrderedItem(models.Model): ) item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name="orders") -<<<<<<< HEAD def __str__(self): # pragma: no cover -======= - def __str__(self): ->>>>>>> f6ec481 (install black and format files) return f"{self.nb} {self.item}, dans la commande {self.order.pk}" diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index 63563bc..e4db427 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -30,8 +30,12 @@ class TestGroupedOrdersModel: assert ongoing_gr_order.is_ongoing() ======= ongoing_gr_order = Grouped_order(deadline=deadline) +<<<<<<< HEAD assert ongoing_gr_order.is_ongoing() == True >>>>>>> 9cc7783 (install pytest) +======= + assert ongoing_gr_order.is_ongoing() +>>>>>>> 7882cae (install flake8 and check files) def test_is_ongoing_with_old_grouped_order(self): """ diff --git a/setup.cfg b/setup.cfg index fdfd88b..1183a37 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,6 @@ [tool:pytest] -DJANGO_SETTINGS_MODULE = la_chariotte.settings \ No newline at end of file +DJANGO_SETTINGS_MODULE = la_chariotte.settings + +[flake8] +exclude = migrations +extend-ignore = E501 \ No newline at end of file From 5289a90cedf4c9b28392061ec3121baa6f374a16 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 30 Mar 2023 16:08:54 +0200 Subject: [PATCH 06/18] install flake8-black and move pytest config in pyproject.toml --- pyproject.toml | 3 +++ readMe.md | 1 + setup.cfg | 3 --- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 68763da..3a5c94b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,9 @@ isort_ignore = ["*migrations/*.py"] [tool.isort] skip_glob = ["*migrations/*.py"] +[tool.pytest.ini_options] +DJANGO_SETTINGS_MODULE = "la_chariotte.settings" + [tool.black] line-length = 88 exclude = ''' diff --git a/readMe.md b/readMe.md index b50408a..9acdec4 100644 --- a/readMe.md +++ b/readMe.md @@ -33,3 +33,4 @@ Si il y a des erreurs BLACK, on peut lancer black pour linter le code : ```bash black . ``` + diff --git a/setup.cfg b/setup.cfg index 1183a37..f0a1c3b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,3 @@ -[tool:pytest] -DJANGO_SETTINGS_MODULE = la_chariotte.settings - [flake8] exclude = migrations extend-ignore = E501 \ No newline at end of file From 78fc4afcf3dfef256e188e860a85191c46b9ab06 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 5 Apr 2023 10:27:46 +0200 Subject: [PATCH 07/18] use pip-compile to generate requirements.txt --- dev-requirements.txt | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/dev-requirements.txt b/dev-requirements.txt index fb0b229..07b445f 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -9,33 +9,50 @@ asgiref==3.6.0 attrs==22.2.0 # via pytest black==23.3.0 +<<<<<<< HEAD # via pytest-black build==0.10.0 # via pip-tools chardet==4.0.0 # via diff-cover +======= + # via flake8-black +build==0.10.0 + # via pip-tools +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) click==8.1.3 # via # black # pip-tools +<<<<<<< HEAD coverage[toml]==7.2.2 # via pytest-cov diff-cover==4.2.3 # via la-chariotte (pyproject.toml) +======= +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) django==4.2 # via la-chariotte (pyproject.toml) exceptiongroup==1.1.1 # via pytest +<<<<<<< HEAD importlib-metadata==6.1.0 # via inflect inflect==3.0.2 # via # diff-cover # jinja2-pluralize +======= +flake8==6.0.0 + # via flake8-black +flake8-black==0.3.6 + # via la-chariotte (pyproject.toml) +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) iniconfig==2.0.0 # via pytest isort==5.12.0 # via pytest-isort +<<<<<<< HEAD jinja2==3.1.2 # via # diff-cover @@ -44,6 +61,10 @@ jinja2-pluralize==0.3.0 # via diff-cover markupsafe==2.1.2 # via jinja2 +======= +mccabe==0.7.0 + # via flake8 +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) mypy-extensions==1.0.0 # via black packaging==23.0 @@ -58,6 +79,7 @@ pip-tools==6.12.3 platformdirs==3.2.0 # via black pluggy==1.0.0 +<<<<<<< HEAD # via # diff-cover # pytest @@ -65,11 +87,21 @@ psycopg2-binary==2.9.6 # via la-chariotte (pyproject.toml) pygments==2.14.0 # via diff-cover +======= + # via pytest +psycopg2==2.9.6 + # via la-chariotte (pyproject.toml) +pycodestyle==2.10.0 + # via flake8 +pyflakes==3.0.1 + # via flake8 +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) pyproject-hooks==1.0.0 # via build pytest==7.2.2 # via # la-chariotte (pyproject.toml) +<<<<<<< HEAD # pytest-black # pytest-cov # pytest-django @@ -78,18 +110,26 @@ pytest-black==0.3.12 # via la-chariotte (pyproject.toml) pytest-cov==4.0.0 # via la-chariotte (pyproject.toml) +======= + # pytest-django + # pytest-isort +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) pytest-django==4.5.2 # via la-chariotte (pyproject.toml) pytest-isort==3.1.0 # via la-chariotte (pyproject.toml) sqlparse==0.4.3 # via django +<<<<<<< HEAD toml==0.10.2 # via pytest-black +======= +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) tomli==2.0.1 # via # black # build +<<<<<<< HEAD # coverage # pyproject-hooks # pytest @@ -97,6 +137,12 @@ wheel==0.40.0 # via pip-tools zipp==3.15.0 # via importlib-metadata +======= + # flake8-black + # pytest +wheel==0.40.0 + # via pip-tools +>>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) # The following packages are considered to be unsafe in a requirements file: # pip From 3e903b048a74d359e207e70d54994d85fd92f9d6 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 5 Apr 2023 11:12:58 +0200 Subject: [PATCH 08/18] create gitlab-ci.yml --- dev-requirements.txt | 63 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/dev-requirements.txt b/dev-requirements.txt index 07b445f..242393a 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -9,6 +9,7 @@ asgiref==3.6.0 attrs==22.2.0 # via pytest black==23.3.0 +<<<<<<< HEAD <<<<<<< HEAD # via pytest-black build==0.10.0 @@ -20,17 +21,32 @@ chardet==4.0.0 build==0.10.0 # via pip-tools >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= + # via + # flake8-black + # pytest-black +build==0.10.0 + # via pip-tools +chardet==4.0.0 + # via diff-cover +>>>>>>> f0d0cd8 (create gitlab-ci.yml) click==8.1.3 # via # black # pip-tools <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) coverage[toml]==7.2.2 # via pytest-cov diff-cover==4.2.3 # via la-chariotte (pyproject.toml) +<<<<<<< HEAD ======= >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) django==4.2 # via la-chariotte (pyproject.toml) exceptiongroup==1.1.1 @@ -47,12 +63,24 @@ flake8==6.0.0 # via flake8-black flake8-black==0.3.6 # via la-chariotte (pyproject.toml) +<<<<<<< HEAD >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +importlib-metadata==6.1.0 + # via inflect +inflect==3.0.2 + # via + # diff-cover + # jinja2-pluralize +>>>>>>> f0d0cd8 (create gitlab-ci.yml) iniconfig==2.0.0 # via pytest isort==5.12.0 # via pytest-isort <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) jinja2==3.1.2 # via # diff-cover @@ -61,7 +89,10 @@ jinja2-pluralize==0.3.0 # via diff-cover markupsafe==2.1.2 # via jinja2 +<<<<<<< HEAD ======= +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) mccabe==0.7.0 # via flake8 >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) @@ -80,28 +111,42 @@ platformdirs==3.2.0 # via black pluggy==1.0.0 <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) # via # diff-cover # pytest psycopg2-binary==2.9.6 +<<<<<<< HEAD # via la-chariotte (pyproject.toml) pygments==2.14.0 # via diff-cover ======= # via pytest psycopg2==2.9.6 +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) # via la-chariotte (pyproject.toml) pycodestyle==2.10.0 # via flake8 pyflakes==3.0.1 # via flake8 +<<<<<<< HEAD >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +pygments==2.14.0 + # via diff-cover +>>>>>>> f0d0cd8 (create gitlab-ci.yml) pyproject-hooks==1.0.0 # via build pytest==7.2.2 # via # la-chariotte (pyproject.toml) <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) # pytest-black # pytest-cov # pytest-django @@ -110,10 +155,13 @@ pytest-black==0.3.12 # via la-chariotte (pyproject.toml) pytest-cov==4.0.0 # via la-chariotte (pyproject.toml) +<<<<<<< HEAD ======= # pytest-django # pytest-isort >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +>>>>>>> f0d0cd8 (create gitlab-ci.yml) pytest-django==4.5.2 # via la-chariotte (pyproject.toml) pytest-isort==3.1.0 @@ -121,14 +169,20 @@ pytest-isort==3.1.0 sqlparse==0.4.3 # via django <<<<<<< HEAD +<<<<<<< HEAD toml==0.10.2 # via pytest-black ======= >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +toml==0.10.2 + # via pytest-black +>>>>>>> f0d0cd8 (create gitlab-ci.yml) tomli==2.0.1 # via # black # build +<<<<<<< HEAD <<<<<<< HEAD # coverage # pyproject-hooks @@ -138,11 +192,20 @@ wheel==0.40.0 zipp==3.15.0 # via importlib-metadata ======= +======= + # coverage +>>>>>>> f0d0cd8 (create gitlab-ci.yml) # flake8-black + # pyproject-hooks # pytest wheel==0.40.0 # via pip-tools +<<<<<<< HEAD >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +zipp==3.15.0 + # via importlib-metadata +>>>>>>> f0d0cd8 (create gitlab-ci.yml) # The following packages are considered to be unsafe in a requirements file: # pip From 572e11e4e5f4027a773563767084cbf869d083c5 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 5 Apr 2023 19:12:33 +0200 Subject: [PATCH 09/18] delete flake8 --- dev-requirements.txt | 13 +++++++++++++ readMe.md | 1 - setup.cfg | 3 --- 3 files changed, 13 insertions(+), 4 deletions(-) delete mode 100644 setup.cfg diff --git a/dev-requirements.txt b/dev-requirements.txt index 242393a..fc070ad 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -10,6 +10,7 @@ attrs==22.2.0 # via pytest black==23.3.0 <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD # via pytest-black build==0.10.0 @@ -25,6 +26,9 @@ build==0.10.0 # via # flake8-black # pytest-black +======= + # via pytest-black +>>>>>>> db38729 (delete flake8) build==0.10.0 # via pip-tools chardet==4.0.0 @@ -52,6 +56,9 @@ django==4.2 exceptiongroup==1.1.1 # via pytest <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> db38729 (delete flake8) importlib-metadata==6.1.0 # via inflect inflect==3.0.2 @@ -90,12 +97,15 @@ jinja2-pluralize==0.3.0 markupsafe==2.1.2 # via jinja2 <<<<<<< HEAD +<<<<<<< HEAD ======= ======= >>>>>>> f0d0cd8 (create gitlab-ci.yml) mccabe==0.7.0 # via flake8 >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) +======= +>>>>>>> db38729 (delete flake8) mypy-extensions==1.0.0 # via black packaging==23.0 @@ -128,6 +138,7 @@ psycopg2==2.9.6 ======= >>>>>>> f0d0cd8 (create gitlab-ci.yml) # via la-chariotte (pyproject.toml) +<<<<<<< HEAD pycodestyle==2.10.0 # via flake8 pyflakes==3.0.1 @@ -135,6 +146,8 @@ pyflakes==3.0.1 <<<<<<< HEAD >>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) ======= +======= +>>>>>>> db38729 (delete flake8) pygments==2.14.0 # via diff-cover >>>>>>> f0d0cd8 (create gitlab-ci.yml) diff --git a/readMe.md b/readMe.md index 9acdec4..b50408a 100644 --- a/readMe.md +++ b/readMe.md @@ -33,4 +33,3 @@ Si il y a des erreurs BLACK, on peut lancer black pour linter le code : ```bash black . ``` - diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index f0a1c3b..0000000 --- a/setup.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[flake8] -exclude = migrations -extend-ignore = E501 \ No newline at end of file From d0279578a5d2de55a61d5601f5615c21c89a36a1 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Fri, 7 Apr 2023 15:54:07 +0200 Subject: [PATCH 10/18] tests on GroupedOrderDetailView --- la_chariotte/order/tests/test_models.py | 32 +------ la_chariotte/order/tests/test_views.py | 110 ------------------------ pyproject.toml | 3 - 3 files changed, 1 insertion(+), 144 deletions(-) diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index e4db427..06ca6d8 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -1,48 +1,25 @@ import datetime from django.utils import timezone -<<<<<<< HEAD - from la_chariotte.order.models import GroupedOrder class TestGroupedOrdersModel: """Tests for Grouped orders model""" - -======= -from la_chariotte.order.models import Grouped_order - - -class TestGroupedOrdersModel: - """Tests for Grouped orders model""" -<<<<<<< HEAD ->>>>>>> 9cc7783 (install pytest) -======= - ->>>>>>> f6ec481 (install black and format files) def test_is_ongoing_with_ongoing_grouped_order(self): """ is_ongoing() returns True if the deadline is not crossed """ deadline = timezone.now() + datetime.timedelta(days=10) -<<<<<<< HEAD + ongoing_gr_order = GroupedOrder(deadline=deadline) assert ongoing_gr_order.is_ongoing() -======= - ongoing_gr_order = Grouped_order(deadline=deadline) -<<<<<<< HEAD - assert ongoing_gr_order.is_ongoing() == True ->>>>>>> 9cc7783 (install pytest) -======= - assert ongoing_gr_order.is_ongoing() ->>>>>>> 7882cae (install flake8 and check files) def test_is_ongoing_with_old_grouped_order(self): """ is_ongoing() returns False if the deadline is crossed """ deadline = timezone.now() - datetime.timedelta(hours=1) -<<<<<<< HEAD old_gr_order = GroupedOrder(deadline=deadline) assert not old_gr_order.is_ongoing() @@ -70,10 +47,3 @@ class TestGroupedOrdersModel: del_date = timezone.now().date() + datetime.timedelta(days=1) old_gr_order = GroupedOrder(deadline=deadline, delivery_date=del_date) assert old_gr_order.is_to_be_delivered() -======= - ongoing_gr_order = Grouped_order(deadline=deadline) - assert not ongoing_gr_order.is_ongoing() -<<<<<<< HEAD ->>>>>>> 9cc7783 (install pytest) -======= ->>>>>>> f6ec481 (install black and format files) diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index d56052a..a9e0a59 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -1,7 +1,6 @@ import datetime import pytest -<<<<<<< HEAD from django.urls import reverse from django.utils import timezone @@ -10,29 +9,12 @@ from la_chariotte.order.models import GroupedOrder, Item, Order pytestmark = pytest.mark.django_db -def create_grouped_order(days_before_delivery_date, days_before_deadline, name): -======= - -from django.urls import reverse -from django.utils import timezone -from la_chariotte.order.models import Grouped_order - -pytestmark = pytest.mark.django_db - -<<<<<<< HEAD def create_grouped_order(days_before_delivery_date,days_before_deadline,name): ->>>>>>> 9cc7783 (install pytest) -======= - -def create_grouped_order(days_before_delivery_date, days_before_deadline, name): ->>>>>>> f6ec481 (install black and format files) """ Creates a grouped order. """ date = timezone.now().date() + datetime.timedelta(days=days_before_delivery_date) deadline = timezone.now() + datetime.timedelta(days=days_before_deadline) -<<<<<<< HEAD -<<<<<<< HEAD return GroupedOrder.objects.create( name=name, orga="test orga", delivery_date=date, deadline=deadline ) @@ -75,14 +57,6 @@ class TestGroupedOrderIndexView: days_before_delivery_date=-1, days_before_deadline=-3, name="old" ) response = client.get(reverse("order:index")) -======= - return Grouped_order.objects.create(name=name, orga="test orga",delivery_date=date,deadline=deadline) -======= - return Grouped_order.objects.create( - name=name, orga="test orga", delivery_date=date, deadline=deadline - ) - ->>>>>>> f6ec481 (install black and format files) class TestGroupedOrderIndexView: def test_no_grouped_orders(self, client): @@ -105,33 +79,15 @@ class TestGroupedOrderIndexView: """ According to their delivery date and deadline, grouped orders are placed in the correct section : several gr orders """ -<<<<<<< HEAD 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") old_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="old") response = client.get(reverse('order:index')) ->>>>>>> 9cc7783 (install pytest) -======= - 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", - ) - old_gr_order = create_grouped_order( - days_before_delivery_date=-1, days_before_deadline=-3, name="old" - ) - response = client.get(reverse("order:index")) ->>>>>>> f6ec481 (install black and format files) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() assert "Livraison à venir" in response.content.decode() assert "Livraison passée" in response.content.decode() -<<<<<<< HEAD -<<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 assert ( len( @@ -139,11 +95,6 @@ class TestGroupedOrderIndexView: "crossed_deadline_grouped_orders" ] ) -======= - assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 - assert ( - len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) ->>>>>>> f6ec481 (install black and format files) == 1 ) assert ( @@ -154,18 +105,13 @@ class TestGroupedOrderIndexView: == old_gr_order ) assert ( -<<<<<<< HEAD response.context["grouped_order_list"]["crossed_deadline_grouped_orders"][0] -======= - response.context["grouped_order_list"]["orders_over_grouped_orders"][0] ->>>>>>> f6ec481 (install black and format files) == crossed_deadline_gr_order ) assert ( response.context["grouped_order_list"]["incoming_grouped_orders"][0] == future_grouped_order ) -<<<<<<< HEAD def test_grouped_orders_in_right_section__with_only_old(self, client): """ @@ -175,37 +121,18 @@ class TestGroupedOrderIndexView: days_before_delivery_date=-1, days_before_deadline=-3, name="passée" ) response = client.get(reverse("order:index")) -======= - assert len(response.context['grouped_order_list']['old_grouped_orders']) == 1 - assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 1 - assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 1 - assert response.context['grouped_order_list']['old_grouped_orders'][0] == old_gr_order - assert response.context['grouped_order_list']['orders_over_grouped_orders'][0] == crossed_deadline_gr_order - assert response.context['grouped_order_list']['incoming_grouped_orders'][0] == future_grouped_order -======= ->>>>>>> f6ec481 (install black and format files) def test_grouped_orders_in_right_section__with_only_old(self, client): """ According to their delivery date and deadline, grouped orders are placed in correct section : only old gr order """ -<<<<<<< HEAD old_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="passée") response = client.get(reverse('order:index')) ->>>>>>> 9cc7783 (install pytest) -======= - old_gr_order = create_grouped_order( - days_before_delivery_date=-1, days_before_deadline=-3, name="passée" - ) - response = client.get(reverse("order:index")) ->>>>>>> f6ec481 (install black and format files) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" not in response.content.decode() assert "Livraison à venir" not in response.content.decode() assert "Livraison passée" in response.content.decode() -<<<<<<< HEAD -<<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 assert ( len( @@ -213,11 +140,6 @@ class TestGroupedOrderIndexView: "crossed_deadline_grouped_orders" ] ) -======= - assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 1 - assert ( - len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) ->>>>>>> f6ec481 (install black and format files) == 0 ) assert ( @@ -227,7 +149,6 @@ class TestGroupedOrderIndexView: response.context["grouped_order_list"]["old_grouped_orders"][0] == old_gr_order ) -<<<<<<< HEAD def test_grouped_orders_in_right_section__with_only_future(self, client): """ @@ -237,35 +158,18 @@ class TestGroupedOrderIndexView: days_before_delivery_date=5, days_before_deadline=2, name="future" ) response = client.get(reverse("order:index")) -======= - assert len(response.context['grouped_order_list']['old_grouped_orders']) == 1 - assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 0 - assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 0 - assert response.context['grouped_order_list']['old_grouped_orders'][0] == old_gr_order -======= ->>>>>>> f6ec481 (install black and format files) def test_grouped_orders_in_right_section__with_only_future(self, client): """ According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr order """ -<<<<<<< HEAD future_grouped_order = create_grouped_order(days_before_delivery_date=5,days_before_deadline=2,name="future") response = client.get(reverse('order:index')) ->>>>>>> 9cc7783 (install pytest) -======= - future_grouped_order = create_grouped_order( - days_before_delivery_date=5, days_before_deadline=2, name="future" - ) - response = client.get(reverse("order:index")) ->>>>>>> f6ec481 (install black and format files) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() assert "Livraison à venir" not in response.content.decode() assert "Livraison passée" not in response.content.decode() -<<<<<<< HEAD -<<<<<<< HEAD assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0 assert ( len( @@ -273,11 +177,6 @@ class TestGroupedOrderIndexView: "crossed_deadline_grouped_orders" ] ) -======= - assert len(response.context["grouped_order_list"]["old_grouped_orders"]) == 0 - assert ( - len(response.context["grouped_order_list"]["orders_over_grouped_orders"]) ->>>>>>> f6ec481 (install black and format files) == 0 ) assert ( @@ -287,7 +186,6 @@ class TestGroupedOrderIndexView: response.context["grouped_order_list"]["incoming_grouped_orders"][0] == future_grouped_order ) -<<<<<<< HEAD class TestGroupedOrderDetailView: @@ -333,11 +231,3 @@ class TestGroupedOrderDetailView: assert item.ordered_nb == 1 order = Order.objects.first() assert order.ordered_items.count() == 1 -======= - assert len(response.context['grouped_order_list']['old_grouped_orders']) == 0 - assert len(response.context['grouped_order_list']['orders_over_grouped_orders']) == 0 - assert len(response.context['grouped_order_list']['incoming_grouped_orders']) == 1 - assert response.context['grouped_order_list']['incoming_grouped_orders'][0] == future_grouped_order ->>>>>>> 9cc7783 (install pytest) -======= ->>>>>>> f6ec481 (install black and format files) diff --git a/pyproject.toml b/pyproject.toml index 3a5c94b..68763da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,9 +35,6 @@ isort_ignore = ["*migrations/*.py"] [tool.isort] skip_glob = ["*migrations/*.py"] -[tool.pytest.ini_options] -DJANGO_SETTINGS_MODULE = "la_chariotte.settings" - [tool.black] line-length = 88 exclude = ''' From ca026a4617dc511cecaec24002d987c67ca7b658 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 12 Apr 2023 16:18:13 +0200 Subject: [PATCH 11/18] set up basic authentication --- la_chariotte/accounts/__init__.py | 0 la_chariotte/accounts/apps.py | 6 ++++++ la_chariotte/accounts/migrations/__init__.py | 0 la_chariotte/accounts/models.py | 3 +++ .../templates/registration/login.html | 13 +++++++++++++ .../templates/registration/signup.html | 13 +++++++++++++ la_chariotte/accounts/urls.py | 8 ++++++++ la_chariotte/accounts/views.py | 9 +++++++++ la_chariotte/settings.py | 6 +++++- la_chariotte/templates/base.html | 13 +++++++++++++ la_chariotte/templates/home.html | 19 +++++++++++++++++++ la_chariotte/urls.py | 4 ++++ readMe.md | 7 +++++++ 13 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 la_chariotte/accounts/__init__.py create mode 100644 la_chariotte/accounts/apps.py create mode 100644 la_chariotte/accounts/migrations/__init__.py create mode 100644 la_chariotte/accounts/models.py create mode 100644 la_chariotte/accounts/templates/registration/login.html create mode 100644 la_chariotte/accounts/templates/registration/signup.html create mode 100644 la_chariotte/accounts/urls.py create mode 100644 la_chariotte/accounts/views.py create mode 100644 la_chariotte/templates/base.html create mode 100644 la_chariotte/templates/home.html diff --git a/la_chariotte/accounts/__init__.py b/la_chariotte/accounts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/la_chariotte/accounts/apps.py b/la_chariotte/accounts/apps.py new file mode 100644 index 0000000..299b83e --- /dev/null +++ b/la_chariotte/accounts/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "la_chariotte.accounts" diff --git a/la_chariotte/accounts/migrations/__init__.py b/la_chariotte/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/la_chariotte/accounts/models.py b/la_chariotte/accounts/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/la_chariotte/accounts/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/la_chariotte/accounts/templates/registration/login.html b/la_chariotte/accounts/templates/registration/login.html new file mode 100644 index 0000000..b4f1f96 --- /dev/null +++ b/la_chariotte/accounts/templates/registration/login.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block title %}Connexion{% endblock %} + +{% block content %} +

Connexion

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ +{% endblock %} \ No newline at end of file diff --git a/la_chariotte/accounts/templates/registration/signup.html b/la_chariotte/accounts/templates/registration/signup.html new file mode 100644 index 0000000..c049920 --- /dev/null +++ b/la_chariotte/accounts/templates/registration/signup.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block title %}Créer un compte{% endblock %} + +{% block content %} +

Créer un compte

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ +{% endblock %} \ No newline at end of file diff --git a/la_chariotte/accounts/urls.py b/la_chariotte/accounts/urls.py new file mode 100644 index 0000000..7d7d715 --- /dev/null +++ b/la_chariotte/accounts/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from . import views + +app_name = "accounts" +urlpatterns = [ + path("inscription/", views.SignUpView.as_view(), name="signup"), +] diff --git a/la_chariotte/accounts/views.py b/la_chariotte/accounts/views.py new file mode 100644 index 0000000..d9eb103 --- /dev/null +++ b/la_chariotte/accounts/views.py @@ -0,0 +1,9 @@ +from django.contrib.auth.forms import UserCreationForm +from django.urls import reverse_lazy +from django.views import generic + + +class SignUpView(generic.CreateView): + form_class = UserCreationForm + success_url = reverse_lazy("login") + template_name = "registration/signup.html" diff --git a/la_chariotte/settings.py b/la_chariotte/settings.py index 159b46b..9f9afff 100644 --- a/la_chariotte/settings.py +++ b/la_chariotte/settings.py @@ -32,6 +32,7 @@ ALLOWED_HOSTS = [] INSTALLED_APPS = [ "la_chariotte.order", + "la_chariotte.accounts", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", @@ -52,10 +53,13 @@ MIDDLEWARE = [ ROOT_URLCONF = "la_chariotte.urls" +LOGIN_REDIRECT_URL = "home" +LOGOUT_REDIRECT_URL = "home" + TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [], + "DIRS": [BASE_DIR / "la_chariotte" / "templates"], "APP_DIRS": True, "OPTIONS": { "context_processors": [ diff --git a/la_chariotte/templates/base.html b/la_chariotte/templates/base.html new file mode 100644 index 0000000..25ceeb2 --- /dev/null +++ b/la_chariotte/templates/base.html @@ -0,0 +1,13 @@ + + + + + {% block title %}{% endblock %} - La Chariotte + + +
+ {% block content %} + {% endblock %} +
+ + \ No newline at end of file diff --git a/la_chariotte/templates/home.html b/la_chariotte/templates/home.html new file mode 100644 index 0000000..1a10e34 --- /dev/null +++ b/la_chariotte/templates/home.html @@ -0,0 +1,19 @@ +{% extends 'base.html' %} + +{% block title %}Accueil{% endblock %} + +{% block content %} +{% if user.is_authenticated %} + Hi {{ user.username }}! +

+ Mes commandes groupées +

+

+ Se déconnecter +

+{% else %} +

You are not logged in

+ Se connecter +{% endif %} +{% endblock %} + diff --git a/la_chariotte/urls.py b/la_chariotte/urls.py index cdef8bf..12ca068 100644 --- a/la_chariotte/urls.py +++ b/la_chariotte/urls.py @@ -15,8 +15,12 @@ Including another URLconf """ from django.contrib import admin from django.urls import include, path +from django.views.generic.base import TemplateView urlpatterns = [ path("admin/", admin.site.urls), path("commande/", include("la_chariotte.order.urls")), + path("comptes/", include("la_chariotte.accounts.urls")), + path("comptes/", include("django.contrib.auth.urls")), + path("", TemplateView.as_view(template_name="home.html"), name="home"), ] diff --git a/readMe.md b/readMe.md index b50408a..0362734 100644 --- a/readMe.md +++ b/readMe.md @@ -33,3 +33,10 @@ Si il y a des erreurs BLACK, on peut lancer black pour linter le code : ```bash black . ``` + +## Architecture de l'application + +Les différentes applications Django créées sont : + +- Order, pour gérer tout ce qui tourne autour des commandes +- Accounts, pour gérer la création de comptes. Pour la connexion, la déconnexion et le changement de mot de passe, on utilise l'application auth intégrée à Django. From e16447dcffa7542b20c9bb88919ee2774c6a67aa Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Tue, 18 Apr 2023 14:26:42 +0200 Subject: [PATCH 12/18] tests and test fixtures --- conftest.py | 3 +++ la_chariotte/helpers/fixtures.py | 10 ++++++++++ la_chariotte/order/tests/test_views.py | 21 ++++++++++++++++----- la_chariotte/order/views.py | 7 +++++-- la_chariotte/settings.py | 1 + 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 conftest.py create mode 100644 la_chariotte/helpers/fixtures.py diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..92a7127 --- /dev/null +++ b/conftest.py @@ -0,0 +1,3 @@ +pytest_plugins = [ + "la_chariotte.helpers.fixtures", +] diff --git a/la_chariotte/helpers/fixtures.py b/la_chariotte/helpers/fixtures.py new file mode 100644 index 0000000..86dd43c --- /dev/null +++ b/la_chariotte/helpers/fixtures.py @@ -0,0 +1,10 @@ +import pytest + + +@pytest.fixture +def client_log(client, django_user_model): + username = "test@user.fr" + password = "azertypassword" + user = django_user_model.objects.create_user(username=username, password=password) + client.login(username=username, password=password) + return client diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index a9e0a59..dd4c314 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -1,6 +1,7 @@ import datetime import pytest +from django.contrib import auth from django.urls import reverse from django.utils import timezone @@ -21,11 +22,21 @@ def create_grouped_order(days_before_delivery_date,days_before_deadline,name): class TestGroupedOrderIndexView: - def test_no_grouped_orders(self, client): + def test_anonymous_user_redirection(self, client): + """ + If the user is anonymous, they are redirected to login view + """ + assert auth.get_user(client).is_anonymous + response = client.get(reverse("order:index")) + assert response.status_code == 302 + assert response.url.startswith(reverse("login")) + assert response.url.endswith(reverse("order:index")) + + def test_no_grouped_orders(self, client_log): """ If no grouped order exist, an appropriate message is displayed """ - response = client.get(reverse("order:index")) + 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 @@ -41,7 +52,7 @@ class TestGroupedOrderIndexView: len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0 ) - def test_grouped_orders_in_right_section(self, client): + def test_grouped_orders_in_right_section(self, client_log): """ According to their delivery date and deadline, grouped orders are placed in the correct section : several gr orders """ @@ -113,7 +124,7 @@ class TestGroupedOrderIndexView: == future_grouped_order ) - def test_grouped_orders_in_right_section__with_only_old(self, client): + def test_grouped_orders_in_right_section__with_only_old(self, client_log): """ According to their delivery date and deadline, grouped orders are placed in correct section : only old gr order """ @@ -150,7 +161,7 @@ class TestGroupedOrderIndexView: == old_gr_order ) - def test_grouped_orders_in_right_section__with_only_future(self, client): + def test_grouped_orders_in_right_section__with_only_future(self, client_log): """ According to their delivery date and deadline, grouped orders are placed in correct section : only incoming gr order """ diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 8c0e6e1..e91c33a 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -1,15 +1,18 @@ +from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render -from django.urls import reverse +from django.urls import reverse, reverse_lazy from django.utils import timezone from django.views import generic from .models import GroupedOrder, Item, Order, OrderedItem -class IndexView(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é""" + """No permissions restriction""" + template_name = "order/index.html" context_object_name = "grouped_order_list" diff --git a/la_chariotte/settings.py b/la_chariotte/settings.py index 9f9afff..3d6b1b7 100644 --- a/la_chariotte/settings.py +++ b/la_chariotte/settings.py @@ -53,6 +53,7 @@ MIDDLEWARE = [ ROOT_URLCONF = "la_chariotte.urls" +LOGIN_URL = "login" LOGIN_REDIRECT_URL = "home" LOGOUT_REDIRECT_URL = "home" From 2fdc1b686232a2f0bf8020c1453630c062dbd037 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Tue, 18 Apr 2023 16:49:41 +0200 Subject: [PATCH 13/18] 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" From 1edd6322f44e5f12bce4d91aa506fb96cedc67bd Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 19 Apr 2023 17:48:01 +0200 Subject: [PATCH 14/18] Orga View only accessible by orga user --- .../templates/order/grouped_order_detail.html | 14 ++++- .../templates/order/grouped_order_orga.html | 2 +- la_chariotte/order/tests/test_views.py | 57 +++++++++++++++++++ la_chariotte/order/views.py | 9 ++- 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index 09613de..e8ef574 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -11,7 +11,19 @@

Organisateur·ice : {{ grouped_order.orga }}

Date de livraison : {{ grouped_order.delivery_date }}

- les produits disponibles pour cette commande groupée : + {% if not user.is_authenticated %} +

Vous êtes l'organisateur·ice de cette commande groupée ? + + Connectez-vous pour accéder à la page de gestion +

+ {% endif %} + + {% if user == grouped_order.orga %} + + Page de gestion de la comande groupée + {% endif %} + +

les produits disponibles pour cette commande groupée :

    {% for item in grouped_order.item_set.all %} diff --git a/la_chariotte/order/templates/order/grouped_order_orga.html b/la_chariotte/order/templates/order/grouped_order_orga.html index 0cee30b..7a8f469 100644 --- a/la_chariotte/order/templates/order/grouped_order_orga.html +++ b/la_chariotte/order/templates/order/grouped_order_orga.html @@ -29,6 +29,6 @@ {% endfor %}
- Retour à la page de commande + Retour à la page de commande diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index a8766e4..b0a5f03 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -287,3 +287,60 @@ class TestGroupedOrderDetailView: assert item.ordered_nb == 1 order = Order.objects.first() assert order.ordered_items.count() == 1 + + +class TestGroupedOrderOrgaView: + def test_user_not_logged_redirect(self, client, other_user): + """ + A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view + """ + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + orga_view_url = reverse( + "order:grouped_order_orga", + kwargs={ + "pk": grouped_order.pk, + }, + ) + assert auth.get_user(client).is_anonymous + response = client.get(orga_view_url) + assert response.status_code == 302 + assert response.url.startswith(reverse("login")) + assert response.url.endswith( + reverse( + "order:grouped_order_orga", + kwargs={ + "pk": grouped_order.pk, + }, + ) + ) + + def test_user_not_orga_redirect(self, client_log, other_user): + """ + A user that is not orga cannot see the GroupedOrderOrgaView. + They get a 403 forbidden error + """ + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + orga_view_url = reverse( + "order:grouped_order_orga", + kwargs={ + "pk": grouped_order.pk, + }, + ) + detail_view_url = reverse( + "order:grouped_order_detail", + kwargs={ + "pk": grouped_order.pk, + }, + ) + response = client_log.get(orga_view_url) + assert response.status_code == 403 diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 2f3cd43..e6d4f68 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -1,4 +1,4 @@ -from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.urls import reverse, reverse_lazy @@ -58,11 +58,16 @@ class GroupedOrderDetailView(generic.DetailView): context_object_name = "grouped_order" -class GroupedOrderOrgaView(generic.DetailView): +class GroupedOrderOrgaView(UserPassesTestMixin, generic.DetailView): """Overview of a grouped order, for the organizer""" model = GroupedOrder template_name = "order/grouped_order_orga.html" + context_object_name = "grouped_order" + + def test_func(self): + """Accessible only if the requesting user is the grouped order organizer""" + return self.get_object().orga == self.request.user def order( From 8ab776fad02ab8c84d18e8065e787b592650cf4e Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 20 Apr 2023 12:15:30 +0200 Subject: [PATCH 15/18] correct tests --- dev-requirements.txt | 89 ------------------------- la_chariotte/order/tests.py | 25 ------- la_chariotte/order/tests/test_models.py | 2 + la_chariotte/order/tests/test_views.py | 50 ++------------ 4 files changed, 8 insertions(+), 158 deletions(-) delete mode 100644 la_chariotte/order/tests.py diff --git a/dev-requirements.txt b/dev-requirements.txt index fc070ad..f9cc9c8 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -9,85 +9,49 @@ asgiref==3.6.0 attrs==22.2.0 # via pytest black==23.3.0 -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD # via pytest-black build==0.10.0 # via pip-tools chardet==4.0.0 # via diff-cover -======= # via flake8-black build==0.10.0 # via pip-tools ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= - # via - # flake8-black - # pytest-black -======= # via pytest-black ->>>>>>> db38729 (delete flake8) -build==0.10.0 - # via pip-tools chardet==4.0.0 # via diff-cover ->>>>>>> f0d0cd8 (create gitlab-ci.yml) click==8.1.3 # via # black # pip-tools -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) coverage[toml]==7.2.2 # via pytest-cov diff-cover==4.2.3 # via la-chariotte (pyproject.toml) -<<<<<<< HEAD -======= ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) django==4.2 # via la-chariotte (pyproject.toml) exceptiongroup==1.1.1 # via pytest -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> db38729 (delete flake8) importlib-metadata==6.1.0 # via inflect inflect==3.0.2 # via # diff-cover # jinja2-pluralize -======= flake8==6.0.0 # via flake8-black flake8-black==0.3.6 # via la-chariotte (pyproject.toml) -<<<<<<< HEAD ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= importlib-metadata==6.1.0 # via inflect inflect==3.0.2 # via # diff-cover # jinja2-pluralize ->>>>>>> f0d0cd8 (create gitlab-ci.yml) iniconfig==2.0.0 # via pytest isort==5.12.0 # via pytest-isort -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) jinja2==3.1.2 # via # diff-cover @@ -96,16 +60,8 @@ jinja2-pluralize==0.3.0 # via diff-cover markupsafe==2.1.2 # via jinja2 -<<<<<<< HEAD -<<<<<<< HEAD -======= -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) mccabe==0.7.0 # via flake8 ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= ->>>>>>> db38729 (delete flake8) mypy-extensions==1.0.0 # via black packaging==23.0 @@ -120,46 +76,25 @@ pip-tools==6.12.3 platformdirs==3.2.0 # via black pluggy==1.0.0 -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) # via # diff-cover # pytest psycopg2-binary==2.9.6 -<<<<<<< HEAD # via la-chariotte (pyproject.toml) pygments==2.14.0 # via diff-cover -======= - # via pytest -psycopg2==2.9.6 -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) # via la-chariotte (pyproject.toml) -<<<<<<< HEAD pycodestyle==2.10.0 # via flake8 pyflakes==3.0.1 # via flake8 -<<<<<<< HEAD ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= -======= ->>>>>>> db38729 (delete flake8) pygments==2.14.0 # via diff-cover ->>>>>>> f0d0cd8 (create gitlab-ci.yml) pyproject-hooks==1.0.0 # via build pytest==7.2.2 # via # la-chariotte (pyproject.toml) -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) # pytest-black # pytest-cov # pytest-django @@ -168,35 +103,18 @@ pytest-black==0.3.12 # via la-chariotte (pyproject.toml) pytest-cov==4.0.0 # via la-chariotte (pyproject.toml) -<<<<<<< HEAD -======= - # pytest-django - # pytest-isort ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= ->>>>>>> f0d0cd8 (create gitlab-ci.yml) pytest-django==4.5.2 # via la-chariotte (pyproject.toml) pytest-isort==3.1.0 # via la-chariotte (pyproject.toml) sqlparse==0.4.3 # via django -<<<<<<< HEAD -<<<<<<< HEAD toml==0.10.2 # via pytest-black -======= ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= -toml==0.10.2 - # via pytest-black ->>>>>>> f0d0cd8 (create gitlab-ci.yml) tomli==2.0.1 # via # black # build -<<<<<<< HEAD -<<<<<<< HEAD # coverage # pyproject-hooks # pytest @@ -204,21 +122,14 @@ wheel==0.40.0 # via pip-tools zipp==3.15.0 # via importlib-metadata -======= -======= # coverage ->>>>>>> f0d0cd8 (create gitlab-ci.yml) # flake8-black # pyproject-hooks # pytest wheel==0.40.0 # via pip-tools -<<<<<<< HEAD ->>>>>>> 7d1f998 (use pip-compile to generate requirements.txt) -======= zipp==3.15.0 # via importlib-metadata ->>>>>>> f0d0cd8 (create gitlab-ci.yml) # The following packages are considered to be unsafe in a requirements file: # pip diff --git a/la_chariotte/order/tests.py b/la_chariotte/order/tests.py deleted file mode 100644 index 37453f1..0000000 --- a/la_chariotte/order/tests.py +++ /dev/null @@ -1,25 +0,0 @@ -import datetime - -from django.test import TestCase -from django.utils import timezone -from .models import Grouped_order - - -class GroupedOrderModelTests(TestCase): - - def test_is_ongoing_with_ongoing_grouped_order(self): - """ - is_ongoing() returns True if the deadline is not crossed - """ - deadline = timezone.now() + datetime.timedelta(days=10) - ongoing_gr_order = Grouped_order(deadline=deadline) - self.assertIs(ongoing_gr_order.is_ongoing(), True) - - def test_is_ongoing_with_old_grouped_order(self): - """ - is_ongoing() returns False if the deadline is crossed - """ - deadline = timezone.now() - datetime.timedelta(hours=1) - ongoing_gr_order = Grouped_order(deadline=deadline) - self.assertIs(ongoing_gr_order.is_ongoing(), False) - diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index 06ca6d8..ed8612f 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -1,11 +1,13 @@ import datetime from django.utils import timezone + from la_chariotte.order.models import GroupedOrder class TestGroupedOrdersModel: """Tests for Grouped orders model""" + def test_is_ongoing_with_ongoing_grouped_order(self): """ is_ongoing() returns True if the deadline is not crossed diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index b0a5f03..5e7fe3c 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -11,7 +11,9 @@ from la_chariotte.order.models import GroupedOrder, Item, Order pytestmark = pytest.mark.django_db -def create_grouped_order(days_before_delivery_date,days_before_deadline,name): +def create_grouped_order( + days_before_delivery_date, days_before_deadline, name, orga_user +): """ Creates a grouped order. """ @@ -75,33 +77,7 @@ class TestGroupedOrderIndexView: name="old", orga_user=auth.get_user(client_log), ) - response = client.get(reverse("order:index")) - -class TestGroupedOrderIndexView: - def test_no_grouped_orders(self, client): - """ - If no grouped order exist, an appropriate message is displayed - """ - response = client.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"]["orders_over_grouped_orders"]) - == 0 - ) - assert ( - len(response.context["grouped_order_list"]["incoming_grouped_orders"]) == 0 - ) - - def test_grouped_orders_in_right_section(self, client): - """ - 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") - crossed_deadline_gr_order = create_grouped_order(days_before_delivery_date=2, days_before_deadline=-1,name="crossed deadline") - old_gr_order = create_grouped_order(days_before_delivery_date=-1, days_before_deadline=-3,name="old") - response = client.get(reverse('order:index')) + response = client_log.get(reverse("order:index")) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() @@ -142,14 +118,7 @@ class TestGroupedOrderIndexView: name="passée", orga_user=auth.get_user(client_log), ) - response = client.get(reverse("order:index")) - - def test_grouped_orders_in_right_section__with_only_old(self, client): - """ - 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") - response = client.get(reverse('order:index')) + response = client_log.get(reverse("order:index")) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" not in response.content.decode() @@ -182,14 +151,7 @@ class TestGroupedOrderIndexView: name="future", orga_user=auth.get_user(client_log), ) - response = client.get(reverse("order:index")) - - def test_grouped_orders_in_right_section__with_only_future(self, client): - """ - 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") - response = client.get(reverse('order:index')) + response = client_log.get(reverse("order:index")) assert response.status_code == 200 assert "Pas de commande groupée pour l'instant" not in response.content.decode() assert "Commandes groupées à venir" in response.content.decode() From f8d95004c1e56c1ff52ab016e2bd513c286b484d Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 20 Apr 2023 16:18:47 +0200 Subject: [PATCH 16/18] update pyproject.toml --- pyproject.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 68763da..63fdb87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,14 @@ [project] -name = "la chariotte" +name = "la_chariotte" version = "0.0.1" description = "Web application for organising grouped orders" +authors = [{name = "Laetitia Getti", email = "laetitia@chariotte.fr"}] readme = "readMe.md" license = {file = "LICENSE"} -authors = [{name = "Hashbang", email = "support@hashbang.fr"}] +classifiers = ["License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)"] dependencies = [ "django>=4,<5", - "psycopg2>=2,<3", + "psycopg2-binary>=2,<3", ] [build-system] From 3afaafbcdbab86af1df1de7051168e05af20f4f7 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 27 Apr 2023 15:11:46 +0200 Subject: [PATCH 17/18] change grouped_order_orga to grouped_order_overview --- la_chariotte/order/models.py | 8 +- .../templates/order/grouped_order_detail.html | 4 +- ..._orga.html => grouped_order_overview.html} | 0 la_chariotte/order/tests/test_views.py | 8 +- la_chariotte/order/urls.py | 4 +- la_chariotte/order/views.py | 4 +- la_chariotte/readMe.md | 166 ------------------ 7 files changed, 17 insertions(+), 177 deletions(-) rename la_chariotte/order/templates/order/{grouped_order_orga.html => grouped_order_overview.html} (100%) delete mode 100644 la_chariotte/readMe.md diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index ba823d1..7422571 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -4,8 +4,12 @@ from django.utils import timezone class GroupedOrder(models.Model): - name = models.CharField(max_length=100, null=True) # optionnal - orga = models.ForeignKey(User, on_delete=models.CASCADE) + name = models.CharField( + max_length=100, null=True, verbose_name="Titre de la commande" + ) # optionnal + orga = models.ForeignKey( + User, on_delete=models.CASCADE, verbose_name="Organisateur·ice" + ) delivery_date = models.DateField("Date de livraison") deadline = models.DateTimeField("Date limite de commande") diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index e8ef574..d928efb 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -13,13 +13,13 @@ {% if not user.is_authenticated %}

Vous êtes l'organisateur·ice de cette commande groupée ? - + Connectez-vous pour accéder à la page de gestion

{% endif %} {% if user == grouped_order.orga %} - + Page de gestion de la comande groupée {% endif %} diff --git a/la_chariotte/order/templates/order/grouped_order_orga.html b/la_chariotte/order/templates/order/grouped_order_overview.html similarity index 100% rename from la_chariotte/order/templates/order/grouped_order_orga.html rename to la_chariotte/order/templates/order/grouped_order_overview.html diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 5e7fe3c..6b1bf64 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -240,7 +240,7 @@ class TestGroupedOrderDetailView: ) assert response.status_code == 302 assert response.url == reverse( - "order:grouped_order_orga", + "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, @@ -263,7 +263,7 @@ class TestGroupedOrderOrgaView: orga_user=other_user, ) orga_view_url = reverse( - "order:grouped_order_orga", + "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, @@ -274,7 +274,7 @@ class TestGroupedOrderOrgaView: assert response.url.startswith(reverse("login")) assert response.url.endswith( reverse( - "order:grouped_order_orga", + "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, @@ -293,7 +293,7 @@ class TestGroupedOrderOrgaView: orga_user=other_user, ) orga_view_url = reverse( - "order:grouped_order_orga", + "order:grouped_order_overview", kwargs={ "pk": grouped_order.pk, }, diff --git a/la_chariotte/order/urls.py b/la_chariotte/order/urls.py index a769aa3..56d4ad7 100644 --- a/la_chariotte/order/urls.py +++ b/la_chariotte/order/urls.py @@ -9,7 +9,9 @@ urlpatterns = [ "/", views.GroupedOrderDetailView.as_view(), name="grouped_order_detail" ), path( - "/orga", views.GroupedOrderOrgaView.as_view(), name="grouped_order_orga" + "/gerer", + views.GroupedOrderOrgaView.as_view(), + name="grouped_order_overview", ), path("/commander/", views.order, name="order"), ] diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index e6d4f68..b117980 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -62,7 +62,7 @@ class GroupedOrderOrgaView(UserPassesTestMixin, generic.DetailView): """Overview of a grouped order, for the organizer""" model = GroupedOrder - template_name = "order/grouped_order_orga.html" + template_name = "order/grouped_order_overview.html" context_object_name = "grouped_order" def test_func(self): @@ -95,7 +95,7 @@ def order( # with POST data. This prevents data from being posted twice if a # user hits the Back button. return HttpResponseRedirect( - reverse("order:grouped_order_orga", args=(grouped_order.pk,)) + reverse("order:grouped_order_overview", args=(grouped_order.pk,)) ) diff --git a/la_chariotte/readMe.md b/la_chariotte/readMe.md deleted file mode 100644 index 6e6799f..0000000 --- a/la_chariotte/readMe.md +++ /dev/null @@ -1,166 +0,0 @@ -Exemple de MCD en markdown avec mermaid : - - -```mermaid -erDiagram -CourseSubmission{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField title -DateField date -FSMField state -} -CourseSubmissionProduct{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -PositiveSmallIntegerField quantity -} -Pricing{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField name -} -Product{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField name -CharField code -BooleanField submission_enabled -} -ProductPrice{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -PositiveSmallIntegerField year -CharField price_type -DecimalField price_flat -PositiveSmallIntegerField price_percent -DecimalField price_percent_minimum -CharField unit -} -ProductPriceRange{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -PositiveSmallIntegerField range_start -PositiveSmallIntegerField range_end -DecimalField unit_price -DecimalField minimum -} -ProductPricePackLine_included_products{ -AutoField id -} -ProductPricePackLine{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField quantity_type -PositiveSmallIntegerField quantity -} -Contract{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -DateField start -DateField end -FileField file -} -Transaction_products{ -AutoField id -} -Transaction{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -PositiveIntegerField debit -PositiveIntegerField credit -BooleanField unlimited_credit -} -Quote{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField external_ref -FSMField state -} -QuoteLine{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -TextField label -DecimalField unit_price -DecimalField quantity -} -Invoice{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField external_ref -FSMField state -} -InvoiceLine{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -TextField label -DecimalField unit_price -DecimalField quantity -} -User{ -CharField password -DateTimeField last_login -BooleanField is_superuser -CharField username -CharField first_name -CharField last_name -EmailField email -BooleanField is_staff -BooleanField is_active -DateTimeField date_joined -UUIDField id -DateTimeField created_on -DateTimeField updated_on -ManyToManyField groups -ManyToManyField user_permissions -} -Organization{ -UUIDField id -DateTimeField created_on -DateTimeField updated_on -CharField code -CharField representative -FileField signature -FileField logo -} -CourseSubmission||--|{User : user -CourseSubmission||--|{Organization : organization -CourseSubmissionProduct||--|{CourseSubmission : course_submission -CourseSubmissionProduct||--|{Product : product -ProductPrice||--|{Pricing : pricing -ProductPrice||--|{Product : product -ProductPriceRange||--|{ProductPrice : product_price -ProductPricePackLine_included_products||--|{ProductPricePackLine : productpricepackline -ProductPricePackLine_included_products||--|{Product : product -ProductPricePackLine||--|{ProductPrice : product_price -ProductPricePackLine}|--|{Product : included_products -Contract||--|{Organization : organization -Contract||--|{Pricing : pricing -Transaction_products||--|{Transaction : transaction -Transaction_products||--|{Product : product -Transaction||--|{Invoice : invoice -Transaction||--|{CourseSubmission : course_submission -Transaction}|--|{Product : products -Quote||--|{Organization : organization -QuoteLine||--|{Quote : quote -QuoteLine||--|{Product : product -Invoice||--|{Organization : organization -InvoiceLine||--|{Invoice : invoice -InvoiceLine||--|{Product : product -Organization||--|{User : representative_user -Organization||--|{Organization : parent - -``` From c1984ed677b2d0c4ad2e66bcab624c65a77f3722 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Thu, 27 Apr 2023 15:29:02 +0200 Subject: [PATCH 18/18] rename readme and change accounts urls --- readMe.md => README.md | 0 la_chariotte/accounts/templates/registration/login.html | 1 + la_chariotte/accounts/urls.py | 3 ++- la_chariotte/accounts/views.py | 2 +- la_chariotte/order/templates/order/grouped_order_detail.html | 2 +- la_chariotte/order/tests/test_views.py | 4 ++-- la_chariotte/settings.py | 2 +- la_chariotte/templates/home.html | 4 ++-- la_chariotte/urls.py | 1 - 9 files changed, 10 insertions(+), 9 deletions(-) rename readMe.md => README.md (100%) diff --git a/readMe.md b/README.md similarity index 100% rename from readMe.md rename to README.md diff --git a/la_chariotte/accounts/templates/registration/login.html b/la_chariotte/accounts/templates/registration/login.html index b4f1f96..dacc4b9 100644 --- a/la_chariotte/accounts/templates/registration/login.html +++ b/la_chariotte/accounts/templates/registration/login.html @@ -8,6 +8,7 @@ {% csrf_token %} {{ form.as_p }} + Créer un compte {% endblock %} \ No newline at end of file diff --git a/la_chariotte/accounts/urls.py b/la_chariotte/accounts/urls.py index 7d7d715..ebf4479 100644 --- a/la_chariotte/accounts/urls.py +++ b/la_chariotte/accounts/urls.py @@ -1,8 +1,9 @@ -from django.urls import path +from django.urls import include, path from . import views app_name = "accounts" urlpatterns = [ path("inscription/", views.SignUpView.as_view(), name="signup"), + path("", include("django.contrib.auth.urls")), ] diff --git a/la_chariotte/accounts/views.py b/la_chariotte/accounts/views.py index d9eb103..bf85312 100644 --- a/la_chariotte/accounts/views.py +++ b/la_chariotte/accounts/views.py @@ -5,5 +5,5 @@ from django.views import generic class SignUpView(generic.CreateView): form_class = UserCreationForm - success_url = reverse_lazy("login") + success_url = reverse_lazy("accounts:login") template_name = "registration/signup.html" diff --git a/la_chariotte/order/templates/order/grouped_order_detail.html b/la_chariotte/order/templates/order/grouped_order_detail.html index d928efb..8ad777f 100644 --- a/la_chariotte/order/templates/order/grouped_order_detail.html +++ b/la_chariotte/order/templates/order/grouped_order_detail.html @@ -20,7 +20,7 @@ {% if user == grouped_order.orga %} - Page de gestion de la comande groupée + Page de gestion de la commande groupée {% endif %}

les produits disponibles pour cette commande groupée :

diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 6b1bf64..715d857 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -32,7 +32,7 @@ class TestGroupedOrderIndexView: assert auth.get_user(client).is_anonymous response = client.get(reverse("order:index")) assert response.status_code == 302 - assert response.url.startswith(reverse("login")) + assert response.url.startswith(reverse("accounts:login")) assert response.url.endswith(reverse("order:index")) def test_no_grouped_orders(self, client_log): @@ -271,7 +271,7 @@ class TestGroupedOrderOrgaView: assert auth.get_user(client).is_anonymous response = client.get(orga_view_url) assert response.status_code == 302 - assert response.url.startswith(reverse("login")) + assert response.url.startswith(reverse("accounts:login")) assert response.url.endswith( reverse( "order:grouped_order_overview", diff --git a/la_chariotte/settings.py b/la_chariotte/settings.py index 3d6b1b7..7bb7f4d 100644 --- a/la_chariotte/settings.py +++ b/la_chariotte/settings.py @@ -53,7 +53,7 @@ MIDDLEWARE = [ ROOT_URLCONF = "la_chariotte.urls" -LOGIN_URL = "login" +LOGIN_URL = "accounts:login" LOGIN_REDIRECT_URL = "home" LOGOUT_REDIRECT_URL = "home" diff --git a/la_chariotte/templates/home.html b/la_chariotte/templates/home.html index 1a10e34..8ae7be6 100644 --- a/la_chariotte/templates/home.html +++ b/la_chariotte/templates/home.html @@ -9,11 +9,11 @@ Mes commandes groupées

- Se déconnecter + Se déconnecter

{% else %}

You are not logged in

- Se connecter + Se connecter {% endif %} {% endblock %} diff --git a/la_chariotte/urls.py b/la_chariotte/urls.py index 12ca068..0a86d20 100644 --- a/la_chariotte/urls.py +++ b/la_chariotte/urls.py @@ -21,6 +21,5 @@ urlpatterns = [ path("admin/", admin.site.urls), path("commande/", include("la_chariotte.order.urls")), path("comptes/", include("la_chariotte.accounts.urls")), - path("comptes/", include("django.contrib.auth.urls")), path("", TemplateView.as_view(template_name="home.html"), name="home"), ]