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

@@ -3,18 +3,19 @@ Selectors for moderation-related data retrieval.
Following Django styleguide pattern for separating data access from business logic.
"""
from typing import Optional, Dict, Any
from django.db.models import QuerySet, Count, F, ExpressionWrapper, FloatField
from datetime import timedelta
from typing import Any
from django.contrib.auth.models import User
from django.db.models import Count, ExpressionWrapper, F, FloatField, QuerySet
from django.db.models.functions import Extract
from django.utils import timezone
from datetime import timedelta
from django.contrib.auth.models import User
from .models import EditSubmission
def pending_submissions_for_review(
*, content_type: Optional[str] = None, limit: int = 50
*, content_type: str | None = None, limit: int = 50
) -> QuerySet[EditSubmission]:
"""
Get pending submissions that need moderation review.
@@ -39,7 +40,7 @@ def pending_submissions_for_review(
def submissions_by_user(
*, user_id: int, status: Optional[str] = None
*, user_id: int, status: str | None = None
) -> QuerySet[EditSubmission]:
"""
Get submissions created by a specific user.
@@ -105,7 +106,7 @@ def recent_submissions(*, days: int = 7) -> QuerySet[EditSubmission]:
def submissions_by_content_type(
*, content_type: str, status: Optional[str] = None
*, content_type: str, status: str | None = None
) -> QuerySet[EditSubmission]:
"""
Get submissions for a specific content type.
@@ -127,7 +128,7 @@ def submissions_by_content_type(
return queryset.order_by("-created_at")
def moderation_queue_summary() -> Dict[str, Any]:
def moderation_queue_summary() -> dict[str, Any]:
"""
Get summary statistics for the moderation queue.
@@ -159,8 +160,8 @@ def moderation_queue_summary() -> Dict[str, Any]:
def moderation_statistics_summary(
*, days: int = 30, moderator: Optional[User] = None
) -> Dict[str, Any]:
*, days: int = 30, moderator: User | None = None
) -> dict[str, Any]:
"""
Get comprehensive moderation statistics for a time period.
@@ -175,10 +176,7 @@ def moderation_statistics_summary(
base_queryset = EditSubmission.objects.filter(created_at__gte=cutoff_date)
if moderator:
handled_queryset = base_queryset.filter(handled_by=moderator)
else:
handled_queryset = base_queryset
handled_queryset = base_queryset.filter(handled_by=moderator) if moderator else base_queryset
total_submissions = base_queryset.count()
pending_submissions = base_queryset.filter(status="PENDING").count()
@@ -258,7 +256,7 @@ def top_contributors(*, days: int = 30, limit: int = 10) -> QuerySet[User]:
)
def moderator_workload_summary(*, days: int = 30) -> Dict[str, Any]:
def moderator_workload_summary(*, days: int = 30) -> dict[str, Any]:
"""
Get workload distribution among moderators.