separate date and time in grouped order create form

closes #88
This commit is contained in:
Laetitia Getti 2023-06-26 15:20:08 +02:00
parent 8a2852794e
commit 4f98a5ec88
7 changed files with 84 additions and 18 deletions

View file

@ -1,20 +1,38 @@
import datetime
from django import forms from django import forms
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db import IntegrityError from django.db import IntegrityError
from la_chariotte import settings
from la_chariotte.order.models import GroupedOrder, Item from la_chariotte.order.models import GroupedOrder, Item
class GroupedOrderForm(forms.ModelForm): 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: class Meta:
model = GroupedOrder model = GroupedOrder
fields = ["name", "deadline", "delivery_date", "place", "description"] fields = [
"name",
"deadline_date",
"deadline_time",
"delivery_date",
"place",
"description",
]
widgets = { widgets = {
"name": forms.TextInput( "name": forms.TextInput(
attrs={"placeholder": "ex : Des oranges pour Noël"} attrs={"placeholder": "ex : Des oranges pour Noël"}
), ),
"deadline": forms.DateTimeInput(attrs={"type": "datetime-local"}),
"delivery_date": forms.DateInput(attrs={"type": "date"}), "delivery_date": forms.DateInput(attrs={"type": "date"}),
"place": forms.TextInput(attrs={"placeholder": "(facultatif)"}), "place": forms.TextInput(attrs={"placeholder": "(facultatif)"}),
"description": forms.Textarea( "description": forms.Textarea(
@ -34,6 +52,9 @@ class GroupedOrderForm(forms.ModelForm):
def clean(self): def clean(self):
cleaned_data = self.cleaned_data cleaned_data = self.cleaned_data
self.instance.deadline = datetime.datetime.combine(
self.cleaned_data["deadline_date"], self.cleaned_data["deadline_time"]
)
try: try:
GroupedOrder.objects.get( GroupedOrder.objects.get(

View file

@ -8,6 +8,8 @@
</p> </p>
<div class="box"> <div class="box">
<p class="title">Nouvelle commande</p> <p class="title">Nouvelle commande</p>
<div class="columns">
<div class="column is-8">
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<div class="buttons"> <div class="buttons">
@ -16,4 +18,6 @@
</div> </div>
</form> </form>
</div> </div>
</div>
</div>
{% endblock %} {% endblock %}

View file

@ -62,7 +62,12 @@ class TestGroupedOrderModel:
deadline = timezone.now() + datetime.timedelta(days=32) deadline = timezone.now() + datetime.timedelta(days=32)
response = client_log.post( response = client_log.post(
create_gorder_url, 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 response.status_code == 200
assert not response.context.get("form").is_valid() assert not response.context.get("form").is_valid()
@ -83,7 +88,12 @@ class TestGroupedOrderModel:
deadline = timezone.now() + datetime.timedelta(days=32) deadline = timezone.now() + datetime.timedelta(days=32)
response = client_log.post( response = client_log.post(
create_gorder_url, 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.status_code == 302
assert GroupedOrder.objects.count() == 1 assert GroupedOrder.objects.count() == 1
@ -98,7 +108,12 @@ class TestGroupedOrderModel:
deadline = timezone.now() - datetime.timedelta(days=3) deadline = timezone.now() - datetime.timedelta(days=3)
response = client_log.post( response = client_log.post(
create_gorder_url, 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 response.status_code == 200
assert not response.context.get("form").is_valid() assert not response.context.get("form").is_valid()
@ -126,7 +141,12 @@ class TestGroupedOrderModel:
deadline_2 = timezone.now() + datetime.timedelta(days=15) deadline_2 = timezone.now() + datetime.timedelta(days=15)
response = client_log.post( response = client_log.post(
create_gorder_url, 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 response.status_code == 200
assert not response.context.get("form").is_valid() assert not response.context.get("form").is_valid()

View file

@ -942,7 +942,12 @@ class TestGroupedOrderCreateView:
deadline = timezone.now() + datetime.timedelta(days=32) deadline = timezone.now() + datetime.timedelta(days=32)
response = client_log.post( response = client_log.post(
create_gorder_url, 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.status_code == 302
assert response.url.endswith("gerer-produits") assert response.url.endswith("gerer-produits")
@ -1141,7 +1146,12 @@ class TestGroupedOrderAddItemsView:
deadline = timezone.now() + datetime.timedelta(days=32) deadline = timezone.now() + datetime.timedelta(days=32)
response = client_log.post( response = client_log.post(
create_gorder_url, 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.status_code == 302
assert response.url.endswith("gerer-produits") assert response.url.endswith("gerer-produits")

View file

@ -129,6 +129,10 @@ LANGUAGE_CODE = "fr-FR"
TIME_ZONE = "Europe/Paris" TIME_ZONE = "Europe/Paris"
TIME_INPUT_FORMATS = ["%H:%M"]
DATE_INPUT_FORMATS = ["%d/%m/%Y"]
USE_I18N = True USE_I18N = True
USE_TZ = True USE_TZ = True

View file

@ -10401,15 +10401,19 @@ a.navbar-item:hover {
width: unset; width: unset;
} }
.mini-title, form p label { .mini-title {
color: #7a7a7a; color: #7a7a7a;
font-size: 0.8rem; font-size: 0.8rem;
margin-bottom: 0px !important; margin-bottom: 0px !important;
} }
form p label {
margin-bottom: 0px;
}
form p label ~ input, form p label ~ textarea { form p label ~ input, form p label ~ textarea {
display: block; display: block;
max-width: 100%; width: 100%;
box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05); box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05);
} }

View file

@ -23,14 +23,17 @@
// Forms // Forms
.mini-title, form p label .mini-title
color: $grey-text color: $grey-text
font-size: 0.8rem font-size: 0.8rem
margin-bottom: 0px !important margin-bottom: 0px !important
form p label
margin-bottom: 0px
form form
p p
label ~ input, label ~ textarea label ~ input, label ~ textarea
display: block display: block
max-width: 100% width: 100%
box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05) box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05)