annotate donations/management/commands/donations_report.py @ 697:67f8d49a9377

Cleaned up the code a bit. Separated the S3 stuff out into its own class. This class maybe should be in core. Still want to do some kind of context manager around the temporary file we are creating to ensure it gets deleted.
author Brian Neal <bgneal@gmail.com>
date Sun, 08 Sep 2013 21:02:58 -0500
parents 161b56849114
children
rev   line source
bgneal@621 1 """donations_report.py
bgneal@621 2
bgneal@621 3 A management command to display donation statistics for a given year.
bgneal@621 4
bgneal@621 5 """
bgneal@621 6 import datetime
bgneal@621 7 import decimal
bgneal@621 8
bgneal@621 9 from django.core.management.base import LabelCommand, CommandError
bgneal@621 10 from django.db.models import Sum
bgneal@621 11
bgneal@621 12 from donations.models import Donation
bgneal@621 13
bgneal@621 14 ROW_FMT = '%10s %7s %7s'
bgneal@621 15
bgneal@621 16
bgneal@621 17 class Command(LabelCommand):
bgneal@621 18 help = "Display donation statistics for a given year"
bgneal@621 19 args = "<year>"
bgneal@621 20
bgneal@621 21 def handle_label(self, year, **kwargs):
bgneal@621 22 """Display donation statistics for a given year"""
bgneal@621 23
bgneal@621 24 try:
bgneal@621 25 year = int(year)
bgneal@621 26 except ValueError:
bgneal@621 27 raise CommandError("invalid year")
bgneal@621 28
bgneal@621 29 today = datetime.date.today()
bgneal@621 30 if year < 2011 or year > today.year:
bgneal@621 31 raise CommandError("invalid year")
bgneal@621 32
bgneal@621 33 max_month = 12 if year != today.year else today.month
bgneal@621 34
bgneal@684 35 self.stdout.write(ROW_FMT % ('Month', 'Gross', 'Net'))
bgneal@621 36 sep = ROW_FMT % ('-' * 10, '-' * 7, '-' * 7)
bgneal@684 37 self.stdout.write(sep)
bgneal@621 38
bgneal@621 39 total_gross = decimal.Decimal()
bgneal@621 40 total_net = decimal.Decimal()
bgneal@621 41
bgneal@621 42 for month in range(1, max_month + 1):
bgneal@621 43 r = Donation.objects.filter(
bgneal@621 44 payment_date__year=year,
bgneal@621 45 payment_date__month=month).aggregate(
bgneal@621 46 Sum('mc_gross'), Sum('mc_fee'))
bgneal@621 47
bgneal@621 48 gross, fee = r['mc_gross__sum'], r['mc_fee__sum']
bgneal@621 49
bgneal@621 50 gross = gross if gross else decimal.Decimal()
bgneal@621 51 fee = fee if fee else decimal.Decimal()
bgneal@621 52
bgneal@621 53 net = gross - fee
bgneal@621 54
bgneal@621 55 d = datetime.date(year=year, month=month, day=1)
bgneal@621 56
bgneal@684 57 self.stdout.write(ROW_FMT % (d.strftime('%b %Y'), gross, net))
bgneal@621 58
bgneal@621 59 total_gross += gross
bgneal@621 60 total_net += net
bgneal@621 61
bgneal@684 62 self.stdout.write(sep)
bgneal@684 63 self.stdout.write(ROW_FMT % ('Total:', total_gross, total_net))