diff --git a/webapp/tests/signup_fixture.py b/webapp/tests/signup_fixture.py index fecef61..a15b5fd 100644 --- a/webapp/tests/signup_fixture.py +++ b/webapp/tests/signup_fixture.py @@ -40,14 +40,15 @@ CBOX_SCHEMA = { } -def createSignupForm(name="Form1", start_time=timezone.now(), end_time=month_from_now(), questions=ALL_QUESTION_TYPES, schema=ALL_QUESTIONS_SCHEMA, visible=True): +def createSignupForm(name="Form1", start_time=timezone.now(), end_time=month_from_now(), questions=ALL_QUESTION_TYPES, schema=ALL_QUESTIONS_SCHEMA, visible=True, quota=1): return SignupForm.objects.create( title=name, start_time=start_time, end_time=end_time, questions=questions, visible=visible, - schema=schema + schema=schema, + quota=quota ) diff --git a/webapp/tests/test_signup.py b/webapp/tests/test_signup.py index 6184867..7ac905e 100644 --- a/webapp/tests/test_signup.py +++ b/webapp/tests/test_signup.py @@ -82,3 +82,18 @@ class SignupTestCase(APITestCase): @skip("NotImplemented") def test_delete_signup_token(self): pass + + # TODO: Use some mocking library and check that mailjet is actually called + def test_signupee_sendemail(self): + form = self.signupForm + emailURL = f"/api/signupForm/{form.id}/sendemail/" + payload = { + "subject": "Email subject", + "content": "Markdown", + "mode": "actual" + } + no_auth_response = self.client.post(emailURL, payload, format="json") + self.assertEqual(no_auth_response.status_code, status.HTTP_401_UNAUTHORIZED) + self.client.force_authenticate(user=self.authClient) + response = self.client.post(emailURL, payload, format="json") + self.assertEqual(response.status_code, status.HTTP_201_CREATED) diff --git a/webapp/utils.py b/webapp/utils.py index 1f60f3a..37205b7 100644 --- a/webapp/utils.py +++ b/webapp/utils.py @@ -101,3 +101,7 @@ def send_signup_email(to, subject, id, uuid, content): ) return send_email(to, subject, message, True) + +def admin_send_email_signupees(list, subject, content): + for to in list: + send_email(to, subject, markdown.markdown(content), True) diff --git a/webapp/views.py b/webapp/views.py index 3800daa..722cc9d 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -21,7 +21,7 @@ from jsonschema.exceptions import ValidationError from webapp.models import * from webapp.serializers import * -from webapp.utils import decode_base64_file +from webapp.utils import admin_send_email_signupees, decode_base64_file class SignupPermission(BasePermission): @@ -105,6 +105,28 @@ class SignupFormViewSet(ModelViewSet): return SignupForm.objects.filter(visible=True, end_time__gt=timezone.now()).order_by('start_time') + @action(detail=True, methods=['post']) + def sendemail(self, request, pk=None, *args, **kwargs): + subject = request.data["subject"] + content = request.data["content"] + mode = request.data["mode"] + + queryset = self.filter_queryset(self.get_queryset()) + filter = {'pk': pk} + signupForm = get_object_or_404(queryset, **filter) + if (mode == "all"): + admin_send_email_signupees(signupForm.signups, subject, content) + return JsonResponse(status=201, data={"message": "Email sent"}) + elif (mode == "actual"): + admin_send_email_signupees(signupForm.signups, subject, content) + return JsonResponse(status=201, data={"message": "Email sent"}) + elif (mode == "reserved"): + admin_send_email_signupees(signupForm.signups, subject, content) + return JsonResponse(status=201, data={"message": "Email sent"}) + else: + return JsonResponse(status=400, data={"error": f"Bad mode '{mode}'"}) + + class SignupViewSet(ModelViewSet): queryset = Signup.objects.filter(deleted=False) serializer_class = SignupSerializer