mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-22 12:11:21 -05:00
Refactor code structure and remove redundant changes
This commit is contained in:
113
django-backend/apps/entities/services/ride_submission.py
Normal file
113
django-backend/apps/entities/services/ride_submission.py
Normal file
@@ -0,0 +1,113 @@
|
||||
"""
|
||||
Ride submission service for ThrillWiki.
|
||||
|
||||
Handles Ride entity creation and updates through the Sacred Pipeline.
|
||||
"""
|
||||
|
||||
import logging
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from apps.entities.models import Ride, Park
|
||||
from apps.entities.services import BaseEntitySubmissionService
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RideSubmissionService(BaseEntitySubmissionService):
|
||||
"""
|
||||
Service for creating Ride submissions through the Sacred Pipeline.
|
||||
|
||||
Rides require special handling for:
|
||||
- Park foreign key relationship
|
||||
- Manufacturer foreign key relationship (optional)
|
||||
- Ride model foreign key relationship (optional)
|
||||
- is_coaster flag (auto-set based on ride_category)
|
||||
|
||||
Required fields:
|
||||
- name: Ride name
|
||||
- park: Park instance or park ID (UUID)
|
||||
- ride_category: Category of ride (roller_coaster, flat_ride, etc.)
|
||||
|
||||
Example:
|
||||
from apps.entities.services.ride_submission import RideSubmissionService
|
||||
|
||||
park = Park.objects.get(slug='cedar-point')
|
||||
|
||||
submission, ride = RideSubmissionService.create_entity_submission(
|
||||
user=request.user,
|
||||
data={
|
||||
'name': 'Steel Vengeance',
|
||||
'park': park,
|
||||
'ride_category': 'roller_coaster',
|
||||
'status': 'operating',
|
||||
'height': Decimal('205'),
|
||||
'speed': Decimal('74'),
|
||||
'description': 'Hybrid steel-wooden coaster...',
|
||||
},
|
||||
source='api'
|
||||
)
|
||||
"""
|
||||
|
||||
entity_model = Ride
|
||||
entity_type_name = 'Ride'
|
||||
required_fields = ['name', 'park', 'ride_category']
|
||||
|
||||
@classmethod
|
||||
def create_entity_submission(cls, user, data, **kwargs):
|
||||
"""
|
||||
Create a Ride submission with foreign key handling.
|
||||
|
||||
The 'park' field can be provided as either:
|
||||
- A Park instance
|
||||
- A UUID string (will be converted to Park instance)
|
||||
|
||||
The 'is_coaster' flag is automatically set based on ride_category.
|
||||
|
||||
Args:
|
||||
user: User creating the ride
|
||||
data: Ride field data (must include name, park, and ride_category)
|
||||
**kwargs: Additional metadata (source, ip_address, user_agent)
|
||||
|
||||
Returns:
|
||||
tuple: (ContentSubmission, Ride or None)
|
||||
|
||||
Raises:
|
||||
ValidationError: If park not found or invalid
|
||||
"""
|
||||
# Validate and normalize park FK
|
||||
park = data.get('park')
|
||||
if park:
|
||||
if isinstance(park, str):
|
||||
# UUID string - convert to Park instance
|
||||
try:
|
||||
park = Park.objects.get(id=park)
|
||||
data['park'] = park
|
||||
except Park.DoesNotExist:
|
||||
raise ValidationError(f"Park not found: {park}")
|
||||
elif not isinstance(park, Park):
|
||||
raise ValidationError(f"Invalid park type: {type(park)}")
|
||||
|
||||
# Validate and normalize manufacturer FK if provided
|
||||
manufacturer = data.get('manufacturer')
|
||||
if manufacturer and isinstance(manufacturer, str):
|
||||
try:
|
||||
from apps.entities.models import Company
|
||||
manufacturer = Company.objects.get(id=manufacturer)
|
||||
data['manufacturer'] = manufacturer
|
||||
except Company.DoesNotExist:
|
||||
raise ValidationError(f"Manufacturer not found: {manufacturer}")
|
||||
|
||||
# Validate and normalize model FK if provided
|
||||
model = data.get('model')
|
||||
if model and isinstance(model, str):
|
||||
try:
|
||||
from apps.entities.models import RideModel
|
||||
model = RideModel.objects.get(id=model)
|
||||
data['model'] = model
|
||||
except RideModel.DoesNotExist:
|
||||
raise ValidationError(f"Ride model not found: {model}")
|
||||
|
||||
# Create submission through base class
|
||||
submission, ride = super().create_entity_submission(user, data, **kwargs)
|
||||
|
||||
return submission, ride
|
||||
Reference in New Issue
Block a user