1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
from datetime import date, timedelta
from django.contrib import admin
from django.templatetags.static import static
from django.utils.formats import localize
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from members.models import CorporateMember, IndividualMember, Invoice, Team
@admin.register(IndividualMember)
class IndividualMemberAdmin(admin.ModelAdmin):
list_display = [
"name",
"email",
"is_active",
"member_since",
"member_until",
]
search_fields = ["name"]
class InvoiceInline(admin.TabularInline):
model = Invoice
class StatusFilter(admin.SimpleListFilter):
"""
Display only active members in the changelist page, by default.
"""
title = _("Status")
parameter_name = "status"
def lookups(self, request, model_admin):
return (
(None, _("Active")),
("inactive", _("Inactive")),
("all", _("All")),
)
def choices(self, cl):
for lookup, title in self.lookup_choices:
yield {
"selected": self.value() == lookup,
"query_string": cl.get_query_string({self.parameter_name: lookup}, []),
"display": title,
}
def queryset(self, request, queryset):
if self.value() is None:
return queryset.filter(inactive=False)
elif self.value() == "inactive":
return queryset.filter(inactive=True)
else:
return queryset
@admin.register(CorporateMember)
class CorporateMemberAdmin(admin.ModelAdmin):
list_display = [
"display_name",
"membership_expires",
"_is_invoiced",
"_is_paid",
"contact_email",
"membership_level",
"renewal_link",
]
list_filter = [StatusFilter, "membership_level"]
inlines = [InvoiceInline]
search_fields = ["display_name", "billing_name"]
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related("invoice_set")
def renewal_link(self, obj):
return format_html(
'<a href="{}"><img src="{}" alt="{}" />',
obj.get_renewal_link(),
static("admin/img/icon-changelink.svg"),
_("renewal link"),
)
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
@admin.register(Team)
class TeamAdmin(admin.ModelAdmin):
filter_horizontal = ["members"]
prepopulated_fields = {"slug": ("name",)}
|