use GOForm for updating and warning message when deadline in the past

closes #94
This commit is contained in:
Laetitia Getti 2023-07-04 17:19:28 +02:00
parent f32987457d
commit afea416d42
9 changed files with 63 additions and 58 deletions

View file

@ -11,7 +11,8 @@ from la_chariotte.order.models import GroupedOrder, Item
class GroupedOrderForm(forms.ModelForm): class GroupedOrderForm(forms.ModelForm):
deadline_date = forms.DateField( deadline_date = forms.DateField(
label="Date limite de commande", widget=forms.DateInput(attrs={"type": "date"}) label="Date limite de commande",
widget=forms.DateInput(attrs={"type": "date"}, format=("%Y-%m-%d")),
) )
deadline_time = forms.TimeField( deadline_time = forms.TimeField(
label="Heure limite de commande", label="Heure limite de commande",
@ -33,7 +34,10 @@ class GroupedOrderForm(forms.ModelForm):
"name": forms.TextInput( "name": forms.TextInput(
attrs={"placeholder": "ex : Des oranges pour Noël"} attrs={"placeholder": "ex : Des oranges pour Noël"}
), ),
"delivery_date": forms.DateInput(attrs={"type": "date"}), "delivery_date": forms.DateInput(
attrs={"type": "date"},
format=("%Y-%m-%d"),
),
"place": forms.TextInput(attrs={"placeholder": "(facultatif)"}), "place": forms.TextInput(attrs={"placeholder": "(facultatif)"}),
"description": forms.Textarea( "description": forms.Textarea(
attrs={ attrs={
@ -46,6 +50,12 @@ class GroupedOrderForm(forms.ModelForm):
self.user = kwargs.pop("user") self.user = kwargs.pop("user")
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# use object values if we are updating it
if kwargs["instance"]: # the Grouped Order already exists
self.initial["deadline_date"] = self.instance.deadline.date()
self.initial["deadline_time"] = self.instance.deadline.time()
# TODO: there is a bug here ; the time displayed in form is 2 hours earlier than the actual deadline time
def save(self, commit=True): def save(self, commit=True):
self.instance.orga = get_user_model().objects.get(id=self.user.pk) self.instance.orga = get_user_model().objects.get(id=self.user.pk)
return super().save(commit=commit) return super().save(commit=commit)
@ -56,18 +66,6 @@ class GroupedOrderForm(forms.ModelForm):
self.cleaned_data["deadline_date"], self.cleaned_data["deadline_time"] self.cleaned_data["deadline_date"], self.cleaned_data["deadline_time"]
) )
try:
GroupedOrder.objects.get(
name=cleaned_data["name"],
delivery_date=cleaned_data["delivery_date"],
orga=get_user_model().objects.get(id=self.user.pk),
)
except GroupedOrder.DoesNotExist:
pass
else:
raise ValidationError(
"Une commande groupée avec le même titre et la même date existe déjà"
)
return cleaned_data return cleaned_data

View file

@ -0,0 +1,16 @@
# Generated by Django 4.2 on 2023-07-04 15:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("order", "0021_alter_orderauthor_email_alter_orderauthor_phone"),
]
operations = [
migrations.AlterUniqueTogether(
name="groupedorder",
unique_together=set(),
),
]

View file

@ -21,9 +21,6 @@ class GroupedOrder(models.Model):
description = models.TextField("Description", null=True, blank=True) description = models.TextField("Description", null=True, blank=True)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
class Meta:
unique_together = ["delivery_date", "name", "orga"]
def compute_total_price(self): def compute_total_price(self):
price = 0 price = 0
for order in self.order_set.all(): for order in self.order_set.all():
@ -59,9 +56,6 @@ class GroupedOrder(models.Model):
"La date limite de commande doit être avant la date de livraison" "La date limite de commande doit être avant la date de livraison"
) )
def validate_unique(self, exclude=None):
super(GroupedOrder, self).validate_unique(exclude=exclude)
def __str__(self): # pragma: no cover def __str__(self): # pragma: no cover
return ( return (
self.name self.name

View file

@ -10,7 +10,7 @@
<p class="title">Nouvelle commande</p> <p class="title">Nouvelle commande</p>
<div class="columns"> <div class="columns">
<div class="column is-8"> <div class="column is-8">
<form method="post">{% csrf_token %} <form method="post" onsubmit="deadlinePassedCheck(event)">{% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<div class="buttons"> <div class="buttons">
<a class="button is-light" href="{% url 'order:index' %}">Annuler</a> <a class="button is-light" href="{% url 'order:index' %}">Annuler</a>
@ -21,3 +21,7 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block extra_js %}
{% include 'warning_grouped_order_creation.html' %}
{% endblock %}

View file

@ -8,7 +8,7 @@
</p> </p>
<div class="box"> <div class="box">
<p class="title">{{ grouped_order.name }} - modifier</p> <p class="title">{{ grouped_order.name }} - modifier</p>
<form method="post">{% csrf_token %} <form method="post" onsubmit="deadlinePassedCheck(event)">{% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<div class="buttons"> <div class="buttons">
<a class="button is-light" href="{% url 'order:index' %}">Annuler</a> <a class="button is-light" href="{% url 'order:index' %}">Annuler</a>
@ -17,3 +17,7 @@
</form> </form>
</div> </div>
{% endblock %} {% endblock %}
{% block extra_js %}
{% include 'warning_grouped_order_creation.html' %}
{% endblock %}

View file

@ -0,0 +1,15 @@
function deadlinePassedCheck(e){
// If the deadline is in the past, asks for a confirmation
deadline = document.getElementById("id_deadline_date").valueAsDate;
deadline_time = document.getElementById("id_deadline_time").value;
today = new Date();
deadline.setHours(deadline_time.substring(0,2));
deadline.setMinutes(deadline_time.substring(3));
if(deadline < today){
console.log("passé,"+today);
if(confirm("La date limite de commande est dans le passé. Voulez-vous vraiment continuer ?") == false){
e.preventDefault();
};
};
};

View file

@ -123,36 +123,3 @@ class TestGroupedOrderModel:
) )
"La date de livraison ne doit pas être dans le passé" in response.content.decode() "La date de livraison ne doit pas être dans le passé" in response.content.decode()
assert GroupedOrder.objects.count() == 0 assert GroupedOrder.objects.count() == 0
def test_validation_error_unique_together(self, client_log):
"""If a grouped order with the same orga, delivery date and name of the order already exist, a validation error is raised"""
deadline_1 = timezone.now().date() + datetime.timedelta(days=12)
date = timezone.now().date() + datetime.timedelta(days=19)
GroupedOrder.objects.create(
name="commande",
orga=auth.get_user(client_log),
delivery_date=date,
deadline=deadline_1,
)
assert GroupedOrder.objects.count() == 1
create_gorder_url = reverse("order:create_grouped_order")
response = client_log.get(create_gorder_url)
assert response.status_code == 200
deadline_2 = timezone.now() + datetime.timedelta(days=15)
response = client_log.post(
create_gorder_url,
{
"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()
assert (
response.context.get("form").errors["__all__"][0]
== "Une commande groupée avec le même titre et la même date existe déjà"
)
"Une commande groupée avec le même titre et la même date existe déjà" in response.content.decode()
assert GroupedOrder.objects.count() == 1

View file

@ -994,7 +994,8 @@ class TestGroupedOrderUpdateView:
update_grouped_order_url, update_grouped_order_url,
{ {
"name": "titre test modifié", "name": "titre test modifié",
"deadline": deadline, "deadline_date": deadline.date(),
"deadline_time": deadline.time().strftime("%H:%M"),
"delivery_date": date, "delivery_date": date,
"place": "quelque part", "place": "quelque part",
}, },
@ -1034,7 +1035,8 @@ class TestGroupedOrderUpdateView:
update_grouped_order_url, update_grouped_order_url,
{ {
"name": "titre test modifié", "name": "titre test modifié",
"deadline": deadline, "deadline_date": deadline.date(),
"deadline_time": deadline.time().strftime("%H:%M"),
"delivery_date": date, "delivery_date": date,
"place": "quelque part", "place": "quelque part",
}, },

View file

@ -116,13 +116,18 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView):
model = GroupedOrder model = GroupedOrder
template_name = "order/grouped_order_update.html" template_name = "order/grouped_order_update.html"
fields = ["name", "deadline", "delivery_date", "place", "description"]
context_object_name = "grouped_order" context_object_name = "grouped_order"
form_class = GroupedOrderForm
def test_func(self): def test_func(self):
"""Accessible only if the requesting user is the grouped order organizer""" """Accessible only if the requesting user is the grouped order organizer"""
return self.get_object().orga == self.request.user return self.get_object().orga == self.request.user
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs
class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView): class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView):
"""After creating grouped order, view for adding items to it""" """After creating grouped order, view for adding items to it"""