Add secret management guide, client-side performance monitoring, and search accessibility enhancements

- Introduced a comprehensive Secret Management Guide detailing best practices, secret classification, development setup, production management, rotation procedures, and emergency protocols.
- Implemented a client-side performance monitoring script to track various metrics including page load performance, paint metrics, layout shifts, and memory usage.
- Enhanced search accessibility with keyboard navigation support for search results, ensuring compliance with WCAG standards and improving user experience.
This commit is contained in:
pacnpal
2025-12-23 16:41:42 -05:00
parent ae31e889d7
commit edcd8f2076
155 changed files with 22046 additions and 4645 deletions

View File

@@ -56,6 +56,12 @@ from .models.rankings import RankingSnapshot, RideRanking
from .models.rides import Ride, RideModel
from .services.ranking_service import RideRankingService
import logging
from apps.core.logging import log_exception, log_business_event
logger = logging.getLogger(__name__)
class ParkContextRequired:
"""
@@ -244,7 +250,20 @@ class RideCreateView(
def form_valid(self, form):
"""Handle form submission using RideFormMixin for entity suggestions."""
self.handle_entity_suggestions(form)
return super().form_valid(form)
response = super().form_valid(form)
log_business_event(
logger,
event_type="ride_created",
message=f"Ride created: {self.object.name}",
context={
"ride_id": self.object.id,
"ride_name": self.object.name,
"park_id": self.park.id,
"park_name": self.park.name,
},
request=self.request,
)
return response
class RideUpdateView(
@@ -300,7 +319,20 @@ class RideUpdateView(
def form_valid(self, form):
"""Handle form submission using RideFormMixin for entity suggestions."""
self.handle_entity_suggestions(form)
return super().form_valid(form)
response = super().form_valid(form)
log_business_event(
logger,
event_type="ride_updated",
message=f"Ride updated: {self.object.name}",
context={
"ride_id": self.object.id,
"ride_name": self.object.name,
"park_id": self.park.id,
"park_name": self.park.name,
},
request=self.request,
)
return response
class RideListView(ListView):
@@ -547,6 +579,7 @@ class RideSearchView(ListView):
# Process search form
form = RideSearchForm(self.request.GET)
search_term = self.request.GET.get("ride", "").strip()
if form.is_valid():
ride = form.cleaned_data.get("ride")
if ride:
@@ -554,10 +587,17 @@ class RideSearchView(ListView):
queryset = queryset.filter(id=ride.id)
else:
# If no specific ride, filter by search term
search_term = self.request.GET.get("ride", "").strip()
if search_term:
queryset = queryset.filter(name__icontains=search_term)
result_count = queryset.count()
logger.info(
"Ride search executed",
extra={
"query": search_term,
"result_count": result_count,
},
)
return queryset
def get_template_names(self):
@@ -596,10 +636,18 @@ class RideRankingsView(ListView):
min_riders = self.request.GET.get("min_riders")
if min_riders:
try:
min_riders = int(min_riders)
queryset = queryset.filter(mutual_riders_count__gte=min_riders)
except ValueError:
pass
min_riders_int = int(min_riders)
queryset = queryset.filter(mutual_riders_count__gte=min_riders_int)
except (ValueError, TypeError) as e:
log_exception(
logger,
e,
context={
"operation": "ride_rankings_min_riders",
"min_riders": min_riders,
},
request=self.request,
)
return queryset