send_expiration_reminders.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. """ Send reminders for contribution that are about to expire
  2. It offers a way for contributors to opt-in keeping the data one year more (or
  3. deleting it right now).
  4. Reminders are sent when the script is called exactly `n` days before the
  5. expiration date.
  6. This `n` can be configured via `DATA_EXPIRATION_REMINDERS` setting.
  7. """
  8. from django.conf import settings
  9. from django.core.mail import send_mail
  10. from django.core.management.base import BaseCommand, CommandError
  11. from django.template.loader import get_template
  12. from django.utils.translation import activate
  13. from ...models import Contrib
  14. from ...tokens import ContribTokenManager
  15. class Command(BaseCommand):
  16. help = __doc__
  17. def add_arguments(self, parser):
  18. parser.add_argument(
  19. '--dry-run', default=False, action='store_true',
  20. help="Do not actually send emails, just pretend to")
  21. def handle(self, dry_run, *args, **options):
  22. if dry_run:
  23. self.stderr.write('DRY RUN MODE: we do not actually send emails.')
  24. for ndays in settings.DATA_EXPIRATION_REMINDERS:
  25. expirating_contribs = Contrib.objects.expires_in_days(ndays)
  26. for contrib in expirating_contribs:
  27. if not contrib.email:
  28. self._warn_no_email(contrib, ndays)
  29. else:
  30. if not dry_run:
  31. self.send_expiration_reminder(contrib, ndays)
  32. self._log_sent_email(contrib, ndays)
  33. def _warn_no_email(self, contrib, ndays):
  34. self.stderr.write(
  35. 'WARNING : the contribution {} is about to expire in {} days but'
  36. + 'do not define a contact email.'.format(
  37. contrib, ndays))
  38. def _log_sent_email(self, contrib, ndays):
  39. self.stderr.write(
  40. "Sent reminder email to for {} expiration in {} days".format(
  41. contrib, ndays))
  42. def send_expiration_reminder(self, contrib, ndays):
  43. subject = get_template(
  44. 'contribmap/mails/expiration_reminder.subject')
  45. body = get_template(
  46. 'contribmap/mails/expiration_reminder.txt')
  47. mgmt_token = ContribTokenManager().mk_token(contrib)
  48. context = {
  49. 'contrib': contrib,
  50. 'ndays': ndays,
  51. 'isp': settings.ISP,
  52. 'management_link': contrib.make_management_url(mgmt_token),
  53. }
  54. # Without that, getting month & day names in english
  55. activate(settings.LANGUAGE_CODE)
  56. send_mail(
  57. subject.render(context),
  58. body.render(context),
  59. settings.DEFAULT_FROM_EMAIL,
  60. [contrib.email],
  61. )