diff options
| author | Tim Graham <timograham@gmail.com> | 2016-01-05 20:25:55 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-01-06 09:24:45 -0500 |
| commit | 3fde4ffd45f65406e4d317267580ac0fb81b4b73 (patch) | |
| tree | c0d2ed37d891c24a0e1404f0aa035ddef2ddf309 /members | |
| parent | a74470b5bed7f4230222e1d6f93eda2b49365989 (diff) | |
Fixed #606 -- Added expires and invoiced columns to corporate members admin.
Diffstat (limited to 'members')
| -rw-r--r-- | members/admin.py | 29 | ||||
| -rw-r--r-- | members/models.py | 15 | ||||
| -rw-r--r-- | members/test_admin.py | 35 | ||||
| -rw-r--r-- | members/test_models.py | 24 |
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) |
