call_for_membership_fees.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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.db.models import Max
  7. from django.conf import settings
  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. verbosity = int(options['verbosity'])
  20. try:
  21. date = datetime.datetime.strptime(args[0], '%Y-%m-%d').date()
  22. except IndexError:
  23. date = datetime.date.today()
  24. except ValueError:
  25. raise CommandError(
  26. 'Please enter a valid date : YYYY-mm-dd (ex: 2011-07-04)')
  27. end_dates = [date + relativedelta(months=-3),
  28. date + relativedelta(months=-2),
  29. date + relativedelta(months=-1),
  30. date,
  31. date + relativedelta(months=+1)]
  32. if verbosity >= 2:
  33. self.stdout.write("Selecting members whose membership fee end at "
  34. "the following dates : {dates}".format(
  35. dates=[str(d) for d in end_dates]))
  36. members = Member.objects.filter(status='member')\
  37. .annotate(end=Max('membership_fees__end_date'))\
  38. .filter(end__in=end_dates)
  39. if verbosity >= 2:
  40. self.stdout.write(
  41. "Got {number} members.".format(number=members.count()))
  42. cpt = 0
  43. with respect_language(settings.LANGUAGE_CODE):
  44. for member in members:
  45. if member.send_call_for_membership_fees_email(auto=True):
  46. self.stdout.write(
  47. 'Call for membership fees email was sent to {member} ({email})'.format(
  48. member=member, email=member.email))
  49. cpt = cpt + 1
  50. if cpt > 0 or verbosity >= 2:
  51. self.stdout.write("{number} call for membership fees emails were "
  52. "sent".format(number=cpt))