diff options
| author | Tim Graham <timograham@gmail.com> | 2017-02-14 20:14:08 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-02-28 12:29:15 -0500 |
| commit | 10aa5bb2887ea1e238ba83d067f0b6186b570535 (patch) | |
| tree | ff55491b0306249b12a03b6e38dfbf432aaa4a25 /members | |
| parent | c3128f1bc9f37c9d9d8717cb511d00bc5bb9312f (diff) | |
Added a management command to send corporate member renewal emails.
Diffstat (limited to 'members')
| -rw-r--r-- | members/management/commands/send_renewal_emails.py | 30 | ||||
| -rw-r--r-- | members/test_management.py | 53 | ||||
| -rw-r--r-- | members/views.py | 4 |
3 files changed, 85 insertions, 2 deletions
diff --git a/members/management/commands/send_renewal_emails.py b/members/management/commands/send_renewal_emails.py new file mode 100644 index 00000000..36f88e64 --- /dev/null +++ b/members/management/commands/send_renewal_emails.py @@ -0,0 +1,30 @@ +import datetime + +from django.conf import settings +from django.core.mail import send_mail +from django.core.management.base import BaseCommand +from django.template.loader import render_to_string + +from ...models import CorporateMember + + +class Command(BaseCommand): + + def handle(self, *args, **options): + thirty_days_from_now = datetime.date.today() + datetime.timedelta(days=30) + for member in CorporateMember.objects.filter(inactive=False): + if member.get_expiry_date() == thirty_days_from_now: + send_mail( + 'Expiring Django Software Foundation Membership for %s' % member.display_name, + render_to_string('members/corporate_member_renewal_email.txt', { + 'contact_name': member.contact_name, + 'member_name': member.display_name, + 'expiry_date': member.get_expiry_date(), + 'renewal_link': member.get_renewal_link(), + }), + settings.FUNDRAISING_DEFAULT_FROM_EMAIL, + [ + settings.FUNDRAISING_DEFAULT_FROM_EMAIL, + member.contact_email, + ], + ) diff --git a/members/test_management.py b/members/test_management.py new file mode 100644 index 00000000..165b71cb --- /dev/null +++ b/members/test_management.py @@ -0,0 +1,53 @@ +from datetime import date, timedelta + +from django.conf import settings +from django.core import mail +from django.core.management import call_command +from django.test import TestCase +from django.utils.formats import localize + +from members.models import SILVER_MEMBERSHIP, CorporateMember + + +class CorporateMemberTests(TestCase): + today = date.today() + twenty_nine_days_from_now = today + timedelta(days=29) + thirty_days_from_now = today + timedelta(days=30) + + @classmethod + def setUpTestData(cls): + cls.member = CorporateMember.objects.create( + display_name='Corporation', + billing_name='foo', + billing_email='billing@example.com', + contact_email='contact@example.com', + contact_name='Contact Name', + membership_level=SILVER_MEMBERSHIP, + ) + + def test_no_email(self): + self.member.invoice_set.create(amount=0, expiration_date=self.twenty_nine_days_from_now) + call_command('send_renewal_emails') + self.assertEqual(len(mail.outbox), 0) + + def test_mail(self): + self.member.invoice_set.create(amount=0, expiration_date=self.thirty_days_from_now) + call_command('send_renewal_emails') + self.assertEqual(len(mail.outbox), 1) + msg = mail.outbox.pop() + self.assertEqual(msg.subject, 'Expiring Django Software Foundation Membership for Corporation') + self.assertIn('Hi Contact Name,', msg.body) + self.assertIn( + 'The Django Software Foundation membership for Corporation expires\n' + '%s. Would you like to renew your support?' % localize(self.thirty_days_from_now), + msg.body + ) + self.assertIn('http://www.djangoproject.dev:8000/foundation/corporate-membership/renew/', msg.body) + self.assertEqual(msg.from_email, settings.FUNDRAISING_DEFAULT_FROM_EMAIL) + self.assertEqual( + msg.to, + [ + settings.FUNDRAISING_DEFAULT_FROM_EMAIL, + 'contact@example.com', + ] + ) diff --git a/members/views.py b/members/views.py index 6cf976ed..5e50a873 100644 --- a/members/views.py +++ b/members/views.py @@ -50,10 +50,10 @@ class CorporateMemberRenewView(CorporateMemberSignupMixin, UpdateView): def get_object(self): """ Convert the token back to a pk and check that it's not older than - 14 days. + 30 days. """ try: - pk = signing.loads(self.kwargs['token'], max_age=1.21e+6) + pk = signing.loads(self.kwargs['token'], max_age=2.592e+6) except signing.BadSignature: raise Http404( "No %(verbose_name)s found matching the query" % |
