feat: Introduce a CLAIMED state for moderation submissions, requiring claims before approval or rejection, and add a scheduled task to expire stale claims.

This commit is contained in:
pacnpal
2026-01-07 13:41:52 -05:00
parent 28c9ec56da
commit 40cba5bdb2
8 changed files with 450 additions and 94 deletions

View File

@@ -39,8 +39,8 @@ class ModerationService:
with transaction.atomic():
submission = EditSubmission.objects.select_for_update().get(id=submission_id)
if submission.status != "PENDING":
raise ValueError(f"Submission {submission_id} is not pending approval")
if submission.status != "CLAIMED":
raise ValueError(f"Submission {submission_id} must be claimed before approval (current status: {submission.status})")
try:
# Call the model's approve method which handles the business
@@ -90,8 +90,8 @@ class ModerationService:
with transaction.atomic():
submission = EditSubmission.objects.select_for_update().get(id=submission_id)
if submission.status != "PENDING":
raise ValueError(f"Submission {submission_id} is not pending review")
if submission.status != "CLAIMED":
raise ValueError(f"Submission {submission_id} must be claimed before rejection (current status: {submission.status})")
# Use FSM transition method
submission.transition_to_rejected(user=moderator)
@@ -169,8 +169,8 @@ class ModerationService:
with transaction.atomic():
submission = EditSubmission.objects.select_for_update().get(id=submission_id)
if submission.status != "PENDING":
raise ValueError(f"Submission {submission_id} is not pending review")
if submission.status not in ("PENDING", "CLAIMED"):
raise ValueError(f"Submission {submission_id} is not pending or claimed for review")
submission.moderator_changes = moderator_changes
@@ -281,8 +281,9 @@ class ModerationService:
# Check if user is moderator or above
if ModerationService._is_moderator_or_above(submitter):
# Auto-approve for moderators
# Auto-approve for moderators - must claim first then approve
try:
submission.claim(user=submitter)
created_object = submission.approve(submitter)
return {
"submission": submission,