Files
thrilltrack-explorer/django-backend/apps/entities/services/ride_model_submission.py

88 lines
3.2 KiB
Python

"""
RideModel submission service for ThrillWiki.
Handles RideModel entity creation and updates through the Sacred Pipeline.
"""
import logging
from django.core.exceptions import ValidationError
from apps.entities.models import RideModel, Company
from apps.entities.services import BaseEntitySubmissionService
logger = logging.getLogger(__name__)
class RideModelSubmissionService(BaseEntitySubmissionService):
"""
Service for creating RideModel submissions through the Sacred Pipeline.
RideModels represent specific ride models from manufacturers.
For example: "B&M Inverted Coaster", "Vekoma Boomerang"
Required fields:
- name: Model name (e.g., "Inverted Coaster")
- manufacturer: Company instance or company ID (UUID)
- model_type: Type of model (coaster_model, flat_ride_model, etc.)
Example:
from apps.entities.services.ride_model_submission import RideModelSubmissionService
manufacturer = Company.objects.get(name='Bolliger & Mabillard')
submission, model = RideModelSubmissionService.create_entity_submission(
user=request.user,
data={
'name': 'Inverted Coaster',
'manufacturer': manufacturer,
'model_type': 'coaster_model',
'description': 'Suspended coaster with inversions...',
'typical_height': Decimal('120'),
'typical_speed': Decimal('55'),
},
source='api'
)
"""
entity_model = RideModel
entity_type_name = 'RideModel'
required_fields = ['name', 'manufacturer', 'model_type']
@classmethod
def create_entity_submission(cls, user, data, **kwargs):
"""
Create a RideModel submission with foreign key handling.
The 'manufacturer' field can be provided as either:
- A Company instance
- A UUID string (will be converted to Company instance)
Args:
user: User creating the ride model
data: RideModel field data (must include name, manufacturer, and model_type)
**kwargs: Additional metadata (source, ip_address, user_agent)
Returns:
tuple: (ContentSubmission, RideModel or None)
Raises:
ValidationError: If manufacturer not found or invalid
"""
# Validate and normalize manufacturer FK
manufacturer = data.get('manufacturer')
if manufacturer:
if isinstance(manufacturer, str):
# UUID string - convert to Company instance
try:
manufacturer = Company.objects.get(id=manufacturer)
data['manufacturer'] = manufacturer
except Company.DoesNotExist:
raise ValidationError(f"Manufacturer not found: {manufacturer}")
elif not isinstance(manufacturer, Company):
raise ValidationError(f"Invalid manufacturer type: {type(manufacturer)}")
# Create submission through base class
submission, ride_model = super().create_entity_submission(user, data, **kwargs)
return submission, ride_model