Skip to content
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
72 changes: 72 additions & 0 deletions traffic_control/admin/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,21 @@
from django.utils.translation import gettext_lazy as _

from traffic_control.admin.utils import PermissionInlineMixin
from traffic_control.enums import TRAFFIC_SIGN_TYPE_CHOICES
from traffic_control.models import OperationalArea, OperationType
from traffic_control.services.common import get_all_not_replaced_plans, get_all_replaced_plans

__all__ = (
"TrafficControlOperationInlineBase",
"OperationalAreaListFilter",
"ReplacesInline",
"ReplacedByInline",
"PlanReplacementListFilterMixin",
"TrafficSignTypeListFilterBase",
"TrafficSignTypeCodeFilter",
"DeviceTypeSignTypeListFilter",
)


@admin.register(OperationType)
class OperationTypeAdmin(admin.ModelAdmin):
Expand Down Expand Up @@ -71,3 +83,63 @@ def queryset(self, request, queryset):
return queryset.filter(id__in=get_all_replaced_plans(self.plan_model))
if value == "False":
return queryset.filter(id__in=get_all_not_replaced_plans(self.plan_model))


class TrafficSignTypeListFilterBase(SimpleListFilter):
"""Base filter for traffic sign type filtering by device type code prefix."""

title = _("Traffic sign type")
parameter_name = "traffic_sign_type"

def lookups(self, request, model_admin):
"""
Returns traffic sign type choices.

Args:
request: The HTTP request object.
model_admin: The model admin instance.

Returns:
tuple: Traffic sign type choices (code prefix, description).
"""
return TRAFFIC_SIGN_TYPE_CHOICES


class TrafficSignTypeCodeFilter(TrafficSignTypeListFilterBase):
"""Filter for TrafficControlDeviceType admin filtering directly on code field."""

def queryset(self, request, queryset):
"""
Filters queryset by device type code prefix.

Args:
request: The HTTP request object.
queryset: The queryset to filter.

Returns:
QuerySet: Filtered queryset or original if no filter value.
"""
value = self.value()
if value:
return queryset.filter(code__startswith=value)
return queryset


class DeviceTypeSignTypeListFilter(TrafficSignTypeListFilterBase):
"""Filter for models with device_type FK filtering on device_type__code field."""

def queryset(self, request, queryset):
"""
Filters queryset by device type code prefix through FK relationship.

Args:
request: The HTTP request object.
queryset: The queryset to filter.

Returns:
QuerySet: Filtered queryset or original if no filter value.
"""
value = self.value()
if value:
return queryset.filter(device_type__code__startswith=value)
return queryset
21 changes: 5 additions & 16 deletions traffic_control/admin/traffic_sign.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
from traffic_control.admin.additional_sign import AdditionalSignPlanInline, AdditionalSignRealInline
from traffic_control.admin.audit_log import AuditLogHistoryAdmin
from traffic_control.admin.common import (
DeviceTypeSignTypeListFilter,
OperationalAreaListFilter,
PlanReplacementListFilterMixin,
ReplacedByInline,
ReplacesInline,
TrafficControlOperationInlineBase,
TrafficSignTypeCodeFilter,
)
from traffic_control.admin.utils import (
AdminFieldInitialValuesMixin,
Expand All @@ -28,7 +30,6 @@
Reflection,
Size,
Surface,
TRAFFIC_SIGN_TYPE_CHOICES,
)
from traffic_control.forms import (
AdminFileWidgetWithProxy,
Expand Down Expand Up @@ -112,20 +113,6 @@ class TrafficSignRealFileAdmin(GuardedModelAdmin, UploadsFileProxyMixin):
raw_id_fields = ("traffic_sign_real",)


class TrafficSignTypeListFilter(SimpleListFilter):
title = _("Traffic sign type")
parameter_name = "traffic_sign_type"

def lookups(self, request, model_admin):
return TRAFFIC_SIGN_TYPE_CHOICES

def queryset(self, request, queryset):
value = self.value()
if value:
return queryset.filter(code__startswith=value)
return queryset


@admin.register(TrafficControlDeviceTypeIcon)
class TrafficControlDeviceTypeIconAdmin(CustomImportExportActionModelAdmin, PreviewImageFileFieldMixin):
resource_class = TrafficControlDeviceTypeIconResource
Expand Down Expand Up @@ -157,7 +144,7 @@ class TrafficControlDeviceTypeAdmin(
"target_model",
)
list_select_related = ("icon_file",)
list_filter = (TrafficSignTypeListFilter,)
list_filter = (TrafficSignTypeCodeFilter,)
search_fields = (
"code",
"legacy_code",
Expand Down Expand Up @@ -303,6 +290,7 @@ class TrafficSignPlanAdmin(
("lifecycle", EnumFieldListFilter),
"owner",
TrafficSignPlanReplacementListFilter,
DeviceTypeSignTypeListFilter,
]
search_fields = ("id",)
readonly_fields = (
Expand Down Expand Up @@ -528,6 +516,7 @@ class TrafficSignRealAdmin(
("location_specifier", EnumFieldListFilter),
"owner",
OperationalAreaListFilter,
DeviceTypeSignTypeListFilter,
]
search_fields = (
"value",
Expand Down
Loading