8000 Change sponsorship admin list view to exclude rejected ones by default by berinhard · Pull Request #2083 · python/pythondotorg · GitHub
[go: up one dir, main page]

Skip to content

Change sponsorship admin list view to exclude rejected ones by default #2083

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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