Source code for coalition.campaigns.admin

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] model = Bill
[docs] extra = 0
[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] inlines = [BillInline]
[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] readonly_fields = ()
[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")