mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2026-02-05 16:35:18 -05:00
Based on the git diff provided, here's a concise and descriptive commit message:
feat: add passkey authentication and enhance user preferences - Add passkey login security event type with fingerprint icon - Include request and site context in email confirmation for backend - Add user_id exact match filter to prevent incorrect user lookups - Enable PATCH method for updating user preferences via API - Add moderation_preferences support to user settings - Optimize ticket queries with select_related and prefetch_related This commit introduces passkey authentication tracking, improves user profile filtering accuracy, and extends the preferences API to support updates. Query optimizations reduce database hits for ticket listings.
This commit is contained in:
@@ -1044,3 +1044,29 @@ class RideSerializer(serializers.ModelSerializer):
|
||||
"opening_date",
|
||||
"closing_date",
|
||||
]
|
||||
|
||||
|
||||
class RideSubTypeSerializer(serializers.ModelSerializer):
|
||||
"""Serializer for ride sub-types lookup table.
|
||||
|
||||
This serves the /rides/sub-types/ endpoint which the frontend
|
||||
uses to populate sub-type dropdowns filtered by category.
|
||||
"""
|
||||
|
||||
created_by = serializers.CharField(source="created_by.username", read_only=True, allow_null=True)
|
||||
|
||||
class Meta:
|
||||
# Import here to avoid circular imports
|
||||
from apps.rides.models import RideSubType
|
||||
model = RideSubType
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
"category",
|
||||
"description",
|
||||
"created_by",
|
||||
"created_at",
|
||||
]
|
||||
read_only_fields = ["id", "created_at", "created_by"]
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ from .views import (
|
||||
RideListCreateAPIView,
|
||||
RideModelSearchAPIView,
|
||||
RideSearchSuggestionsAPIView,
|
||||
RideSubTypeListAPIView,
|
||||
)
|
||||
|
||||
# Create router for nested photo endpoints
|
||||
@@ -63,6 +64,8 @@ urlpatterns = [
|
||||
# Manufacturer and Designer endpoints
|
||||
path("manufacturers/", ManufacturerListAPIView.as_view(), name="manufacturer-list"),
|
||||
path("designers/", DesignerListAPIView.as_view(), name="designer-list"),
|
||||
# Ride sub-types endpoint - for autocomplete dropdowns
|
||||
path("sub-types/", RideSubTypeListAPIView.as_view(), name="ride-sub-type-list"),
|
||||
# Ride model management endpoints - nested under rides/manufacturers
|
||||
path(
|
||||
"manufacturers/<slug:manufacturer_slug>/",
|
||||
|
||||
@@ -2422,3 +2422,53 @@ class ManufacturerListAPIView(BaseCompanyListAPIView):
|
||||
)
|
||||
class DesignerListAPIView(BaseCompanyListAPIView):
|
||||
role = "DESIGNER"
|
||||
|
||||
|
||||
# === RIDE SUB-TYPES ===
|
||||
|
||||
|
||||
@extend_schema(
|
||||
summary="List ride sub-types",
|
||||
description="List ride sub-types, optionally filtered by category. Used for autocomplete dropdowns.",
|
||||
parameters=[
|
||||
OpenApiParameter(
|
||||
"category",
|
||||
OpenApiTypes.STR,
|
||||
description="Filter by ride category (e.g., 'RC' for roller coaster)",
|
||||
),
|
||||
],
|
||||
responses={200: OpenApiTypes.OBJECT},
|
||||
tags=["Rides"],
|
||||
)
|
||||
class RideSubTypeListAPIView(APIView):
|
||||
"""
|
||||
API View for listing ride sub-types.
|
||||
|
||||
Used by the frontend's useRideSubTypes hook to populate
|
||||
sub-type dropdown menus filtered by ride category.
|
||||
|
||||
Caching: 30-minute timeout (1800s) - sub-types are stable lookup data.
|
||||
"""
|
||||
|
||||
permission_classes = [permissions.AllowAny]
|
||||
|
||||
@cache_api_response(timeout=1800, key_prefix="ride_sub_types")
|
||||
def get(self, request: Request) -> Response:
|
||||
from apps.rides.models import RideSubType
|
||||
from apps.api.v1.rides.serializers import RideSubTypeSerializer
|
||||
|
||||
# Start with all sub-types
|
||||
queryset = RideSubType.objects.all().order_by("name")
|
||||
|
||||
# Apply category filter if provided
|
||||
category = request.query_params.get("category")
|
||||
if category:
|
||||
queryset = queryset.filter(category=category)
|
||||
|
||||
# Serialize and return
|
||||
serializer = RideSubTypeSerializer(queryset, many=True)
|
||||
return Response({
|
||||
"results": serializer.data,
|
||||
"count": queryset.count(),
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user