From 128b3a541817955b5fb8f224737030d7737cda0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Val=C3=A9rio?= Date: Tue, 30 Oct 2018 12:41:08 +0000 Subject: [PATCH 1/2] reply_to is filled if the user is authenticated --- boxes/tasks.py | 18 +++++++++++++----- boxes/tests.py | 23 ++++++++++++++++++++--- boxes/views.py | 9 ++++++++- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/boxes/tasks.py b/boxes/tasks.py index 62e21324..f249a22f 100644 --- a/boxes/tasks.py +++ b/boxes/tasks.py @@ -10,22 +10,30 @@ @shared_task -def process_email(message_id, form_data): +def process_email(message_id, form_data, sent_by=None): message = Message.objects.get(id=message_id) box = message.box msg = form_data["message"] file_name = form_data.get("file_name", "") subject = _('New submission to your box: {}').format(box) + reply_to = [sent_by] if sent_by else [] if file_name: body = _("The submitted file can be found in the attachments.") email = EmailMultiAlternatives( - subject, body, settings.DEFAULT_FROM_EMAIL, [box.owner.email], - attachments=[(file_name, msg, "application/octet-stream")]) + subject, + body, + settings.DEFAULT_FROM_EMAIL, + [box.owner.email], + reply_to=reply_to, + attachments=[(file_name, msg, "application/octet-stream")] + ) else: - email = EmailMultiAlternatives(subject, msg, + email = EmailMultiAlternatives(subject, + msg, settings.DEFAULT_FROM_EMAIL, - [box.owner.email]) + [box.owner.email], + reply_to=reply_to) # Output e-mail message for debug purposes # with open('email.mbox', 'w') as f: diff --git a/boxes/tests.py b/boxes/tests.py index 0706b726..acbf96e9 100644 --- a/boxes/tests.py +++ b/boxes/tests.py @@ -1,6 +1,7 @@ from django.test import TestCase from django.utils import timezone from django.core.urlresolvers import reverse +from django.core import mail from humans.models import User from datetime import timedelta from .models import Box, Message @@ -247,8 +248,8 @@ class MailTaskTests(TestCase): def test_email_sending(self): """ - With a valid box_id an email is sent and the box status is changed - to sent + With a valid message_id an email is sent and the Message status + is changed to sent """ user = create_and_login_user(self.client) create_boxes(user) @@ -257,5 +258,21 @@ def test_email_sending(self): process_email(message.id, {"message": ENCRYPTED_MESSAGE}) after_box = user.own_boxes.get(id=initial_box.id) after_msg = after_box.messages.get(id=message.id) - #self.assertEqual(message.status, Message.SENT) + message.refresh_from_db() + self.assertEqual(message.status, Message.SENT) self.assertEqual(after_msg.sent_at, after_box.last_sent_at) + self.assertEqual(len(mail.outbox[0].reply_to), 0) + + def test_email_sending_with_reply_to(self): + mail.outbox = [] + user = create_and_login_user(self.client) + create_boxes(user) + initial_box = user.own_boxes.all()[0] + message = initial_box.messages.create() + process_email( + message.id, {"message": ENCRYPTED_MESSAGE}, sent_by=user.email + ) + message.refresh_from_db() + self.assertEqual(len(mail.outbox), 1) + self.assertIn(user.email, mail.outbox[0].reply_to) + self.assertEqual(message.status, Message.SENT) diff --git a/boxes/views.py b/boxes/views.py index 8f0ce51c..2d3812ac 100644 --- a/boxes/views.py +++ b/boxes/views.py @@ -173,8 +173,15 @@ def post(self, request, *args, **kwargs): self.object.status = Box.DONE self.object.save() + if request.user.is_authenticated(): + user_email = request.user.email + else: + user_email = None + # Schedule e-mail - process_email.delay(message.id, form.cleaned_data) + process_email.delay( + message.id, form.cleaned_data, sent_by=user_email + ) return self.response_class( request=self.request, From ea4a1dc6560bd986ecde866cc0bf07b908f149ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Val=C3=A9rio?= Date: Sun, 10 Mar 2019 13:11:35 +0000 Subject: [PATCH 2/2] authenticated users can now select if their email address is added to ReplyTo header --- .gitignore | 3 +++ boxes/forms.py | 1 + boxes/static/javascripts/box_submit.js | 8 ++++++++ boxes/templates/boxes/box_submit.html | 3 +++ boxes/tests.py | 11 +++++++++++ boxes/views.py | 4 +++- 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 864d50b6..bb4d6428 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ Session.vim # MacOS Stuff .DS_Store + +# Editor Stuff +.vscode diff --git a/boxes/forms.py b/boxes/forms.py index 5981f99f..5436001a 100644 --- a/boxes/forms.py +++ b/boxes/forms.py @@ -53,6 +53,7 @@ def clean(self): class SubmitBoxForm(Form): message = CharField(widget=Textarea, required=True) file_name = CharField(required=False) + add_reply_to = BooleanField(required=False) def clean_message(self): # Quick check if the message really came encrypted diff --git a/boxes/static/javascripts/box_submit.js b/boxes/static/javascripts/box_submit.js index ccadcacf..179dbc70 100644 --- a/boxes/static/javascripts/box_submit.js +++ b/boxes/static/javascripts/box_submit.js @@ -126,6 +126,7 @@ $(document).ready(function () { * Only when javascript is enabled, the form is created. */ function createBox() { + var authenticated_user = $("#authenticated_user").length var $formDiv = $(".form-div-js"); /* Hidden form fields */ @@ -146,6 +147,13 @@ $(document).ready(function () { var $encryptedMessage = $(""); $form.append($encryptedMessage); + if (authenticated_user) { + var $replyLabel = $(""); + var $replyInput = $(""); + var $replyGroup = $("
").append($replyLabel).append($replyInput); + $form.append($replyGroup); + } + $formDiv.append($form); /* Input fields */ diff --git a/boxes/templates/boxes/box_submit.html b/boxes/templates/boxes/box_submit.html index f0bf6843..4a138c17 100644 --- a/boxes/templates/boxes/box_submit.html +++ b/boxes/templates/boxes/box_submit.html @@ -54,6 +54,9 @@

{{object.description|linebreaks}}

+ {% if request.user.is_authenticated %} + + {% endif %} diff --git a/boxes/tests.py b/boxes/tests.py index acbf96e9..8833d5d2 100644 --- a/boxes/tests.py +++ b/boxes/tests.py @@ -160,6 +160,17 @@ def test_encrypted_file(self): "file_name": "test"}) self.assertEqual(form.is_valid(), True) + def test_add_reply_to_is_present(self): + form = SubmitBoxForm({"message": ENCRYPTED_MESSAGE, + "add_reply_to": "on"}) + self.assertEqual(form.is_valid(), True) + self.assertTrue(form.cleaned_data.get("add_reply_to")) + + def test_add_reply_to_is_not_present(self): + form = SubmitBoxForm({"message": ENCRYPTED_MESSAGE}) + self.assertEqual(form.is_valid(), True) + self.assertFalse(form.cleaned_data.get("add_reply_to")) + class BoxListViewTests(TestCase): diff --git a/boxes/views.py b/boxes/views.py index 2d3812ac..d91d4626 100644 --- a/boxes/views.py +++ b/boxes/views.py @@ -166,6 +166,7 @@ def dispatch(self, request, *args, **kwargs): def post(self, request, *args, **kwargs): form = self.get_form(data={"data": request.POST}) if form.is_valid(): + cleaned_data = form.cleaned_data message = self.object.messages.create() # Mark box as done @@ -173,7 +174,8 @@ def post(self, request, *args, **kwargs): self.object.status = Box.DONE self.object.save() - if request.user.is_authenticated(): + add_user_email = cleaned_data.get("add_reply_to", False) + if request.user.is_authenticated() and add_user_email: user_email = request.user.email else: user_email = None