summaryrefslogtreecommitdiff
path: root/members
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2016-01-05 20:25:55 -0500
committerTim Graham <timograham@gmail.com>2016-01-06 09:24:45 -0500
commit3fde4ffd45f65406e4d317267580ac0fb81b4b73 (patch)
treec0d2ed37d891c24a0e1404f0aa035ddef2ddf309 /members
parenta74470b5bed7f4230222e1d6f93eda2b49365989 (diff)
Fixed #606 -- Added expires and invoiced columns to corporate members admin.
Diffstat (limited to 'members')
-rw-r--r--members/admin.py29
-rw-r--r--members/models.py15
-rw-r--r--members/test_admin.py35
-rw-r--r--members/test_models.py24
4 files changed, 102 insertions, 1 deletions
diff --git a/members/admin.py b/members/admin.py
index a43a1621..44ecd23d 100644
--- a/members/admin.py
+++ b/members/admin.py
@@ -1,4 +1,8 @@
+from datetime import date, timedelta
+
from django.contrib import admin
+from django.utils.formats import localize
+from django.utils.html import format_html
from members.models import CorporateMember, DeveloperMember, Invoice
@@ -23,6 +27,8 @@ class InvoiceInline(admin.TabularInline):
class CorporateMemberAdmin(admin.ModelAdmin):
list_display = [
'display_name',
+ 'membership_expires',
+ '_is_invoiced',
'contact_email',
'membership_level',
]
@@ -31,3 +37,26 @@ class CorporateMemberAdmin(admin.ModelAdmin):
]
inlines = [InvoiceInline]
search_fields = ['name']
+
+ def get_queryset(self, request):
+ return super().get_queryset(request).prefetch_related('invoice_set')
+
+ def membership_expires(self, obj):
+ expiry_date = obj.get_expiry_date()
+ if expiry_date:
+ today = date.today()
+ # Expired.
+ if expiry_date < today:
+ color = 'red'
+ # Expires within 30 days.
+ elif expiry_date < today + timedelta(days=30):
+ color = 'orange'
+ # Expires more than 30 days from today.
+ else:
+ color = 'green'
+ expiry_date = format_html(
+ '<span style="color: {}">{}</span>',
+ color,
+ localize(expiry_date),
+ )
+ return expiry_date
diff --git a/members/models.py b/members/models.py
index 9b0bd517..c8df9efb 100644
--- a/members/models.py
+++ b/members/models.py
@@ -61,6 +61,21 @@ class CorporateMember(models.Model):
def __str__(self):
return self.display_name
+ def _is_invoiced(self):
+ invoices = self.invoice_set.all()
+ return invoices and all(invoice.sent_date is not None for invoice in invoices)
+ _is_invoiced.boolean = True
+ is_invoiced = property(_is_invoiced)
+
+ def get_expiry_date(self):
+ expiry_date = None
+ for invoice in self.invoice_set.all():
+ if expiry_date is None:
+ expiry_date = invoice.expiration_date
+ elif invoice.expiration_date and invoice.expiration_date > expiry_date:
+ expiry_date = invoice.expiration_date
+ return expiry_date
+
@property
def thumbnail(self):
return get_thumbnail(self.logo, '170x170', quality=100)
diff --git a/members/test_admin.py b/members/test_admin.py
new file mode 100644
index 00000000..eec550c9
--- /dev/null
+++ b/members/test_admin.py
@@ -0,0 +1,35 @@
+from datetime import date, timedelta
+
+from django.contrib import admin
+from django.test import TestCase
+
+from .admin import CorporateMemberAdmin
+from .models import CorporateMember
+
+
+class CorporateMemberAdminTests(TestCase):
+
+ @classmethod
+ def setUpTestData(cls):
+ cls.member = CorporateMember.objects.create(
+ display_name='Corporation',
+ billing_name='foo',
+ billing_email='c@example.com',
+ contact_email='c@example.com',
+ membership_level=2,
+ )
+
+ def test_membership_expires(self):
+ today = date.today()
+ yesterday = date.today() - timedelta(days=1)
+ plus_thirty_one_days = today + timedelta(days=31)
+ modeladmin = CorporateMemberAdmin(CorporateMember, admin.site)
+ self.assertIsNone(modeladmin.membership_expires(self.member))
+ self.member.invoice_set.create(amount=500)
+ self.assertIsNone(modeladmin.membership_expires(self.member))
+ self.member.invoice_set.create(amount=500, expiration_date=yesterday)
+ self.assertIn('red', modeladmin.membership_expires(self.member))
+ self.member.invoice_set.create(amount=500, expiration_date=today)
+ self.assertIn('orange', modeladmin.membership_expires(self.member))
+ self.member.invoice_set.create(amount=500, expiration_date=plus_thirty_one_days)
+ self.assertIn('green', modeladmin.membership_expires(self.member))
diff --git a/members/test_models.py b/members/test_models.py
index 56c3c9c1..19f3d64b 100644
--- a/members/test_models.py
+++ b/members/test_models.py
@@ -1,4 +1,4 @@
-from datetime import date
+from datetime import date, timedelta
from django.test import TestCase
@@ -46,3 +46,25 @@ class CorporateMemberTests(TestCase):
def test_str(self):
self.assertEqual(str(self.member), 'Corporation')
+
+ def test_is_invoiced(self):
+ # No invoices == not invoiced.
+ self.assertFalse(self.member.is_invoiced)
+ # Invoice but no sent_date == not invoiced.
+ invoice = self.member.invoice_set.create(amount=500)
+ self.assertFalse(self.member.is_invoiced)
+ # Invoice with an sent_date == invoiced.
+ invoice.sent_date = date.today()
+ invoice.save()
+ self.assertTrue(self.member.is_invoiced)
+
+ def test_get_expiry_date(self):
+ today = date.today()
+ tomorrow = today + timedelta(days=1)
+ self.assertIsNone(self.member.get_expiry_date())
+ self.member.invoice_set.create(amount=500)
+ self.assertIsNone(self.member.get_expiry_date())
+ self.member.invoice_set.create(amount=500, expiration_date=today)
+ self.assertEqual(self.member.get_expiry_date(), today)
+ self.member.invoice_set.create(amount=500, expiration_date=tomorrow)
+ self.assertEqual(self.member.get_expiry_date(), tomorrow)