feat: Implement MFA authentication, add ride statistics model, and update various services, APIs, and tests across the application.

This commit is contained in:
pacnpal
2025-12-28 17:32:53 -05:00
parent aa56c46c27
commit c95f99ca10
452 changed files with 7948 additions and 6073 deletions

View File

@@ -13,14 +13,7 @@ Includes:
import logging
from django.conf import settings
from django.dispatch import receiver, Signal
from apps.core.state_machine.signals import (
post_state_transition,
state_transition_failed,
)
from django.dispatch import Signal
logger = logging.getLogger(__name__)
@@ -269,6 +262,7 @@ def _update_related_queue_items(instance, status):
"""Update queue items related to a moderation object."""
try:
from django.contrib.contenttypes.models import ContentType
from apps.moderation.models import ModerationQueue
content_type = ContentType.objects.get_for_model(type(instance))
@@ -328,10 +322,10 @@ def _finalize_bulk_operation(instance, success):
def _broadcast_submission_status_change(instance, source, target, user):
"""
Broadcast submission status change for real-time UI updates.
Emits the submission_status_changed signal with a structured payload
that can be consumed by notification systems (Novu, SSE, WebSocket, etc.).
Payload format:
{
"submission_id": 123,
@@ -344,11 +338,11 @@ def _broadcast_submission_status_change(instance, source, target, user):
}
"""
try:
from .models import EditSubmission, PhotoSubmission
from .models import EditSubmission
# Determine submission type
submission_type = "edit" if isinstance(instance, EditSubmission) else "photo"
# Build the broadcast payload
payload = {
"submission_id": instance.pk,
@@ -359,13 +353,13 @@ def _broadcast_submission_status_change(instance, source, target, user):
"locked_at": None,
"changed_by": user.username if user else None,
}
# Add claim information if available
if hasattr(instance, 'claimed_by') and instance.claimed_by:
payload["locked_by"] = instance.claimed_by.username
if hasattr(instance, 'claimed_at') and instance.claimed_at:
payload["locked_at"] = instance.claimed_at.isoformat()
# Emit the signal for downstream notification handlers
submission_status_changed.send(
sender=type(instance),
@@ -376,7 +370,7 @@ def _broadcast_submission_status_change(instance, source, target, user):
locked_by=payload["locked_by"],
payload=payload,
)
logger.debug(
f"Broadcast status change: {submission_type}#{instance.pk} "
f"{source} -> {target}"
@@ -397,11 +391,11 @@ def register_moderation_signal_handlers():
try:
from apps.moderation.models import (
EditSubmission,
PhotoSubmission,
ModerationReport,
ModerationQueue,
BulkOperation,
EditSubmission,
ModerationQueue,
ModerationReport,
PhotoSubmission,
)
# EditSubmission handlers