annotate donations/models.py @ 595:f3fded5df64b

Forum topic & post updates now affect the RSS feed data in Redis. This is for bitbucket issue #10.
author Brian Neal <bgneal@gmail.com>
date Thu, 24 May 2012 15:49:15 -0500
parents ee87ea74d46b
children 00c14431e911
rev   line source
bgneal@33 1 """
bgneal@33 2 Models for the donations application.
bgneal@33 3 """
bgneal@34 4 import datetime
bgneal@34 5 import decimal
bgneal@34 6
bgneal@33 7 from django.db import models
bgneal@259 8 from django.contrib.auth.models import User
bgneal@35 9 from django.conf import settings
bgneal@33 10
bgneal@34 11
bgneal@34 12 class DonationManager(models.Manager):
bgneal@34 13 def monthly_stats(self, year=None, month=None):
bgneal@34 14 """
bgneal@35 15 Returns a tuple of items for the given month in the given
bgneal@34 16 year. If year is None, the current year is used. If month is None,
bgneal@34 17 the current month is used.
bgneal@35 18 The returned tuple has the following items, in order:
bgneal@35 19 (gross, net, donations)
bgneal@35 20 where:
bgneal@34 21 'gross': total gross donations
bgneal@34 22 'net': total net donations
bgneal@35 23 'donations': list of donation objects
bgneal@34 24 """
bgneal@34 25 today = datetime.date.today()
bgneal@34 26 if year is None:
bgneal@34 27 year = today.year
bgneal@34 28 if month is None:
bgneal@34 29 month = today.month
bgneal@34 30
bgneal@34 31 qs = self.filter(payment_date__year=year,
bgneal@34 32 payment_date__month=month,
bgneal@350 33 test_ipn=settings.DONATIONS_DEBUG).order_by(
bgneal@350 34 'payment_date').select_related('user')
bgneal@34 35
bgneal@35 36 gross = decimal.Decimal()
bgneal@35 37 net = decimal.Decimal()
bgneal@35 38 donations = []
bgneal@34 39 for donation in qs:
bgneal@35 40 gross += donation.mc_gross
bgneal@35 41 net += donation.mc_gross - donation.mc_fee
bgneal@35 42 donations.append(donation)
bgneal@34 43
bgneal@35 44 return gross, net, donations
bgneal@34 45
bgneal@34 46
bgneal@33 47 class Donation(models.Model):
bgneal@33 48 """Model to represent a donation to the website."""
bgneal@33 49
bgneal@259 50 user = models.ForeignKey(User, null=True, blank=True)
bgneal@33 51 is_anonymous = models.BooleanField()
bgneal@33 52 test_ipn = models.BooleanField(default=False, verbose_name="Test IPN")
bgneal@33 53 txn_id = models.CharField(max_length=20, verbose_name="Txn ID")
bgneal@33 54 txn_type = models.CharField(max_length=64)
bgneal@33 55 first_name = models.CharField(max_length=64, blank=True)
bgneal@33 56 last_name = models.CharField(max_length=64, blank=True)
bgneal@33 57 payer_email = models.EmailField(max_length=127, blank=True)
bgneal@33 58 payer_id = models.CharField(max_length=13, blank=True, verbose_name="Payer ID")
bgneal@33 59 mc_fee = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="Fee")
bgneal@33 60 mc_gross = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="Gross")
bgneal@33 61 memo = models.TextField(blank=True)
bgneal@33 62 payer_status = models.CharField(max_length=10, blank=True)
bgneal@33 63 payment_date = models.DateTimeField()
bgneal@33 64
bgneal@34 65 objects = DonationManager()
bgneal@34 66
bgneal@33 67 class Meta:
bgneal@33 68 ordering = ('-payment_date', )
bgneal@33 69
bgneal@33 70 def __unicode__(self):
bgneal@33 71 if self.user:
bgneal@33 72 return u'%s from %s' % (self.mc_gross, self.user.username)
bgneal@33 73 return u'%s from %s %s' % (self.mc_gross, self.first_name, self.last_name)
bgneal@33 74
bgneal@34 75 def donor(self):
bgneal@34 76 """Returns the donor name for the donation."""
bgneal@34 77 if self.is_anonymous:
bgneal@35 78 return settings.DONATIONS_ANON_NAME
bgneal@34 79 if self.user is not None:
bgneal@34 80 return self.user.username
bgneal@34 81 if self.first_name or self.last_name:
bgneal@34 82 name = u'%s %s' % (self.first_name, self.last_name)
bgneal@34 83 return name.strip()
bgneal@35 84 return settings.DONATIONS_ANON_NAME
bgneal@34 85