diff --git a/la_chariotte/order/forms.py b/la_chariotte/order/forms.py index 9a962aa..2881ab0 100644 --- a/la_chariotte/order/forms.py +++ b/la_chariotte/order/forms.py @@ -11,7 +11,8 @@ 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"}) + label="Date limite de commande", + widget=forms.DateInput(attrs={"type": "date"}, format=("%Y-%m-%d")), ) deadline_time = forms.TimeField( label="Heure limite de commande", @@ -33,7 +34,10 @@ class GroupedOrderForm(forms.ModelForm): "name": forms.TextInput( 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)"}), "description": forms.Textarea( attrs={ @@ -46,6 +50,12 @@ class GroupedOrderForm(forms.ModelForm): self.user = kwargs.pop("user") 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): self.instance.orga = get_user_model().objects.get(id=self.user.pk) return super().save(commit=commit) @@ -56,18 +66,6 @@ class GroupedOrderForm(forms.ModelForm): 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 diff --git a/la_chariotte/order/migrations/0022_alter_groupedorder_unique_together.py b/la_chariotte/order/migrations/0022_alter_groupedorder_unique_together.py new file mode 100644 index 0000000..26b732e --- /dev/null +++ b/la_chariotte/order/migrations/0022_alter_groupedorder_unique_together.py @@ -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(), + ), + ] diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 1bc8862..1335276 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -21,9 +21,6 @@ class GroupedOrder(models.Model): description = models.TextField("Description", null=True, blank=True) 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): price = 0 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" ) - def validate_unique(self, exclude=None): - super(GroupedOrder, self).validate_unique(exclude=exclude) - def __str__(self): # pragma: no cover return ( self.name diff --git a/la_chariotte/order/templates/order/grouped_order_create.html b/la_chariotte/order/templates/order/grouped_order_create.html index f61a8ca..7ea7346 100644 --- a/la_chariotte/order/templates/order/grouped_order_create.html +++ b/la_chariotte/order/templates/order/grouped_order_create.html @@ -10,7 +10,7 @@

Nouvelle commande

-
{% csrf_token %} + {% csrf_token %} {{ form.as_p }}
Annuler @@ -20,4 +20,8 @@
+{% endblock %} + +{% block extra_js %} +{% include 'warning_grouped_order_creation.html' %} {% endblock %} \ No newline at end of file diff --git a/la_chariotte/order/templates/order/grouped_order_update.html b/la_chariotte/order/templates/order/grouped_order_update.html index 80da6d6..e6ad3b4 100644 --- a/la_chariotte/order/templates/order/grouped_order_update.html +++ b/la_chariotte/order/templates/order/grouped_order_update.html @@ -8,7 +8,7 @@

{{ grouped_order.name }} - modifier

- {% csrf_token %} + {% csrf_token %} {{ form.as_p }}
Annuler @@ -16,4 +16,8 @@
+{% endblock %} + +{% block extra_js %} +{% include 'warning_grouped_order_creation.html' %} {% endblock %} \ No newline at end of file diff --git a/la_chariotte/order/templates/warning_grouped_order_creation.html b/la_chariotte/order/templates/warning_grouped_order_creation.html new file mode 100644 index 0000000..82fec1f --- /dev/null +++ b/la_chariotte/order/templates/warning_grouped_order_creation.html @@ -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(); + }; + }; +}; diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index 55af4e9..1f8e4df 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -123,36 +123,3 @@ class TestGroupedOrderModel: ) "La date de livraison ne doit pas être dans le passé" in response.content.decode() 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 diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index 7faf038..1227d32 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -994,7 +994,8 @@ class TestGroupedOrderUpdateView: update_grouped_order_url, { "name": "titre test modifié", - "deadline": deadline, + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), "delivery_date": date, "place": "quelque part", }, @@ -1034,7 +1035,8 @@ class TestGroupedOrderUpdateView: update_grouped_order_url, { "name": "titre test modifié", - "deadline": deadline, + "deadline_date": deadline.date(), + "deadline_time": deadline.time().strftime("%H:%M"), "delivery_date": date, "place": "quelque part", }, diff --git a/la_chariotte/order/views/grouped_order.py b/la_chariotte/order/views/grouped_order.py index a8e9576..ec45eaa 100644 --- a/la_chariotte/order/views/grouped_order.py +++ b/la_chariotte/order/views/grouped_order.py @@ -116,13 +116,18 @@ class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView): model = GroupedOrder template_name = "order/grouped_order_update.html" - fields = ["name", "deadline", "delivery_date", "place", "description"] context_object_name = "grouped_order" + form_class = GroupedOrderForm def test_func(self): """Accessible only if the requesting user is the grouped order organizer""" 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): """After creating grouped order, view for adding items to it"""