Add migrations for ParkPhoto and RidePhoto models with associated events

- Created ParkPhoto and ParkPhotoEvent models in the parks app, including fields for image, caption, alt text, and relationships to the Park model.
- Implemented triggers for insert and update operations on ParkPhoto to log changes in ParkPhotoEvent.
- Created RidePhoto and RidePhotoEvent models in the rides app, with similar structure and functionality as ParkPhoto.
- Added fields for photo type in RidePhoto and implemented corresponding triggers for logging changes.
- Established necessary indexes and unique constraints for both models to ensure data integrity and optimize queries.
This commit is contained in:
pacnpal
2025-08-26 14:40:46 -04:00
parent 831be6a2ee
commit e4e36c7899
133 changed files with 1321 additions and 1001 deletions

View File

@@ -7,7 +7,6 @@ This module contains media models specific to rides domain.
from typing import Any, Optional, cast
from django.db import models
from django.conf import settings
from django.utils import timezone
from apps.core.history import TrackedModel
from apps.core.services.media_service import MediaService
import pghistory
@@ -15,7 +14,7 @@ import pghistory
def ride_photo_upload_path(instance: models.Model, filename: str) -> str:
"""Generate upload path for ride photos."""
photo = cast('RidePhoto', instance)
photo = cast("RidePhoto", instance)
ride = photo.ride
if ride is None:
@@ -25,7 +24,7 @@ def ride_photo_upload_path(instance: models.Model, filename: str) -> str:
domain="park",
identifier=ride.slug,
filename=filename,
subdirectory=ride.park.slug
subdirectory=ride.park.slug,
)
@@ -34,9 +33,7 @@ class RidePhoto(TrackedModel):
"""Photo model specific to rides."""
ride = models.ForeignKey(
'rides.Ride',
on_delete=models.CASCADE,
related_name='photos'
"rides.Ride", on_delete=models.CASCADE, related_name="photos"
)
image = models.ImageField(
@@ -53,14 +50,14 @@ class RidePhoto(TrackedModel):
photo_type = models.CharField(
max_length=50,
choices=[
('exterior', 'Exterior View'),
('queue', 'Queue Area'),
('station', 'Station'),
('onride', 'On-Ride'),
('construction', 'Construction'),
('other', 'Other'),
("exterior", "Exterior View"),
("queue", "Queue Area"),
("station", "Station"),
("onride", "On-Ride"),
("construction", "Construction"),
("other", "Other"),
],
default='exterior'
default="exterior",
)
# Metadata
@@ -88,9 +85,9 @@ class RidePhoto(TrackedModel):
constraints = [
# Only one primary photo per ride
models.UniqueConstraint(
fields=['ride'],
fields=["ride"],
condition=models.Q(is_primary=True),
name='unique_primary_ride_photo'
name="unique_primary_ride_photo",
)
]