From 4f98a5ec88dc9227924af37da8ea3ad05cd4a7ca Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Mon, 26 Jun 2023 15:20:08 +0200 Subject: [PATCH] separate date and time in grouped order create form closes #88 --- la_chariotte/order/forms.py | 25 +++++++++++++++-- .../templates/order/grouped_order_create.html | 16 +++++++---- la_chariotte/order/tests/test_models.py | 28 ++++++++++++++++--- la_chariotte/order/tests/test_views.py | 14 ++++++++-- la_chariotte/settings.py | 4 +++ la_chariotte/static/css/app.css | 8 ++++-- la_chariotte/static/sass/base/_form.sass | 7 +++-- 7 files changed, 84 insertions(+), 18 deletions(-) diff --git a/la_chariotte/order/forms.py b/la_chariotte/order/forms.py index c504496..9a962aa 100644 --- a/la_chariotte/order/forms.py +++ b/la_chariotte/order/forms.py @@ -1,20 +1,38 @@ +import datetime + from django import forms from django.contrib.auth import get_user_model from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.db import IntegrityError +from la_chariotte import settings from la_chariotte.order.models import GroupedOrder, Item class GroupedOrderForm(forms.ModelForm): + deadline_date = forms.DateField( + label="Date limite de commande", widget=forms.DateInput(attrs={"type": "date"}) + ) + deadline_time = forms.TimeField( + label="Heure limite de commande", + widget=forms.TimeInput(attrs={"type": "time"}), + initial=datetime.time(hour=23, minute=59, second=59), + ) + class Meta: model = GroupedOrder - fields = ["name", "deadline", "delivery_date", "place", "description"] + fields = [ + "name", + "deadline_date", + "deadline_time", + "delivery_date", + "place", + "description", + ] widgets = { "name": forms.TextInput( attrs={"placeholder": "ex : Des oranges pour Noël"} ), - "deadline": forms.DateTimeInput(attrs={"type": "datetime-local"}), "delivery_date": forms.DateInput(attrs={"type": "date"}), "place": forms.TextInput(attrs={"placeholder": "(facultatif)"}), "description": forms.Textarea( @@ -34,6 +52,9 @@ class GroupedOrderForm(forms.ModelForm): def clean(self): cleaned_data = self.cleaned_data + self.instance.deadline = datetime.datetime.combine( + self.cleaned_data["deadline_date"], self.cleaned_data["deadline_time"] + ) try: GroupedOrder.objects.get( diff --git a/la_chariotte/order/templates/order/grouped_order_create.html b/la_chariotte/order/templates/order/grouped_order_create.html index 19f15d9..f61a8ca 100644 --- a/la_chariotte/order/templates/order/grouped_order_create.html +++ b/la_chariotte/order/templates/order/grouped_order_create.html @@ -8,12 +8,16 @@

Nouvelle commande

-
{% csrf_token %} - {{ form.as_p }} -
- Annuler - +
+
+ {% csrf_token %} + {{ form.as_p }} +
+ Annuler + +
+
- +
{% endblock %} \ No newline at end of file diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index 09a1c63..55af4e9 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -62,7 +62,12 @@ class TestGroupedOrderModel: deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( create_gorder_url, - {"name": "titre test", "deadline": deadline, "delivery_date": date}, + { + "name": "titre test", + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), + "delivery_date": date, + }, ) assert response.status_code == 200 assert not response.context.get("form").is_valid() @@ -83,7 +88,12 @@ class TestGroupedOrderModel: deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( create_gorder_url, - {"name": "titre test", "deadline": deadline, "delivery_date": date}, + { + "name": "titre test", + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), + "delivery_date": date, + }, ) assert response.status_code == 302 assert GroupedOrder.objects.count() == 1 @@ -98,7 +108,12 @@ class TestGroupedOrderModel: deadline = timezone.now() - datetime.timedelta(days=3) response = client_log.post( create_gorder_url, - {"name": "titre test", "deadline": deadline, "delivery_date": date}, + { + "name": "titre test", + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), + "delivery_date": date, + }, ) assert response.status_code == 200 assert not response.context.get("form").is_valid() @@ -126,7 +141,12 @@ class TestGroupedOrderModel: deadline_2 = timezone.now() + datetime.timedelta(days=15) response = client_log.post( create_gorder_url, - {"name": "commande", "deadline": deadline_2, "delivery_date": date}, + { + "name": "commande", + "deadline_date": deadline_2.date(), + "deadline_time": deadline_2.time().strftime("%H:%M"), + "delivery_date": date, + }, ) assert response.status_code == 200 assert not response.context.get("form").is_valid() diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 6c9bdbb..7faf038 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -942,7 +942,12 @@ class TestGroupedOrderCreateView: deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( create_gorder_url, - {"name": "titre test", "deadline": deadline, "delivery_date": date}, + { + "name": "titre test", + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), + "delivery_date": date, + }, ) assert response.status_code == 302 assert response.url.endswith("gerer-produits") @@ -1141,7 +1146,12 @@ class TestGroupedOrderAddItemsView: deadline = timezone.now() + datetime.timedelta(days=32) response = client_log.post( create_gorder_url, - {"name": "titre test", "deadline": deadline, "delivery_date": date}, + { + "name": "titre test", + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), + "delivery_date": date, + }, ) assert response.status_code == 302 assert response.url.endswith("gerer-produits") diff --git a/la_chariotte/settings.py b/la_chariotte/settings.py index dd261bd..8f52dce 100644 --- a/la_chariotte/settings.py +++ b/la_chariotte/settings.py @@ -129,6 +129,10 @@ LANGUAGE_CODE = "fr-FR" TIME_ZONE = "Europe/Paris" +TIME_INPUT_FORMATS = ["%H:%M"] + +DATE_INPUT_FORMATS = ["%d/%m/%Y"] + USE_I18N = True USE_TZ = True diff --git a/la_chariotte/static/css/app.css b/la_chariotte/static/css/app.css index 826ea44..4154d50 100644 --- a/la_chariotte/static/css/app.css +++ b/la_chariotte/static/css/app.css @@ -10401,15 +10401,19 @@ a.navbar-item:hover { width: unset; } -.mini-title, form p label { +.mini-title { color: #7a7a7a; font-size: 0.8rem; margin-bottom: 0px !important; } +form p label { + margin-bottom: 0px; +} + form p label ~ input, form p label ~ textarea { display: block; - max-width: 100%; + width: 100%; box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05); } diff --git a/la_chariotte/static/sass/base/_form.sass b/la_chariotte/static/sass/base/_form.sass index 470c846..17f13bd 100644 --- a/la_chariotte/static/sass/base/_form.sass +++ b/la_chariotte/static/sass/base/_form.sass @@ -23,14 +23,17 @@ // Forms -.mini-title, form p label +.mini-title color: $grey-text font-size: 0.8rem margin-bottom: 0px !important +form p label + margin-bottom: 0px + form p label ~ input, label ~ textarea display: block - max-width: 100% + width: 100% box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05) \ No newline at end of file