-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5316 from akvo/send-link-report-in-email
Send link report in email
- Loading branch information
Showing
10 changed files
with
200 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
import io | ||
import os | ||
import binascii | ||
from datetime import timedelta | ||
from typing import cast | ||
from django.core import mail | ||
from django.core.files.storage import Storage, default_storage | ||
from django.test import override_settings | ||
from django.utils import timezone | ||
from django_q.models import Task | ||
from akvo.rsr.tests.base import BaseTestCase | ||
|
||
from akvo.rsr.views.py_reports.utils import REPORTS_STORAGE_BASE_DIR, cleanup_expired_reports, notify_dev_on_failed_task, notify_user_on_failed_report, save_report_file | ||
|
||
default_storage = cast(Storage, default_storage) | ||
|
||
|
||
class StorageTestCase(BaseTestCase): | ||
def tearDown(self): | ||
_, files = default_storage.listdir(REPORTS_STORAGE_BASE_DIR) | ||
for f in files: | ||
default_storage.delete(os.path.join(REPORTS_STORAGE_BASE_DIR, f)) | ||
super().tearDown() | ||
|
||
def setUp(self): | ||
super().setUp() | ||
buffer = io.BytesIO(b'test') | ||
self.url = save_report_file(REPORTS_STORAGE_BASE_DIR, 'test.txt', buffer.getvalue()) | ||
self.file_path = os.path.join(REPORTS_STORAGE_BASE_DIR, 'test.txt') | ||
|
||
def test_save_report_file(self): | ||
self.assertTrue(default_storage.exists(self.file_path)) | ||
self.assertEqual(default_storage.url(self.file_path), self.url) | ||
|
||
def test_cleanup_expired_reports_no_files_deleted(self): | ||
now = timezone.now() | ||
t23 = now + timedelta(hours=23, minutes=58) | ||
cleanup_expired_reports(t23) | ||
self.assertTrue(default_storage.exists(self.file_path)) | ||
|
||
def test_cleanup_expired_reports_deletes_file(self): | ||
now = timezone.now() | ||
t24 = now + timedelta(hours=24, minutes=2) | ||
cleanup_expired_reports(t24) | ||
self.assertFalse(default_storage.exists(self.file_path)) | ||
|
||
|
||
@override_settings(REPORT_ERROR_RECIPIENTS=['[email protected]']) | ||
class NotifyErrorTestCase(BaseTestCase): | ||
def setUp(self): | ||
super().setUp() | ||
self.create_user('[email protected]') | ||
self.failed_task = Task.objects.create( | ||
id=self._generate_id(), | ||
name='test', | ||
args=({'report_label': 'test report'}, '[email protected]'), | ||
result='error', | ||
success=False, | ||
started=timezone.now(), | ||
stopped=timezone.now() | ||
) | ||
self.success_task = Task.objects.create( | ||
id=self._generate_id(), | ||
name='test', | ||
args=({'report_label': 'test report'}, '[email protected]'), | ||
success=True, | ||
started=timezone.now(), | ||
stopped=timezone.now() | ||
) | ||
|
||
def _generate_id(self): | ||
return binascii.b2a_hex(os.urandom(16)).decode('utf-8') | ||
|
||
def test_notify_dev(self): | ||
notify_dev_on_failed_task(self.failed_task) | ||
self.assertEqual(len(mail.outbox), 1) | ||
self.assertIn('[email protected]', mail.outbox[0].to) | ||
|
||
def test_notify_user(self): | ||
notify_user_on_failed_report(self.failed_task) | ||
self.assertEqual(len(mail.outbox), 2) | ||
self.assertEqual( | ||
[it for mail in mail.outbox for it in mail.to], | ||
['[email protected]', '[email protected]'] | ||
) | ||
|
||
def test_ignore_success(self): | ||
notify_user_on_failed_report(self.success_task) | ||
self.assertEqual(len(mail.outbox), 0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
Dear {{ username }}, | ||
|
||
We regret to inform you that your recent report generation request{{ report_label }} encountered an issue. Our developers have been notified and are actively working on a resolution. | ||
|
||
Please be patient, and feel free to retry generating the report after some time. We apologize for any inconvenience caused and appreciate your understanding. | ||
|
||
Thank you for your patience. | ||
Akvo.org |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
Failed running background job | ||
|
||
id: {{ task.id }} | ||
name: {{ task.name }} | ||
started: {{ task.started }} | ||
stopped: {{ task.stopped }} | ||
args: {{ task.args|safe }} | ||
kwargs: {{ task.kwargs|safe }} | ||
|
||
result: | ||
{{ task.result|safe }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Report Generation Request Failed |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Background Job Failed! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,13 @@ | ||
from datetime import datetime | ||
from django.utils import timezone | ||
|
||
|
||
def datetime_remove_time(datetime_: datetime) -> datetime: | ||
"""Removes the time components from a datetime effectively making it a date""" | ||
return datetime_.replace(hour=0, minute=0, second=0) | ||
|
||
|
||
def make_datetime_aware(dt: datetime): | ||
return timezone.make_aware(dt, timezone.get_current_timezone())\ | ||
if timezone.is_naive(dt)\ | ||
else dt |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -86,3 +86,4 @@ FIXTURE_DIRS = [ | |
] | ||
|
||
RSR_DEMO_REQUEST_TO_EMAILS = ['[email protected]'] | ||
REPORT_ERROR_RECIPIENTS = ['[email protected]'] |