Add comprehensive API documentation for ThrillWiki integration and features

- Introduced Next.js integration guide for ThrillWiki API, detailing authentication, core domain APIs, data structures, and implementation patterns.
- Documented the migration to Rich Choice Objects, highlighting changes for frontend developers and enhanced metadata availability.
- Fixed the missing `get_by_slug` method in the Ride model, ensuring proper functionality of ride detail endpoints.
- Created a test script to verify manufacturer syncing with ride models, ensuring data integrity across related models.
This commit is contained in:
pacnpal
2025-09-16 11:29:17 -04:00
parent 61d73a2147
commit c2c26cfd1d
98 changed files with 11476 additions and 4803 deletions

View File

@@ -15,6 +15,9 @@ from .reviews import ParkReview
from .companies import Company, CompanyHeadquarters
from .media import ParkPhoto
# Import choices to trigger registration
from ..choices import *
# Alias Company as Operator for clarity
Operator = Company

View File

@@ -2,6 +2,7 @@ from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.utils.text import slugify
from apps.core.models import TrackedModel
from apps.core.choices.fields import RichChoiceField
import pghistory
@@ -12,14 +13,10 @@ class Company(TrackedModel):
objects = CompanyManager()
class CompanyRole(models.TextChoices):
OPERATOR = "OPERATOR", "Park Operator"
PROPERTY_OWNER = "PROPERTY_OWNER", "Property Owner"
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, unique=True)
roles = ArrayField(
models.CharField(max_length=20, choices=CompanyRole.choices),
RichChoiceField(choice_group="company_roles", domain="parks", max_length=20),
default=list,
blank=True,
)

View File

@@ -6,6 +6,7 @@ from config.django import base as settings
from typing import Optional, Any, TYPE_CHECKING, List
import pghistory
from apps.core.history import TrackedModel
from apps.core.choices import RichChoiceField
if TYPE_CHECKING:
@@ -20,39 +21,21 @@ class Park(TrackedModel):
objects = ParkManager()
id: int # Type hint for Django's automatic id field
STATUS_CHOICES = [
("OPERATING", "Operating"),
("CLOSED_TEMP", "Temporarily Closed"),
("CLOSED_PERM", "Permanently Closed"),
("UNDER_CONSTRUCTION", "Under Construction"),
("DEMOLISHED", "Demolished"),
("RELOCATED", "Relocated"),
]
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, unique=True)
description = models.TextField(blank=True)
status = models.CharField(
max_length=20, choices=STATUS_CHOICES, default="OPERATING"
status = RichChoiceField(
choice_group="statuses",
domain="parks",
max_length=20,
default="OPERATING",
)
PARK_TYPE_CHOICES = [
("THEME_PARK", "Theme Park"),
("AMUSEMENT_PARK", "Amusement Park"),
("WATER_PARK", "Water Park"),
("FAMILY_ENTERTAINMENT_CENTER", "Family Entertainment Center"),
("CARNIVAL", "Carnival"),
("FAIR", "Fair"),
("PIER", "Pier"),
("BOARDWALK", "Boardwalk"),
("SAFARI_PARK", "Safari Park"),
("ZOO", "Zoo"),
("OTHER", "Other"),
]
park_type = models.CharField(
park_type = RichChoiceField(
choice_group="types",
domain="parks",
max_length=30,
choices=PARK_TYPE_CHOICES,
default="THEME_PARK",
db_index=True,
help_text="Type/category of the park"
@@ -291,7 +274,10 @@ class Park(TrackedModel):
"DEMOLISHED": "bg-gray-100 text-gray-800",
"RELOCATED": "bg-purple-100 text-purple-800",
}
return status_colors.get(self.status, "bg-gray-100 text-gray-500")
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: