show mail attachments in frontend
This commit is contained in:
parent
d1626d1777
commit
04f774404a
11 changed files with 252 additions and 23 deletions
|
@ -1,6 +1,12 @@
|
|||
from rest_framework import routers, viewsets, serializers
|
||||
|
||||
from mail.models import Email
|
||||
from mail.models import Email, EmailAttachment
|
||||
|
||||
|
||||
class AttachmentSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = EmailAttachment
|
||||
fields = ['hash', 'mime_type', 'name']
|
||||
|
||||
|
||||
class EmailSerializer(serializers.ModelSerializer):
|
||||
|
|
|
@ -26,7 +26,7 @@ class Migration(migrations.Migration):
|
|||
def generate_email_attachments(apps, schema_editor):
|
||||
for email in Email.objects.all():
|
||||
raw = email.raw
|
||||
if raw is None:
|
||||
if raw is None or raw == '':
|
||||
continue
|
||||
parsed, body, attachments = parse_email_body(raw.encode('utf-8'), NullLogger())
|
||||
email.attachments.clear()
|
||||
|
|
|
@ -92,8 +92,8 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
session = mock.Mock()
|
||||
envelope = Envelope()
|
||||
envelope.mail_from = 'test1@test'
|
||||
envelope.rcpt_tos = ['test2@test']
|
||||
envelope.content = b'Subject: test\nFrom: test3@test\nTo: test4@test\nMessage-ID: <1@test>\n\ntest'
|
||||
envelope.rcpt_tos = ['test2@localhost']
|
||||
envelope.content = b'Subject: test\nFrom: test3@test\nTo: test4@localhost\nMessage-ID: <1@test>\n\ntest'
|
||||
result = async_to_sync(handler.handle_DATA)(server, session, envelope)
|
||||
self.assertEqual(result, '250 Message accepted for delivery')
|
||||
self.assertEqual(len(Email.objects.all()), 2)
|
||||
|
@ -101,14 +101,14 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
aiosmtplib.send.assert_called_once()
|
||||
self.assertEqual('test', Email.objects.all()[0].subject)
|
||||
self.assertEqual('test1@test', Email.objects.all()[0].sender)
|
||||
self.assertEqual('test2@test', Email.objects.all()[0].recipient)
|
||||
self.assertEqual('test2@localhost', Email.objects.all()[0].recipient)
|
||||
self.assertEqual('test', Email.objects.all()[0].body)
|
||||
self.assertEqual(IssueThread.objects.all()[0], Email.objects.all()[0].issue_thread)
|
||||
self.assertEqual('<1@test>', Email.objects.all()[0].reference)
|
||||
self.assertEqual(None, Email.objects.all()[0].in_reply_to)
|
||||
self.assertEqual(expected_auto_reply_subject.format('test', IssueThread.objects.all()[0].short_uuid()),
|
||||
Email.objects.all()[1].subject)
|
||||
self.assertEqual('test2@test', Email.objects.all()[1].sender)
|
||||
self.assertEqual('test2@localhost', Email.objects.all()[1].sender)
|
||||
self.assertEqual('test1@test', Email.objects.all()[1].recipient)
|
||||
self.assertEqual(expected_auto_reply.format(IssueThread.objects.all()[0].short_uuid()),
|
||||
Email.objects.all()[1].body)
|
||||
|
@ -284,19 +284,19 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
|
||||
def test_mail_reply(self):
|
||||
issue_thread = IssueThread.objects.create(
|
||||
name="test",
|
||||
name="test subject",
|
||||
)
|
||||
mail1 = Email.objects.create(
|
||||
subject='test subject',
|
||||
body='test',
|
||||
sender='test1@test',
|
||||
recipient='test2@' + MAIL_DOMAIN,
|
||||
recipient='test2@localhost',
|
||||
issue_thread=issue_thread,
|
||||
)
|
||||
mail1_reply = Email.objects.create(
|
||||
subject='Re: test subject',
|
||||
subject='Message received',
|
||||
body='Thank you for your message.',
|
||||
sender='test2@' + MAIL_DOMAIN,
|
||||
sender='test2@localhost',
|
||||
recipient='test1@test',
|
||||
in_reply_to=mail1.reference,
|
||||
issue_thread=issue_thread,
|
||||
|
@ -310,8 +310,22 @@ class LMTPHandlerTestCase(TestCase): # TODO replace with less hacky test
|
|||
self.assertEqual(len(Email.objects.all()), 3)
|
||||
self.assertEqual(len(IssueThread.objects.all()), 1)
|
||||
aiosmtplib.send.assert_called_once()
|
||||
self.assertEqual(Email.objects.all()[2].subject, 'Re: test subject')
|
||||
self.assertEqual(Email.objects.all()[2].sender, 'test2@' + MAIL_DOMAIN)
|
||||
self.assertEqual(Email.objects.all()[0].subject, 'test subject')
|
||||
self.assertEqual(Email.objects.all()[0].sender, 'test1@test')
|
||||
self.assertEqual(Email.objects.all()[0].recipient, 'test2@localhost')
|
||||
self.assertEqual(Email.objects.all()[0].body, 'test')
|
||||
self.assertEqual(Email.objects.all()[0].issue_thread, issue_thread)
|
||||
self.assertEqual(Email.objects.all()[0].reference, mail1.reference)
|
||||
self.assertEqual(Email.objects.all()[1].subject, 'Message received')
|
||||
self.assertEqual(Email.objects.all()[1].sender, 'test2@localhost')
|
||||
self.assertEqual(Email.objects.all()[1].recipient, 'test1@test')
|
||||
self.assertEqual(Email.objects.all()[1].body, 'Thank you for your message.')
|
||||
self.assertEqual(Email.objects.all()[1].issue_thread, issue_thread)
|
||||
self.assertTrue(Email.objects.all()[1].reference.startswith("<"))
|
||||
self.assertTrue(Email.objects.all()[1].reference.endswith("@localhost>"))
|
||||
self.assertEqual(Email.objects.all()[1].in_reply_to, mail1.reference)
|
||||
self.assertEqual(Email.objects.all()[2].subject, 'Re: test subject [#{0}]'.format(issue_thread.short_uuid()))
|
||||
self.assertEqual(Email.objects.all()[2].sender, 'test2@localhost')
|
||||
self.assertEqual(Email.objects.all()[2].recipient, 'test1@test')
|
||||
self.assertEqual(Email.objects.all()[2].body, 'test')
|
||||
self.assertEqual(Email.objects.all()[2].issue_thread, issue_thread)
|
||||
|
@ -633,25 +647,26 @@ dGVzdGltYWdl
|
|||
|
||||
def test_mail_plus_issue_thread(self):
|
||||
issue_thread = IssueThread.objects.create(
|
||||
name="test",
|
||||
name="test subject",
|
||||
)
|
||||
mail1 = Email.objects.create(
|
||||
subject='test subject',
|
||||
body='test',
|
||||
sender='test1@test',
|
||||
recipient='test2@test',
|
||||
recipient='test2@localhost',
|
||||
issue_thread=issue_thread,
|
||||
)
|
||||
mail1_reply = Email.objects.create(
|
||||
subject='Message received',
|
||||
body='Thank you for your message.',
|
||||
sender='test2@test',
|
||||
sender='test2@localhost',
|
||||
recipient='test1@test',
|
||||
in_reply_to=mail1.reference,
|
||||
issue_thread=issue_thread,
|
||||
)
|
||||
from aiosmtpd.smtp import Envelope
|
||||
from asgiref.sync import async_to_sync
|
||||
from email.message import EmailMessage
|
||||
import aiosmtplib
|
||||
import logging
|
||||
logging.disable(logging.CRITICAL)
|
||||
|
@ -677,4 +692,23 @@ dGVzdGltYWdl
|
|||
self.assertEqual(Email.objects.all()[2].body, 'bar')
|
||||
self.assertEqual(Email.objects.all()[2].issue_thread, issue_thread)
|
||||
self.assertEqual(Email.objects.all()[2].reference, '<3@test>')
|
||||
self.assertEqual('test', IssueThread.objects.all()[0].name)
|
||||
self.assertEqual('test subject', IssueThread.objects.all()[0].name)
|
||||
response = self.client.post(f'/api/2/tickets/{issue_thread.id}/reply/', {
|
||||
'message': 'test'
|
||||
})
|
||||
aiosmtplib.send.assert_called_once();
|
||||
self.assertEqual(response.status_code, 201)
|
||||
self.assertEqual(4, len(Email.objects.all()))
|
||||
self.assertEqual(4, len(Email.objects.filter(issue_thread=issue_thread)))
|
||||
self.assertEqual(1, len(IssueThread.objects.all()))
|
||||
self.assertEqual(Email.objects.all()[3].subject, 'Re: test subject [#{0}]'.format(issue_thread.short_uuid()))
|
||||
self.assertEqual(Email.objects.all()[3].sender, 'test2@localhost')
|
||||
self.assertEqual(Email.objects.all()[3].recipient, 'test1@test')
|
||||
self.assertEqual(Email.objects.all()[3].body, 'test')
|
||||
self.assertEqual(Email.objects.all()[3].issue_thread, issue_thread)
|
||||
self.assertTrue(Email.objects.all()[3].reference.startswith("<"))
|
||||
self.assertTrue(Email.objects.all()[3].reference.endswith("@localhost>"))
|
||||
self.assertEqual(Email.objects.all()[3].in_reply_to, mail1.reference)
|
||||
self.assertEqual('test subject', IssueThread.objects.all()[0].name)
|
||||
self.assertEqual('pending_new', IssueThread.objects.all()[0].state)
|
||||
self.assertEqual(None, IssueThread.objects.all()[0].assigned_to)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue