mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-22 15:31:08 -05:00
chore: fix pghistory migration deps and improve htmx utilities
- Update pghistory dependency from 0007 to 0006 in account migrations - Add docstrings and remove unused imports in htmx_forms.py - Add DJANGO_SETTINGS_MODULE bash commands to Claude settings - Add state transition definitions for ride statuses
This commit is contained in:
@@ -7,6 +7,7 @@ from typing import Optional, Dict, Any, Union
|
||||
from django.db import transaction
|
||||
from django.utils import timezone
|
||||
from django.db.models import QuerySet
|
||||
from django_fsm import TransitionNotAllowed
|
||||
|
||||
from apps.accounts.models import User
|
||||
from .models import EditSubmission, PhotoSubmission, ModerationQueue
|
||||
@@ -59,12 +60,16 @@ class ModerationService:
|
||||
return obj
|
||||
|
||||
except Exception as e:
|
||||
# Mark as rejected on any error
|
||||
submission.status = "REJECTED"
|
||||
submission.handled_by = moderator
|
||||
submission.handled_at = timezone.now()
|
||||
submission.notes = f"Approval failed: {str(e)}"
|
||||
submission.save()
|
||||
# Mark as rejected on any error using FSM transition
|
||||
try:
|
||||
submission.transition_to_rejected(user=moderator)
|
||||
submission.handled_by = moderator
|
||||
submission.handled_at = timezone.now()
|
||||
submission.notes = f"Approval failed: {str(e)}"
|
||||
submission.save()
|
||||
except Exception:
|
||||
# Fallback if FSM transition fails
|
||||
pass
|
||||
raise
|
||||
|
||||
@staticmethod
|
||||
@@ -94,7 +99,8 @@ class ModerationService:
|
||||
if submission.status != "PENDING":
|
||||
raise ValueError(f"Submission {submission_id} is not pending review")
|
||||
|
||||
submission.status = "REJECTED"
|
||||
# Use FSM transition method
|
||||
submission.transition_to_rejected(user=moderator)
|
||||
submission.handled_by = moderator
|
||||
submission.handled_at = timezone.now()
|
||||
submission.notes = f"Rejected: {reason}"
|
||||
@@ -524,6 +530,32 @@ class ModerationService:
|
||||
if queue_item.status != 'PENDING':
|
||||
raise ValueError(f"Queue item {queue_item_id} is not pending")
|
||||
|
||||
# Transition queue item into an active state before processing
|
||||
moved_to_in_progress = False
|
||||
try:
|
||||
queue_item.transition_to_in_progress(user=moderator)
|
||||
moved_to_in_progress = True
|
||||
except TransitionNotAllowed:
|
||||
# If FSM disallows, leave as-is and continue (fallback handled below)
|
||||
pass
|
||||
except AttributeError:
|
||||
# Fallback for environments without the generated transition method
|
||||
queue_item.status = 'IN_PROGRESS'
|
||||
moved_to_in_progress = True
|
||||
|
||||
if moved_to_in_progress:
|
||||
queue_item.full_clean()
|
||||
queue_item.save()
|
||||
|
||||
def _complete_queue_item() -> None:
|
||||
"""Transition queue item to completed with FSM-aware fallback."""
|
||||
try:
|
||||
queue_item.transition_to_completed(user=moderator)
|
||||
except TransitionNotAllowed:
|
||||
queue_item.status = 'COMPLETED'
|
||||
except AttributeError:
|
||||
queue_item.status = 'COMPLETED'
|
||||
|
||||
# Find related submission
|
||||
if 'edit_submission' in queue_item.tags:
|
||||
# Find EditSubmission
|
||||
@@ -543,14 +575,16 @@ class ModerationService:
|
||||
if action == 'approve':
|
||||
try:
|
||||
created_object = submission.approve(moderator)
|
||||
queue_item.status = 'COMPLETED'
|
||||
# Use FSM transition for queue status
|
||||
_complete_queue_item()
|
||||
result = {
|
||||
'status': 'approved',
|
||||
'created_object': created_object,
|
||||
'message': 'Submission approved successfully'
|
||||
}
|
||||
except Exception as e:
|
||||
queue_item.status = 'COMPLETED'
|
||||
# Use FSM transition for queue status
|
||||
_complete_queue_item()
|
||||
result = {
|
||||
'status': 'failed',
|
||||
'created_object': None,
|
||||
@@ -558,7 +592,8 @@ class ModerationService:
|
||||
}
|
||||
elif action == 'reject':
|
||||
submission.reject(moderator, notes or "Rejected by moderator")
|
||||
queue_item.status = 'COMPLETED'
|
||||
# Use FSM transition for queue status
|
||||
_complete_queue_item()
|
||||
result = {
|
||||
'status': 'rejected',
|
||||
'created_object': None,
|
||||
@@ -567,7 +602,7 @@ class ModerationService:
|
||||
elif action == 'escalate':
|
||||
submission.escalate(moderator, notes or "Escalated for review")
|
||||
queue_item.priority = 'HIGH'
|
||||
queue_item.status = 'PENDING' # Keep in queue but escalated
|
||||
# Keep status as PENDING for escalation
|
||||
result = {
|
||||
'status': 'escalated',
|
||||
'created_object': None,
|
||||
@@ -594,14 +629,16 @@ class ModerationService:
|
||||
if action == 'approve':
|
||||
try:
|
||||
submission.approve(moderator, notes or "")
|
||||
queue_item.status = 'COMPLETED'
|
||||
# Use FSM transition for queue status
|
||||
_complete_queue_item()
|
||||
result = {
|
||||
'status': 'approved',
|
||||
'created_object': None,
|
||||
'message': 'Photo submission approved successfully'
|
||||
}
|
||||
except Exception as e:
|
||||
queue_item.status = 'COMPLETED'
|
||||
# Use FSM transition for queue status
|
||||
_complete_queue_item()
|
||||
result = {
|
||||
'status': 'failed',
|
||||
'created_object': None,
|
||||
@@ -609,7 +646,8 @@ class ModerationService:
|
||||
}
|
||||
elif action == 'reject':
|
||||
submission.reject(moderator, notes or "Rejected by moderator")
|
||||
queue_item.status = 'COMPLETED'
|
||||
# Use FSM transition for queue status
|
||||
_complete_queue_item()
|
||||
result = {
|
||||
'status': 'rejected',
|
||||
'created_object': None,
|
||||
@@ -618,7 +656,7 @@ class ModerationService:
|
||||
elif action == 'escalate':
|
||||
submission.escalate(moderator, notes or "Escalated for review")
|
||||
queue_item.priority = 'HIGH'
|
||||
queue_item.status = 'PENDING' # Keep in queue but escalated
|
||||
# Keep status as PENDING for escalation
|
||||
result = {
|
||||
'status': 'escalated',
|
||||
'created_object': None,
|
||||
|
||||
Reference in New Issue
Block a user