Skip to content
Snippets Groups Projects
Commit 899e28ea authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'export-email' into 'master'

Send emails on export completion and failure

Closes #745

See merge request !1377
parents dc193001 577cc605
No related branches found
No related tags found
1 merge request!1377Send emails on export completion and failure
...@@ -7,7 +7,10 @@ import uuid ...@@ -7,7 +7,10 @@ import uuid
from datetime import datetime, timezone from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from django.conf import settings
from django.core.mail import send_mail
from django.db import connections from django.db import connections
from django.template.loader import render_to_string
from django.utils.text import slugify from django.utils.text import slugify
from django_rq import job from django_rq import job
from rq import get_current_job from rq import get_current_job
...@@ -79,6 +82,23 @@ def save_sqlite(rows, table, cursor): ...@@ -79,6 +82,23 @@ def save_sqlite(rows, table, cursor):
cursor.executemany(query, rows) cursor.executemany(query, rows)
def send_email(subject, template_name, corpus_export, **context):
context['corpus_export'] = corpus_export
context['hostname'] = settings.PUBLIC_HOSTNAME
sent = send_mail(
subject=subject,
message=render_to_string(
template_name,
context=context,
),
from_email=None,
recipient_list=[corpus_export.user.email],
fail_silently=True,
)
if sent == 0:
logger.error(f'Failed to send email to {corpus_export.user.email}')
@job('high') @job('high')
def export_corpus(corpus_export: CorpusExport) -> None: def export_corpus(corpus_export: CorpusExport) -> None:
_, db_path = tempfile.mkstemp(suffix='db') _, db_path = tempfile.mkstemp(suffix='db')
...@@ -135,9 +155,21 @@ def export_corpus(corpus_export: CorpusExport) -> None: ...@@ -135,9 +155,21 @@ def export_corpus(corpus_export: CorpusExport) -> None:
corpus_export.state = CorpusExportState.Done corpus_export.state = CorpusExportState.Done
corpus_export.save() corpus_export.save()
except Exception:
send_email(
'Arkindex project export completed',
'export_success.html',
corpus_export,
)
except Exception as e:
corpus_export.state = CorpusExportState.Failed corpus_export.state = CorpusExportState.Failed
corpus_export.save() corpus_export.save()
send_email(
'Arkindex project export failed',
'export_error.html',
corpus_export,
error=e.args[0],
)
raise raise
finally: finally:
os.unlink(db_path) os.unlink(db_path)
...@@ -2,8 +2,12 @@ import json ...@@ -2,8 +2,12 @@ import json
import os import os
import sqlite3 import sqlite3
from datetime import datetime, timezone from datetime import datetime, timezone
from textwrap import dedent
from unittest.mock import call, patch from unittest.mock import call, patch
from django.core import mail
from django.test import override_settings
from arkindex.dataimport.models import WorkerVersion from arkindex.dataimport.models import WorkerVersion
from arkindex.documents.export import export_corpus from arkindex.documents.export import export_corpus
from arkindex.documents.models import ( from arkindex.documents.models import (
...@@ -22,6 +26,7 @@ from arkindex.project.tests import FixtureTestCase ...@@ -22,6 +26,7 @@ from arkindex.project.tests import FixtureTestCase
class TestExport(FixtureTestCase): class TestExport(FixtureTestCase):
@override_settings(PUBLIC_HOSTNAME='https://darkindex.lol')
@patch('arkindex.documents.export.datetime') @patch('arkindex.documents.export.datetime')
@patch('arkindex.documents.export.os.unlink') @patch('arkindex.documents.export.os.unlink')
@patch('arkindex.project.aws.s3.Object') @patch('arkindex.project.aws.s3.Object')
...@@ -276,3 +281,49 @@ class TestExport(FixtureTestCase): ...@@ -276,3 +281,49 @@ class TestExport(FixtureTestCase):
) )
os.unlink(db_path) os.unlink(db_path)
# Download URL is sent by email
self.assertEqual(len(mail.outbox), 1)
message = mail.outbox[0]
self.assertEqual(message.subject, 'Arkindex project export completed')
self.assertListEqual(message.to, [self.user.email])
self.assertEqual(message.body, dedent(f"""
Hello Test user,
Your export for the Unit Tests project is completed.
You can download it at:
https://darkindex.lol/api/v1/export/{export.id}/
--
Arkindex
"""))
@patch('arkindex.project.aws.s3.Object')
def test_export_fail(self, s3_object_mock):
s3_object_mock.return_value.upload_file.side_effect = ZeroDivisionError('i ran out of elbow oil')
export = self.corpus.exports.create(user=self.user)
with self.assertRaises(ZeroDivisionError):
export_corpus(export)
export.refresh_from_db()
self.assertEqual(export.state, CorpusExportState.Failed)
self.assertEqual(len(mail.outbox), 1)
message = mail.outbox[0]
self.assertEqual(message.subject, 'Arkindex project export failed')
self.assertListEqual(message.to, [self.user.email])
self.assertEqual(message.body, dedent("""
Hello Test user,
An error occurred while exporting the Unit Tests project.
Error: i ran out of elbow oil
Please try again or contact your system administrator.
--
Arkindex
"""))
{% autoescape off %}
Hello {{ corpus_export.user.display_name }},
An error occurred while exporting the {{ corpus_export.corpus.name }} project.
Error: {{ error }}
Please try again or contact your system administrator.
--
Arkindex
{% endautoescape %}
{% autoescape off %}
Hello {{ corpus_export.user.display_name }},
Your export for the {{ corpus_export.corpus.name }} project is completed.
You can download it at:
{{ hostname }}{% url 'api:download-export' pk=corpus_export.id %}
--
Arkindex
{% endautoescape %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment