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,14 +3,16 @@ Services for moderation functionality.
Following Django styleguide pattern for business logic encapsulation.
"""
from typing import Optional, Dict, Any, Union
from typing import Any
from django.db import transaction
from django.utils import timezone
from django.db.models import QuerySet
from django.utils import timezone
from django_fsm import TransitionNotAllowed
from apps.accounts.models import User
from .models import EditSubmission, PhotoSubmission, ModerationQueue
from .models import EditSubmission, ModerationQueue, PhotoSubmission
class ModerationService:
@@ -18,8 +20,8 @@ class ModerationService:
@staticmethod
def approve_submission(
*, submission_id: int, moderator: User, notes: Optional[str] = None
) -> Union[object, None]:
*, submission_id: int, moderator: User, notes: str | None = None
) -> object | None:
"""
Approve a content submission and apply changes.
@@ -115,10 +117,10 @@ class ModerationService:
def create_edit_submission(
*,
content_object: object,
changes: Dict[str, Any],
changes: dict[str, Any],
submitter: User,
submission_type: str = "UPDATE",
notes: Optional[str] = None,
notes: str | None = None,
) -> EditSubmission:
"""
Create a new edit submission for moderation.
@@ -154,7 +156,7 @@ class ModerationService:
def update_submission_changes(
*,
submission_id: int,
moderator_changes: Dict[str, Any],
moderator_changes: dict[str, Any],
moderator: User,
) -> EditSubmission:
"""
@@ -199,8 +201,8 @@ class ModerationService:
def get_pending_submissions_for_moderator(
*,
moderator: User,
content_type: Optional[str] = None,
limit: Optional[int] = None,
content_type: str | None = None,
limit: int | None = None,
) -> QuerySet:
"""
Get pending submissions for a moderator to review.
@@ -219,8 +221,8 @@ class ModerationService:
@staticmethod
def get_submission_statistics(
*, days: int = 30, moderator: Optional[User] = None
) -> Dict[str, Any]:
*, days: int = 30, moderator: User | None = None
) -> dict[str, Any]:
"""
Get moderation statistics for a time period.
@@ -251,13 +253,13 @@ class ModerationService:
@staticmethod
def create_edit_submission_with_queue(
*,
content_object: Optional[object],
changes: Dict[str, Any],
content_object: object | None,
changes: dict[str, Any],
submitter: User,
submission_type: str = "EDIT",
reason: Optional[str] = None,
source: Optional[str] = None,
) -> Dict[str, Any]:
reason: str | None = None,
source: str | None = None,
) -> dict[str, Any]:
"""
Create an edit submission with automatic queue routing.
@@ -332,7 +334,7 @@ class ModerationService:
caption: str = "",
date_taken=None,
submitter: User,
) -> Dict[str, Any]:
) -> dict[str, Any]:
"""
Create a photo submission with automatic queue routing.
@@ -508,8 +510,8 @@ class ModerationService:
@staticmethod
def process_queue_item(
*, queue_item_id: int, moderator: User, action: str, notes: Optional[str] = None
) -> Dict[str, Any]:
*, queue_item_id: int, moderator: User, action: str, notes: str | None = None
) -> dict[str, Any]:
"""
Process a moderation queue item (approve, reject, etc.).
@@ -675,6 +677,6 @@ class ModerationService:
queue_item.full_clean()
queue_item.save()
result['queue_item'] = queue_item
return result