view gpp/donations/models.py @ 34:d5d7e510ecd7

Donations: created a DonationManager that can retrieve monthly stats.
author Brian Neal <bgneal@gmail.com>
date Thu, 04 Jun 2009 02:22:55 +0000
parents c018872385ea
children f77a1cdd7a46
line wrap: on
line source
"""
Models for the donations application.
"""
import datetime
import decimal

from django.db import models
from django.contrib import auth

ANONYMOUS = u'Anonymous'

class DonationManager(models.Manager):
    def monthly_stats(self, year=None, month=None):
        """
        Returns a dictionary of statistics 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 dict has the following keys:
            'gross': total gross donations
            'net': total net donations
            'donors': list of donor names
        """
        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=False)

        stats = {
            'gross': decimal.Decimal(), 
            'net': decimal.Decimal(), 
            'donors': [],
            }
        for donation in qs:
            stats['gross'] += donation.mc_gross
            stats['net'] += donation.mc_gross - donation.mc_fee
            stats['donors'].append(donation.donor())

        return stats


class Donation(models.Model):
    """Model to represent a donation to the website."""

    user = models.ForeignKey(auth.models.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 save(self, *args, **kwargs):
        if self.user is None:
            self.is_anonymous = True
        super(Donation, self).save(*args, **kwargs)

    def donor(self):
        """Returns the donor name for the donation."""
        if self.is_anonymous:
            return ANONYMOUS
        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 ANONYMOUS