Mercurial > public > sg101
diff donations/models.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/donations/models.py@2177a71b680c |
children | 00c14431e911 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/donations/models.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,85 @@ +""" +Models for the donations application. +""" +import datetime +import decimal + +from django.db import models +from django.contrib.auth.models import User +from django.conf import settings + + +class DonationManager(models.Manager): + def monthly_stats(self, year=None, month=None): + """ + Returns a tuple of items for the given month in the given + year. If year is None, the current year is used. If month is None, + the current month is used. + The returned tuple has the following items, in order: + (gross, net, donations) + where: + 'gross': total gross donations + 'net': total net donations + 'donations': list of donation objects + """ + today = datetime.date.today() + if year is None: + year = today.year + if month is None: + month = today.month + + qs = self.filter(payment_date__year=year, + payment_date__month=month, + test_ipn=settings.DONATIONS_DEBUG).order_by( + 'payment_date').select_related('user') + + gross = decimal.Decimal() + net = decimal.Decimal() + donations = [] + for donation in qs: + gross += donation.mc_gross + net += donation.mc_gross - donation.mc_fee + donations.append(donation) + + return gross, net, donations + + +class Donation(models.Model): + """Model to represent a donation to the website.""" + + user = models.ForeignKey(User, null=True, blank=True) + is_anonymous = models.BooleanField() + test_ipn = models.BooleanField(default=False, verbose_name="Test IPN") + txn_id = models.CharField(max_length=20, verbose_name="Txn ID") + txn_type = models.CharField(max_length=64) + first_name = models.CharField(max_length=64, blank=True) + last_name = models.CharField(max_length=64, blank=True) + payer_email = models.EmailField(max_length=127, blank=True) + payer_id = models.CharField(max_length=13, blank=True, verbose_name="Payer ID") + mc_fee = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="Fee") + mc_gross = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="Gross") + memo = models.TextField(blank=True) + payer_status = models.CharField(max_length=10, blank=True) + payment_date = models.DateTimeField() + + objects = DonationManager() + + class Meta: + ordering = ('-payment_date', ) + + def __unicode__(self): + if self.user: + return u'%s from %s' % (self.mc_gross, self.user.username) + return u'%s from %s %s' % (self.mc_gross, self.first_name, self.last_name) + + def donor(self): + """Returns the donor name for the donation.""" + if self.is_anonymous: + return settings.DONATIONS_ANON_NAME + if self.user is not None: + return self.user.username + if self.first_name or self.last_name: + name = u'%s %s' % (self.first_name, self.last_name) + return name.strip() + return settings.DONATIONS_ANON_NAME +