feat: Implement initial schema and add various API, service, and management command enhancements across the application.

This commit is contained in:
pacnpal
2026-01-01 15:13:01 -05:00
parent c95f99ca10
commit b243b17af7
413 changed files with 11164 additions and 17433 deletions

View File

@@ -14,9 +14,7 @@ from django.utils import timezone
from .models import EditSubmission
def pending_submissions_for_review(
*, content_type: str | None = None, limit: int = 50
) -> QuerySet[EditSubmission]:
def pending_submissions_for_review(*, content_type: str | None = None, limit: int = 50) -> QuerySet[EditSubmission]:
"""
Get pending submissions that need moderation review.
@@ -39,9 +37,7 @@ def pending_submissions_for_review(
return queryset.order_by("created_at")[:limit]
def submissions_by_user(
*, user_id: int, status: str | None = None
) -> QuerySet[EditSubmission]:
def submissions_by_user(*, user_id: int, status: str | None = None) -> QuerySet[EditSubmission]:
"""
Get submissions created by a specific user.
@@ -52,9 +48,7 @@ def submissions_by_user(
Returns:
QuerySet of user's submissions
"""
queryset = EditSubmission.objects.filter(user_id=user_id).select_related(
"content_type", "handled_by"
)
queryset = EditSubmission.objects.filter(user_id=user_id).select_related("content_type", "handled_by")
if status:
queryset = queryset.filter(status=status)
@@ -62,9 +56,7 @@ def submissions_by_user(
return queryset.order_by("-created_at")
def submissions_handled_by_moderator(
*, moderator_id: int, days: int = 30
) -> QuerySet[EditSubmission]:
def submissions_handled_by_moderator(*, moderator_id: int, days: int = 30) -> QuerySet[EditSubmission]:
"""
Get submissions handled by a specific moderator in the last N days.
@@ -78,9 +70,7 @@ def submissions_handled_by_moderator(
cutoff_date = timezone.now() - timedelta(days=days)
return (
EditSubmission.objects.filter(
handled_by_id=moderator_id, handled_at__gte=cutoff_date
)
EditSubmission.objects.filter(handled_by_id=moderator_id, handled_at__gte=cutoff_date)
.select_related("user", "content_type")
.order_by("-handled_at")
)
@@ -105,9 +95,7 @@ def recent_submissions(*, days: int = 7) -> QuerySet[EditSubmission]:
)
def submissions_by_content_type(
*, content_type: str, status: str | None = None
) -> QuerySet[EditSubmission]:
def submissions_by_content_type(*, content_type: str, status: str | None = None) -> QuerySet[EditSubmission]:
"""
Get submissions for a specific content type.
@@ -118,9 +106,9 @@ def submissions_by_content_type(
Returns:
QuerySet of submissions for the content type
"""
queryset = EditSubmission.objects.filter(
content_type__model=content_type.lower()
).select_related("user", "handled_by")
queryset = EditSubmission.objects.filter(content_type__model=content_type.lower()).select_related(
"user", "handled_by"
)
if status:
queryset = queryset.filter(status=status)
@@ -136,12 +124,8 @@ def moderation_queue_summary() -> dict[str, Any]:
Dictionary containing queue statistics
"""
pending_count = EditSubmission.objects.filter(status="PENDING").count()
approved_today = EditSubmission.objects.filter(
status="APPROVED", handled_at__date=timezone.now().date()
).count()
rejected_today = EditSubmission.objects.filter(
status="REJECTED", handled_at__date=timezone.now().date()
).count()
approved_today = EditSubmission.objects.filter(status="APPROVED", handled_at__date=timezone.now().date()).count()
rejected_today = EditSubmission.objects.filter(status="REJECTED", handled_at__date=timezone.now().date()).count()
# Submissions by content type
submissions_by_type = (
@@ -159,9 +143,7 @@ def moderation_queue_summary() -> dict[str, Any]:
}
def moderation_statistics_summary(
*, days: int = 30, moderator: User | None = None
) -> dict[str, Any]:
def moderation_statistics_summary(*, days: int = 30, moderator: User | None = None) -> dict[str, Any]:
"""
Get comprehensive moderation statistics for a time period.
@@ -189,8 +171,7 @@ def moderation_statistics_summary(
handled_queryset.exclude(handled_at__isnull=True)
.annotate(
response_hours=ExpressionWrapper(
Extract(F('handled_at') - F('created_at'), 'epoch') / 3600.0,
output_field=FloatField()
Extract(F("handled_at") - F("created_at"), "epoch") / 3600.0, output_field=FloatField()
)
)
.values_list("response_hours", flat=True)