mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 11:22:24 +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):
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
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
|
||||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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()
|
"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
|
|
||||||
|
|
|
@ -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",
|
||||||
},
|
},
|
||||||
|
|
|
@ -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"""
|
||||||
|
|
Loading…
Reference in a new issue