annotate gpp/donations/models.py @ 505:a5d11471d031

Refactor the logic in the rate limiter decorator. Check to see if the request was ajax, as the ajax view always returns 200. Have to decode the JSON response to see if an error occurred or not.
author Brian Neal <bgneal@gmail.com>
date Sat, 03 Dec 2011 19:13:38 +0000
parents 2177a71b680c
children
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