Skip to content

Commit

Permalink
Change sponsorship admin list view to exclude rejected ones by default (
Browse files Browse the repository at this point in the history
  • Loading branch information
berinhard committed Jul 25, 2022
1 parent 23762b9 commit 662ac4c
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 1 deletion.
23 changes: 22 additions & 1 deletion sponsors/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,27 @@ def queryset(self, request, queryset):
return queryset.filter(id__in=Subquery(qs))


class SponsorshipStatusListFilter(admin.SimpleListFilter):
title = "status"
parameter_name = "status"

def lookups(self, request, model_admin):
return Sponsorship.STATUS_CHOICES

def queryset(self, request, queryset):
status = self.value()
# exclude rejected ones by default
if not status:
return queryset.exclude(status=Sponsorship.REJECTED)
return queryset.filter(status=status)

def choices(self, changelist):
choices = list(super().choices(changelist))
# replaces django default "All" text by a custom text
choices[0]['display'] = "Applied / Approved / Finalized"
return choices


@admin.register(Sponsorship)
class SponsorshipAdmin(admin.ModelAdmin):
change_form_template = "sponsors/admin/sponsorship_change_form.html"
Expand All @@ -278,7 +299,7 @@ class SponsorshipAdmin(admin.ModelAdmin):
"start_date",
"end_date",
]
list_filter = ["status", "package", TargetableEmailBenefitsFilter]
list_filter = [SponsorshipStatusListFilter, "package", TargetableEmailBenefitsFilter]
actions = ["send_notifications"]
fieldsets = [
(
Expand Down
65 changes: 65 additions & 0 deletions sponsors/tests/test_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from unittest.mock import Mock

from django.contrib.admin.views.main import ChangeList
from model_bakery import baker

from django.test import TestCase, RequestFactory

from sponsors.admin import SponsorshipStatusListFilter, SponsorshipAdmin
from sponsors.models import Sponsorship

class TestCustomSponsorshipStatusListFilter(TestCase):

def setUp(self):
self.request = RequestFactory().get("/")
self.model_admin = SponsorshipAdmin
self.filter = SponsorshipStatusListFilter(
request=self.request,
params={},
model=Sponsorship,
model_admin=self.model_admin
)

def test_basic_configuration(self):
self.assertEqual("status", self.filter.title)
self.assertEqual("status", self.filter.parameter_name)
self.assertIn(SponsorshipStatusListFilter, SponsorshipAdmin.list_filter)

def test_lookups(self):
expected = [
("applied", "Applied"),
("rejected", "Rejected"),
("approved", "Approved"),
("finalized", "Finalized"),
]
self.assertEqual(expected, self.filter.lookups(self.request, self.model_admin))

def test_filter_queryset(self):
sponsor = baker.make("sponsors.Sponsor")
sponsorships = [
baker.make(Sponsorship, status=Sponsorship.REJECTED, sponsor=sponsor),
baker.make(Sponsorship, status=Sponsorship.APPLIED, sponsor=sponsor),
baker.make(Sponsorship, status=Sponsorship.APPROVED, sponsor=sponsor),
baker.make(Sponsorship, status=Sponsorship.FINALIZED, sponsor=sponsor),
]

# filter by applied, approved and finalized status by default
qs = self.filter.queryset(self.request, Sponsorship.objects.all())
self.assertEqual(3, qs.count())
self.assertNotIn(sponsorships[0], qs)

for sp in sponsorships:
self.filter.used_parameters[self.filter.parameter_name] = sp.status
qs = self.filter.queryset(self.request, Sponsorship.objects.all())
self.assertEqual(1, qs.count())
self.assertIn(sp, qs)

def test_choices_with_custom_text_for_all(self):
lookups = self.filter.lookups(self.request, self.model_admin)
changelist = Mock(ChangeList, autospec=True)
choices = self.filter.choices(changelist)

self.assertEqual(len(choices), len(lookups) + 1)
self.assertEqual(choices[0]["display"], "Applied / Approved / Finalized")
for i, choice in enumerate(choices[1:]):
self.assertEqual(choice["display"], lookups[i][1])

0 comments on commit 662ac4c

Please sign in to comment.