Browse Source

Mail user with data download link

Rafał Pitoń 6 years ago
parent
commit
ed66eed559

+ 20 - 0
misago/templates/misago/emails/data_download.html

@@ -0,0 +1,20 @@
+{% extends "misago/emails/base.html" %}
+{% load i18n misago_absoluteurl %}
+
+
+{% block content %}
+{% blocktrans trimmed with user=user %}
+{{ user }}, you are receiving this message because your data is ready for download.
+{% endblocktrans %}
+<br>
+<br>
+<a href="{% absoluteurl data_download.file.url %}">{% trans "Download data" %}</a>
+<br>
+<br>
+{% blocktrans trimmed count expires_in=expires_in %}
+This link will remain active for {{ expires_in }} hour from the time this message has been sent.
+{% plural %}
+This link will remain active for {{ expires_in }} hours from the time this message has been sent.
+{% endblocktrans %}
+<br>
+{% endblock content %}

+ 20 - 0
misago/templates/misago/emails/data_download.txt

@@ -0,0 +1,20 @@
+{% extends "misago/emails/base.txt" %}
+{% load i18n misago_absoluteurl %}
+
+
+{% block content %}
+{% blocktrans trimmed with user=user %}
+{{ user }}, you are receiving this message because your data is ready for download.
+{% endblocktrans %}
+
+{% blocktrans trimmed %}
+To download your data, click the following link:
+{% endblocktrans %}
+{% absoluteurl data_download.file.url %}
+
+{% blocktrans trimmed count expires_in=expires_in %}
+This link will remain active for {{ expires_in }} hour from the time this message has been sent.
+{% plural %}
+This link will remain active for {{ expires_in }} hours from the time this message has been sent.
+{% endblocktrans %}
+{% endblock content %}

+ 10 - 0
misago/users/management/commands/prepareuserdatadownloads.py

@@ -1,8 +1,10 @@
 import logging
 
 from django.core.management.base import BaseCommand
+from django.utils.translation import ugettext
 
 from misago.conf import settings
+from misago.core.mail import mail_user
 from misago.core.pgutils import chunk_queryset
 from misago.users.datadownloads import prepare_user_data_download
 from misago.users.models import DataDownload
@@ -13,6 +15,7 @@ logger = logging.getLogger('misago.users.datadownloads')
 
 class Command(BaseCommand):
     help = "Prepares user data downloads."
+    leave_locale_alone = True
 
     def handle(self, *args, **options):
         working_dir = settings.MISAGO_USER_DATA_DOWNLOADS_WORKING_DIR
@@ -27,6 +30,13 @@ class Command(BaseCommand):
         queryset = queryset.filter(status=DataDownload.STATUS_PENDING)
         for data_download in chunk_queryset(queryset):
             if prepare_user_data_download(data_download, logger):
+                user = data_download.user
+                subject = ugettext("%(user)s, your data download is ready") % { 'user': user }
+                mail_user(user, subject, 'misago/emails/data_download', context={
+                    'data_download': data_download,
+                    'expires_in': settings.MISAGO_USER_DATA_DOWNLOADS_EXPIRE_AFTER_HOURS,
+                })
+
                 downloads_prepared += 1
 
         self.stdout.write("Data downloads prepared: {}".format(downloads_prepared))

+ 84 - 0
misago/users/tests/test_prepareuserdatadownloads.py

@@ -0,0 +1,84 @@
+from django.core import mail
+from django.core.management import call_command
+from django.utils.six import StringIO
+
+from misago.conf import settings
+from misago.users.datadownloads import request_user_data_download
+from misago.users.management.commands import prepareuserdatadownloads
+from misago.users.models import DataDownload
+from misago.users.testutils import AuthenticatedUserTestCase
+
+
+class PrepareUserDataDownloadsTests(AuthenticatedUserTestCase):
+    def test_process_pending_data_download(self):
+        """management command processes pending data download"""
+        data_download = request_user_data_download(self.user)
+        self.assertEqual(data_download.status, DataDownload.STATUS_PENDING)
+
+        out = StringIO()
+        call_command(prepareuserdatadownloads.Command(), stdout=out)
+        command_output = out.getvalue().splitlines()[0].strip()
+
+        self.assertEqual(command_output, "Data downloads prepared: 1")
+
+        updated_data_download = DataDownload.objects.get(pk=data_download.pk)
+        self.assertEqual(updated_data_download.status, DataDownload.STATUS_READY)
+        self.assertTrue(updated_data_download.expires_on > data_download.expires_on)
+        self.assertTrue(updated_data_download.file)
+
+        self.assertEqual(len(mail.outbox), 1)
+        self.assertEqual(mail.outbox[0].subject, "TestUser, your data download is ready")
+
+        absolute_url = ''.join([settings.MISAGO_ADDRESS.rstrip('/'), updated_data_download.file.url])
+        self.assertIn(absolute_url, mail.outbox[0].body)
+
+    def test_skip_ready_data_download(self):
+        """management command skips ready data download"""
+        data_download = request_user_data_download(self.user)
+        data_download.status = DataDownload.STATUS_READY
+        data_download.save()
+
+        out = StringIO()
+        call_command(prepareuserdatadownloads.Command(), stdout=out)
+        command_output = out.getvalue().splitlines()[0].strip()
+
+        self.assertEqual(command_output, "Data downloads prepared: 0")
+
+        updated_data_download = DataDownload.objects.get(pk=data_download.pk)
+        self.assertEqual(updated_data_download.status, DataDownload.STATUS_READY)
+
+        self.assertEqual(len(mail.outbox), 0)
+
+    def test_skip_processing_data_download(self):
+        """management command skips processing data download"""
+        data_download = request_user_data_download(self.user)
+        data_download.status = DataDownload.STATUS_PROCESSING
+        data_download.save()
+
+        out = StringIO()
+        call_command(prepareuserdatadownloads.Command(), stdout=out)
+        command_output = out.getvalue().splitlines()[0].strip()
+
+        self.assertEqual(command_output, "Data downloads prepared: 0")
+
+        updated_data_download = DataDownload.objects.get(pk=data_download.pk)
+        self.assertEqual(updated_data_download.status, DataDownload.STATUS_PROCESSING)
+        
+        self.assertEqual(len(mail.outbox), 0)
+
+    def test_skip_expired_data_download(self):
+        """management command skips expired data download"""
+        data_download = request_user_data_download(self.user)
+        data_download.status = DataDownload.STATUS_EXPIRED
+        data_download.save()
+
+        out = StringIO()
+        call_command(prepareuserdatadownloads.Command(), stdout=out)
+        command_output = out.getvalue().splitlines()[0].strip()
+
+        self.assertEqual(command_output, "Data downloads prepared: 0")
+
+        updated_data_download = DataDownload.objects.get(pk=data_download.pk)
+        self.assertEqual(updated_data_download.status, DataDownload.STATUS_EXPIRED)
+        
+        self.assertEqual(len(mail.outbox), 0)