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,15 +7,17 @@ from typing import Optional, Any, TYPE_CHECKING, List
import pghistory
from apps.core.history import TrackedModel
from apps.core.choices import RichChoiceField
from apps.core.state_machine import RichFSMField, StateMachineMixin
if TYPE_CHECKING:
from apps.rides.models import Ride
from . import ParkArea
from django.contrib.auth.models import AbstractBaseUser
@pghistory.track()
class Park(TrackedModel):
class Park(StateMachineMixin, TrackedModel):
# Import managers
from ..managers import ParkManager
@@ -25,7 +27,9 @@ class Park(TrackedModel):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, unique=True)
description = models.TextField(blank=True)
status = RichChoiceField(
state_field_name = "status"
status = RichFSMField(
choice_group="statuses",
domain="parks",
max_length=20,
@@ -175,6 +179,41 @@ class Park(TrackedModel):
def __str__(self) -> str:
return self.name
# FSM Transition Wrapper Methods
def reopen(self, *, user: Optional["AbstractBaseUser"] = None) -> None:
"""Transition park to OPERATING status."""
self.transition_to_operating(user=user)
self.save()
def close_temporarily(self, *, user: Optional["AbstractBaseUser"] = None) -> None:
"""Transition park to CLOSED_TEMP status."""
self.transition_to_closed_temp(user=user)
self.save()
def start_construction(self, *, user: Optional["AbstractBaseUser"] = None) -> None:
"""Transition park to UNDER_CONSTRUCTION status."""
self.transition_to_under_construction(user=user)
self.save()
def close_permanently(
self, *, closing_date=None, user: Optional["AbstractBaseUser"] = None
) -> None:
"""Transition park to CLOSED_PERM status."""
self.transition_to_closed_perm(user=user)
if closing_date:
self.closing_date = closing_date
self.save()
def demolish(self, *, user: Optional["AbstractBaseUser"] = None) -> None:
"""Transition park to DEMOLISHED status."""
self.transition_to_demolished(user=user)
self.save()
def relocate(self, *, user: Optional["AbstractBaseUser"] = None) -> None:
"""Transition park to RELOCATED status."""
self.transition_to_relocated(user=user)
self.save()
def save(self, *args: Any, **kwargs: Any) -> None:
from django.contrib.contenttypes.models import ContentType
from apps.core.history import HistoricalSlug
@@ -264,21 +303,6 @@ class Park(TrackedModel):
def get_absolute_url(self) -> str:
return reverse("parks:park_detail", kwargs={"slug": self.slug})
def get_status_color(self) -> str:
"""Get Tailwind color classes for park status"""
status_colors = {
"OPERATING": "bg-green-100 text-green-800",
"CLOSED_TEMP": "bg-yellow-100 text-yellow-800",
"CLOSED_PERM": "bg-red-100 text-red-800",
"UNDER_CONSTRUCTION": "bg-blue-100 text-blue-800",
"DEMOLISHED": "bg-gray-100 text-gray-800",
"RELOCATED": "bg-purple-100 text-purple-800",
}
if self.status in status_colors:
return status_colors[self.status]
else:
raise ValueError(f"Unknown park status: {self.status}")
@property
def formatted_location(self) -> str:
"""Get formatted address from ParkLocation if it exists"""