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

@@ -14,6 +14,7 @@ from .location import ParkLocation
from .reviews import ParkReview
from .companies import Company, CompanyHeadquarters
from .media import ParkPhoto
# Alias Company as Operator for clarity
Operator = Company

View File

@@ -8,7 +8,6 @@ from .parks import Park
@pghistory.track()
class ParkArea(TrackedModel):
# Import managers
from ..managers import ParkAreaManager

View File

@@ -7,7 +7,6 @@ import pghistory
@pghistory.track()
class Company(TrackedModel):
# Import managers
from ..managers import CompanyManager
@@ -107,13 +106,7 @@ class CompanyHeadquarters(models.Model):
components.append(self.postal_code)
if self.country and self.country != "USA":
components.append(self.country)
return (
", ".join(components)
if components
else f"{
self.city}, {
self.country}"
)
return ", ".join(components) if components else f"{self.city}, {self.country}"
@property
def location_display(self):

View File

@@ -7,7 +7,6 @@ This module contains media models specific to parks 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,16 +14,14 @@ import pghistory
def park_photo_upload_path(instance: models.Model, filename: str) -> str:
"""Generate upload path for park photos."""
photo = cast('ParkPhoto', instance)
photo = cast("ParkPhoto", instance)
park = photo.park
if park is None:
raise ValueError("Park cannot be None")
return MediaService.generate_upload_path(
domain="park",
identifier=park.slug,
filename=filename
domain="park", identifier=park.slug, filename=filename
)
@@ -33,9 +30,7 @@ class ParkPhoto(TrackedModel):
"""Photo model specific to parks."""
park = models.ForeignKey(
'parks.Park',
on_delete=models.CASCADE,
related_name='photos'
"parks.Park", on_delete=models.CASCADE, related_name="photos"
)
image = models.ImageField(
@@ -72,9 +67,9 @@ class ParkPhoto(TrackedModel):
constraints = [
# Only one primary photo per park
models.UniqueConstraint(
fields=['park'],
fields=["park"],
condition=models.Q(is_primary=True),
name='unique_primary_park_photo'
name="unique_primary_park_photo",
)
]

View File

@@ -13,7 +13,6 @@ if TYPE_CHECKING:
@pghistory.track()
class Park(TrackedModel):
# Import managers
from ..managers import ParkManager
@@ -226,7 +225,8 @@ class Park(TrackedModel):
if historical:
print(
f"Found historical slug record for object_id: {
historical.object_id}"
historical.object_id
}"
)
try:
park = cls.objects.get(pk=historical.object_id)
@@ -250,7 +250,8 @@ class Park(TrackedModel):
if historical_event:
print(
f"Found pghistory event for pgh_obj_id: {
historical_event.pgh_obj_id}"
historical_event.pgh_obj_id
}"
)
try:
park = cls.objects.get(pk=historical_event.pgh_obj_id)

View File

@@ -7,7 +7,6 @@ import pghistory
@pghistory.track()
class ParkReview(TrackedModel):
# Import managers
from ..managers import ParkReviewManager