call_for_membership_fees.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import datetime
  4. from dateutil.relativedelta import relativedelta
  5. from django.core.management.base import BaseCommand, CommandError
  6. from django.conf import settings
  7. from django.db.models import Max
  8. from coin.utils import respect_language
  9. from coin.members.models import Member, MembershipFee
  10. class Command(BaseCommand):
  11. args = '[date=2011-07-04]'
  12. help = """Send a call for membership email to members.
  13. A mail is sent when end date of membership
  14. reach the anniversary date, 1 month before and once a month
  15. for 3 months.
  16. By default, today is used to compute relative dates, but a date
  17. can be passed as argument."""
  18. def handle(self, *args, **options):
  19. try:
  20. date = datetime.datetime.strptime(args[0], '%Y-%m-%d').date()
  21. except IndexError:
  22. date = datetime.date.today()
  23. except ValueError:
  24. raise CommandError(
  25. 'Please enter a valid date : YYYY-mm-dd (ex: 2011-07-04)')
  26. # Get membership_fees filtered by end date of membership at specific
  27. # date relative to today
  28. call_dates = [date + relativedelta(months=-3),
  29. date + relativedelta(months=-2),
  30. date + relativedelta(months=-1),
  31. date,
  32. date + relativedelta(months=+1)]
  33. self.stdout.write(
  34. 'Select membership fees for following end dates : %s' % call_dates)
  35. members = Member.objects.annotate(end_date_membership=Max(
  36. 'membership_fees__end_date')).filter(end_date_membership__in=call_dates)
  37. cpt = 0
  38. with respect_language(settings.LANGUAGE_CODE):
  39. for member in members:
  40. if member.send_call_for_membership_fees_email():
  41. self.stdout.write(
  42. 'Call for membership fees email was sent to %s' % member)
  43. cpt=cpt+1
  44. self.stdout.write('%d call for membership fees emails were sent' % cpt)