Changeset View
Changeset View
Standalone View
Standalone View
users/tasks.py
| """Background tasks for user-related things.""" | """Background tasks for user-related things.""" | ||||
| from datetime import timedelta | |||||
| from typing import Dict, Any | from typing import Dict, Any | ||||
| import logging | import logging | ||||
| from background_task import background | from background_task import background | ||||
| from django.conf import settings | from django.conf import settings | ||||
| from django.contrib.auth import get_user_model | from django.contrib.auth import get_user_model | ||||
| from django.db import transaction | from django.db import transaction | ||||
| from django.utils import timezone | |||||
| from common import history | from common import history | ||||
| from common import mailgun | from common import mailgun | ||||
| from common import queries | from common import queries | ||||
| User = get_user_model() | User = get_user_model() | ||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||
| logger.setLevel(logging.DEBUG) | logger.setLevel(logging.DEBUG) | ||||
| DELETION_DELTA = timedelta(weeks=2) | |||||
| @background() | @background() | ||||
| def handle_is_subscribed_to_newsletter(pk: int): | def handle_is_subscribed_to_newsletter(pk: int): | ||||
| """Send a request to Mailgun to create or delete an unsubscribe record. | """Send a request to Mailgun to create or delete an unsubscribe record. | ||||
| See https://documentation.mailgun.com/en/latest/api-suppressions.html#unsubscribes | See https://documentation.mailgun.com/en/latest/api-suppressions.html#unsubscribes | ||||
| """ | """ | ||||
| ▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | if 'delivery-status' in event_data: | ||||
| change_msg = ( | change_msg = ( | ||||
| 'is_subscribed_to_newsletter changed due to permanently failed delivery at Mailgun.' | 'is_subscribed_to_newsletter changed due to permanently failed delivery at Mailgun.' | ||||
| f' Reason: {reason}, message: {delivery_message}, list: {mailing_list}' | f' Reason: {reason}, message: {delivery_message}, list: {mailing_list}' | ||||
| ) | ) | ||||
| with transaction.atomic(): | with transaction.atomic(): | ||||
| history.log_change(user, change_msg) | history.log_change(user, change_msg) | ||||
| user.is_subscribed_to_newsletter = False | user.is_subscribed_to_newsletter = False | ||||
| user.save(update_fields=['is_subscribed_to_newsletter']) | user.save(update_fields=['is_subscribed_to_newsletter']) | ||||
| @background() | |||||
| def handle_deletion_request(pk: int) -> bool: | |||||
| """Delete user account and all data related to it.""" | |||||
| prior_to = timezone.now() - DELETION_DELTA | |||||
| user = User.objects.get( | |||||
| date_deletion_requested__isnull=False, | |||||
| date_deletion_requested__lt=prior_to, | |||||
| pk=pk, | |||||
| ) | |||||
| if not user.can_be_deleted: | |||||
| logger.error('Cannot delete user pk=%s', pk) | |||||
| return False | |||||
| user.delete() | |||||
| logger.warning('Deleted user pk=%s', pk) | |||||
| return True | |||||