summaryrefslogtreecommitdiff
path: root/members
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2017-02-14 20:14:08 -0500
committerTim Graham <timograham@gmail.com>2017-02-28 12:29:15 -0500
commit10aa5bb2887ea1e238ba83d067f0b6186b570535 (patch)
treeff55491b0306249b12a03b6e38dfbf432aaa4a25 /members
parentc3128f1bc9f37c9d9d8717cb511d00bc5bb9312f (diff)
Added a management command to send corporate member renewal emails.
Diffstat (limited to 'members')
-rw-r--r--members/management/commands/send_renewal_emails.py30
-rw-r--r--members/test_management.py53
-rw-r--r--members/views.py4
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" %