From 0deaafa71d8520c7bf17fc91aa938f0106f96150 Mon Sep 17 00:00:00 2001 From: Wiktork Date: Tue, 8 Feb 2022 16:01:05 +0100 Subject: [PATCH] fix(subscription): fix parser and notifications for orders notify only on orders created by customers fix parser to correctly display purchased timed --- timed/subscription/notify_admin.py | 12 ++---- timed/subscription/tests/test_order.py | 56 ++++++++++++++++++++++++-- timed/subscription/views.py | 9 ++++- 3 files changed, 64 insertions(+), 13 deletions(-) diff --git a/timed/subscription/notify_admin.py b/timed/subscription/notify_admin.py index 103f04a0..f93dd21b 100644 --- a/timed/subscription/notify_admin.py +++ b/timed/subscription/notify_admin.py @@ -1,6 +1,5 @@ import datetime -from dateutil import parser from django.conf import settings from django.core.mail import EmailMultiAlternatives, get_connection from django.template.loader import get_template, render_to_string @@ -14,13 +13,10 @@ def prepare_and_send_email(project, order_duration): customer = project.customer - duration = parser.parse(order_duration) - hours_added = datetime.timedelta( - days=duration.day, - hours=duration.hour, - minutes=duration.minute, - seconds=duration.second, - ) + duration = order_duration.split(":") + hours = int(duration[0]) + minutes = int(duration[1]) + hours_added = datetime.timedelta(hours=hours, minutes=minutes) hours_total = hours_added if project.estimated_time is not None: diff --git a/timed/subscription/tests/test_order.py b/timed/subscription/tests/test_order.py index 61434535..6fb38ad8 100644 --- a/timed/subscription/tests/test_order.py +++ b/timed/subscription/tests/test_order.py @@ -138,10 +138,10 @@ def test_order_confirm( status.HTTP_400_BAD_REQUEST, ), (True, False, False, False, 1, timedelta(hours=1), status.HTTP_201_CREATED), - (False, True, False, True, 1, timedelta(hours=10), status.HTTP_201_CREATED), - (False, True, False, False, 1, timedelta(hours=24), status.HTTP_201_CREATED), - (False, False, True, True, 1, timedelta(hours=50), status.HTTP_201_CREATED), - (False, False, True, False, 1, timedelta(hours=100), status.HTTP_201_CREATED), + (False, True, False, True, 0, timedelta(hours=10), status.HTTP_201_CREATED), + (False, True, False, False, 0, timedelta(hours=24), status.HTTP_201_CREATED), + (False, False, True, True, 0, timedelta(hours=50), status.HTTP_201_CREATED), + (False, False, True, False, 0, timedelta(hours=100), status.HTTP_201_CREATED), (False, False, False, True, 0, timedelta(hours=200), status.HTTP_403_FORBIDDEN), (False, False, False, False, 0, None, status.HTTP_403_FORBIDDEN), ], @@ -206,6 +206,54 @@ def test_order_create( assert url in mail.alternatives[0][0] +@pytest.mark.parametrize( + "duration, expected, status_code", + [ + ("00:30:00", "0:30:00", status.HTTP_201_CREATED), + ("30:00:00", "1 day, 6:00:00", status.HTTP_201_CREATED), + ("30:30:00", "1 day, 6:30:00", status.HTTP_201_CREATED), + ("-00:30:00", "-0:30:00", status.HTTP_400_BAD_REQUEST), + ("-30:00:00", "-1 day, 6:00:00", status.HTTP_400_BAD_REQUEST), + ("-30:30:00", "-1 day, 6:30:00", status.HTTP_400_BAD_REQUEST), + ], +) +def test_order_create_duration( + auth_client, mailoutbox, duration, expected, status_code +): + user = auth_client.user + project = ProjectFactory.create(estimated_time=timedelta(hours=1)) + CustomerAssigneeFactory.create( + user=user, is_customer=True, customer=project.customer + ) + + data = { + "data": { + "type": "subscription-orders", + "id": None, + "attributes": { + "acknowledged": False, + "duration": duration, + }, + "relationships": { + "project": { + "data": {"type": "subscription-projects", "id": project.id} + }, + }, + } + } + + url = reverse("subscription-order-list") + + response = auth_client.post(url, data) + assert response.status_code == status_code + + if status_code == status.HTTP_201_CREATED: + assert len(mailoutbox) == 1 + + mail = mailoutbox[0] + assert expected in mail.body + + @pytest.mark.parametrize( "is_customer, is_accountant, is_superuser, acknowledged, expected", [ diff --git a/timed/subscription/views.py b/timed/subscription/views.py index d500b218..941afaef 100644 --- a/timed/subscription/views.py +++ b/timed/subscription/views.py @@ -79,7 +79,14 @@ def create(self, request, *args, **kwargs): project = Project.objects.get(id=request.data.get("project")["id"]) order_duration = request.data.get("duration") - notify_admin.prepare_and_send_email(project, order_duration) + # only send notification emails if order was created by a customer + # don't allow customers to create orders with negative duration + if not (request.user.is_accountant or request.user.is_superuser): + if "-" in request.data.get("duration"): + raise ValidationError( + "Customer can not create orders with negative duration!" + ) + notify_admin.prepare_and_send_email(project, order_duration) return super().create(request, *args, **kwargs) @decorators.action(