from typing import TYPE_CHECKING
from django.contrib import admin
from .models import Bill, PolicyCampaign
if TYPE_CHECKING:
from django.db.models import QuerySet
from django.http import HttpRequest
[docs]
class BillInline(admin.TabularInline):
"""Inline admin for Bills within PolicyCampaign admin"""
[docs]
fields = (
"level",
"title",
"chamber",
"number",
"session",
"state",
"introduced_date",
"status",
"is_primary",
)
@admin.register(PolicyCampaign)
[docs]
class PolicyCampaignAdmin(admin.ModelAdmin):
"""Admin interface for PolicyCampaign model"""
[docs]
list_display = (
"name",
"title",
"allow_endorsements",
"active",
"has_image",
"created_at",
"endorsement_count",
"bill_count",
)
[docs]
list_filter = ("active", "allow_endorsements", "created_at")
[docs]
search_fields = ("name", "title", "summary", "description")
[docs]
list_editable = ("active", "allow_endorsements")
[docs]
prepopulated_fields = {"name": ("title",)}
[docs]
readonly_fields = ("created_at",)
[docs]
fieldsets = (
(
"Campaign Information",
{"fields": ("name", "title", "summary", "description", "image", "active")},
),
(
"Endorsements",
{
"fields": (
"allow_endorsements",
"endorsement_statement",
"endorsement_form_instructions",
),
"description": "Configure how endorsements work for this campaign",
},
),
(
"Metadata",
{
"fields": ("created_at",),
"classes": ("collapse",),
},
),
)
[docs]
def endorsement_count(self, obj: PolicyCampaign) -> int:
"""Display count of endorsements"""
return obj.endorsements.count()
endorsement_count.short_description = "Endorsements"
[docs]
def bill_count(self, obj: PolicyCampaign) -> int:
"""Display count of associated bills"""
return obj.bills.count()
bill_count.short_description = "Bills"
[docs]
def has_image(self, obj: PolicyCampaign) -> bool:
"""Display whether campaign has an image"""
return bool(obj.image)
has_image.boolean = True
has_image.short_description = "Has Image"
[docs]
def get_queryset(self, request: "HttpRequest") -> "QuerySet[PolicyCampaign]":
"""Order by most recently created first"""
return super().get_queryset(request).order_by("-created_at")
@admin.register(Bill)
[docs]
class BillAdmin(admin.ModelAdmin):
"""Admin interface for Bill model"""
[docs]
list_display = (
"policy",
"level",
"chamber",
"number",
"session",
"state",
"title",
"status",
"is_primary",
"introduced_date",
)
[docs]
list_filter = (
"level",
"chamber",
"session",
"is_primary",
"policy",
"introduced_date",
)
[docs]
search_fields = ("number", "title", "policy__title")
[docs]
list_editable = ("is_primary",)
[docs]
filter_horizontal = ("sponsors", "cosponsors")
[docs]
fieldsets = (
(
"Bill Information",
{
"fields": (
"policy",
"level",
"chamber",
"number",
"title",
"session",
"state",
"introduced_date",
"status",
"url",
"is_primary",
"related_bill",
),
},
),
(
"Legislators",
{
"fields": ("sponsors", "cosponsors"),
"description": "Legislators who sponsor or cosponsor this bill",
},
),
)
[docs]
def get_queryset(self, request: "HttpRequest") -> "QuerySet[Bill]":
"""Order by policy and then by number"""
return super().get_queryset(request).order_by("policy", "number")