mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 03:12:26 +02:00
use GOForm for updating and warning message when deadline in the past
closes #94
This commit is contained in:
parent
f32987457d
commit
afea416d42
9 changed files with 63 additions and 58 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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(),
|
||||
),
|
||||
]
|
|
@ -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
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<p class="title">Nouvelle commande</p>
|
||||
<div class="columns">
|
||||
<div class="column is-8">
|
||||
<form method="post">{% csrf_token %}
|
||||
<form method="post" onsubmit="deadlinePassedCheck(event)">{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<div class="buttons">
|
||||
<a class="button is-light" href="{% url 'order:index' %}">Annuler</a>
|
||||
|
@ -20,4 +20,8 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
{% include 'warning_grouped_order_creation.html' %}
|
||||
{% endblock %}
|
|
@ -8,7 +8,7 @@
|
|||
</p>
|
||||
<div class="box">
|
||||
<p class="title">{{ grouped_order.name }} - modifier</p>
|
||||
<form method="post">{% csrf_token %}
|
||||
<form method="post" onsubmit="deadlinePassedCheck(event)">{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<div class="buttons">
|
||||
<a class="button is-light" href="{% url 'order:index' %}">Annuler</a>
|
||||
|
@ -16,4 +16,8 @@
|
|||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
{% include 'warning_grouped_order_creation.html' %}
|
||||
{% endblock %}
|
|
@ -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();
|
||||
};
|
||||
};
|
||||
};
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
},
|
||||
|
|
|
@ -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"""
|
||||
|
|
Loading…
Reference in a new issue