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:
pacnpal
2025-12-21 17:33:24 -05:00
parent b9063ff4f8
commit 7ba0004c93
74 changed files with 11134 additions and 198 deletions

View File

@@ -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,