""" Park submission service for ThrillWiki. Handles Park entity creation and updates through the Sacred Pipeline. """ import logging from decimal import Decimal from django.core.exceptions import ValidationError from apps.entities.models import Park from apps.entities.services import BaseEntitySubmissionService logger = logging.getLogger(__name__) class ParkSubmissionService(BaseEntitySubmissionService): """ Service for creating Park submissions through the Sacred Pipeline. Parks require special handling for: - Geographic coordinates (latitude/longitude) - Location point (PostGIS in production) - Park type and status fields Required fields: - name: Park name - park_type: Type of park (theme_park, amusement_park, etc.) Example: from apps.entities.services.park_submission import ParkSubmissionService submission, park = ParkSubmissionService.create_entity_submission( user=request.user, data={ 'name': 'Cedar Point', 'park_type': 'theme_park', 'status': 'operating', 'latitude': Decimal('41.4792'), 'longitude': Decimal('-82.6839'), 'description': 'Legendary amusement park...', }, source='api', ip_address=request.META.get('REMOTE_ADDR') ) """ entity_model = Park entity_type_name = 'Park' required_fields = ['name', 'park_type'] @classmethod def create_entity_submission(cls, user, data, **kwargs): """ Create a Park submission with special coordinate handling. Coordinates (latitude/longitude) are processed using the Park model's set_location() method which handles both SQLite and PostGIS modes. Args: user: User creating the park data: Park field data (must include name and park_type) **kwargs: Additional metadata (source, ip_address, user_agent) Returns: tuple: (ContentSubmission, Park or None) """ # Extract coordinates for special handling latitude = data.get('latitude') longitude = data.get('longitude') # Create submission through base class submission, park = super().create_entity_submission(user, data, **kwargs) # If park was created (moderator bypass), set location using helper method if park and latitude is not None and longitude is not None: try: park.set_location(float(longitude), float(latitude)) park.save() logger.info( f"Park {park.id} location set: " f"({latitude}, {longitude})" ) except Exception as e: logger.warning( f"Failed to set location for Park {park.id}: {str(e)}" ) return submission, park