update grouped order

This commit is contained in:
Laetitia Getti 2023-06-12 15:51:43 +02:00
parent 384f81d4ab
commit 8a2852794e
6 changed files with 162 additions and 5 deletions

View file

@ -49,7 +49,9 @@ class GroupedOrder(models.Model):
def clean_fields(self, exclude=None):
super().clean_fields(exclude=exclude)
if self.delivery_date < timezone.now().date():
if self.delivery_date < timezone.now().date() and not self.pk:
# if the grouped order is being created (not updated), it cannot be in the past
# if we are updating, it's ok
raise ValidationError("La date de livraison ne doit pas être dans le passé")
if self.delivery_date < self.deadline.date():

View file

@ -31,9 +31,8 @@
Livraison le {{ grouped_order.delivery_date }}
</p>
<div class="buttons">
<a class="button is-light" href={% url 'order:grouped_order_detail' grouped_order.id %}>
<i class="fa fa-eye mr-3" aria-hidden="true"></i>Page de la commande
</a>
<a class="button is-light" href="{% url 'order:update_grouped_order' grouped_order.id %}">
<i class="fa fa-pencil mr-3" aria-hidden="true"></i>Modifier la commande</a>
</div>
</div>
</div>

View file

@ -0,0 +1,19 @@
{% extends 'base.html' %}
{% block title %}Modifier la commande groupée{% endblock %}
{% block content %}
<p class="desktop-hidden mobile-content-title">
{% block content_title %}Modifier la commande groupée{% endblock %}
</p>
<div class="box">
<p class="title">{{ grouped_order.name }} - modifier</p>
<form method="post">{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<a class="button is-light" href="{% url 'order:index' %}">Annuler</a>
<input class="button is-primary" type="submit" value="Suivant">
</div>
</form>
</div>
{% endblock %}

View file

@ -960,6 +960,125 @@ class TestGroupedOrderCreateView:
)
class TestGroupedOrderUpdateView:
def test_update_grouped_order(self, client_log):
"""
The grouped order orga updates a grouped order updates an incoming grouped order.
"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=auth.get_user(client_log),
)
assert models.GroupedOrder.objects.count() == 1
assert models.GroupedOrder.objects.first().name == "gr order test"
assert models.GroupedOrder.objects.first().place == None
# get the update form
update_grouped_order_url = reverse(
"order:update_grouped_order", kwargs={"pk": grouped_order.pk}
)
response = client_log.get(update_grouped_order_url)
assert response.status_code == 200
# post the update form
date = timezone.now().date() + datetime.timedelta(days=42)
deadline = timezone.now() + datetime.timedelta(days=32)
response = client_log.post(
update_grouped_order_url,
{
"name": "titre test modifié",
"deadline": deadline,
"delivery_date": date,
"place": "quelque part",
},
)
assert response.status_code == 302
assert response.url.endswith("gerer-produits")
assert models.GroupedOrder.objects.count() == 1
assert models.GroupedOrder.objects.first().name == "titre test modifié"
assert models.GroupedOrder.objects.first().place == "quelque part"
def test_update_grouped_order__delivery_date_passed(self, client_log):
"""
The grouped order orga updates a grouped order.
They can put an old delivery date.
"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=auth.get_user(client_log),
)
assert models.GroupedOrder.objects.count() == 1
assert models.GroupedOrder.objects.first().name == "gr order test"
assert models.GroupedOrder.objects.first().place == None
# get the update form
update_grouped_order_url = reverse(
"order:update_grouped_order", kwargs={"pk": grouped_order.pk}
)
response = client_log.get(update_grouped_order_url)
assert response.status_code == 200
# post the update form
date = timezone.now().date() + datetime.timedelta(days=-1)
deadline = timezone.now() + datetime.timedelta(days=-3)
response = client_log.post(
update_grouped_order_url,
{
"name": "titre test modifié",
"deadline": deadline,
"delivery_date": date,
"place": "quelque part",
},
)
assert response.status_code == 302
assert response.url.endswith("gerer-produits")
assert models.GroupedOrder.objects.count() == 1
assert models.GroupedOrder.objects.first().name == "titre test modifié"
assert models.GroupedOrder.objects.first().place == "quelque part"
def test_update_grouped_order__not_orga(self, client_log, other_user):
"""A user that is not organiszer of the GO accesses update page.
They get a 403 error"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=other_user,
)
# get the update form
update_grouped_order_url = reverse(
"order:update_grouped_order", kwargs={"pk": grouped_order.pk}
)
response = client_log.get(update_grouped_order_url)
assert response.status_code == 403
def test_update_grouped_order__anonymous(self, client, other_user):
"""An anonymous user accesses the update_page.
They get redirected to login page"""
grouped_order = create_grouped_order(
days_before_delivery_date=5,
days_before_deadline=2,
name="gr order test",
orga_user=other_user,
)
# get the update form
update_grouped_order_url = reverse(
"order:update_grouped_order", kwargs={"pk": grouped_order.pk}
)
response = client.get(update_grouped_order_url)
assert response.status_code == 302
assert (
response.url
== f"{reverse('accounts:login')}?next={update_grouped_order_url}"
)
class TestGroupedOrderAddItemsView:
def test_get_manage_items__user_not_orga(self, client_log, other_user):
"""
@ -1162,7 +1281,7 @@ class TestGroupedOrderSheetView:
response = client_log.get(generate_sheet_url)
assert response.status_code == 403
def test_get__not_orga(self, client, other_user):
def test_get__anonymous(self, client, other_user):
"""An anonymous user accesses the sheet view.
They get redirected to login page"""
grouped_order = create_grouped_order(

View file

@ -25,6 +25,11 @@ urlpatterns = [
views.GroupedOrderAddItemsView.as_view(),
name="manage_items",
),
path(
"<int:pk>/modifier",
views.GroupedOrderUpdateView.as_view(),
name="update_grouped_order",
),
path(
"<int:pk>/gerer-produits/nouveau",
views.ItemCreateView.as_view(),

View file

@ -112,6 +112,19 @@ class GroupedOrderCreateView(LoginRequiredMixin, generic.CreateView):
return kwargs
class GroupedOrderUpdateView(UserPassesTestMixin, generic.UpdateView):
"""View for updating a grouped order"""
model = GroupedOrder
template_name = "order/grouped_order_update.html"
fields = ["name", "deadline", "delivery_date", "place", "description"]
context_object_name = "grouped_order"
def test_func(self):
"""Accessible only if the requesting user is the grouped order organizer"""
return self.get_object().orga == self.request.user
class GroupedOrderAddItemsView(UserPassesTestMixin, generic.ListView):
"""After creating grouped order, view for adding items to it"""