From 1c6e219662fe14563df7bb4f7ff41bf0efb2d0d3 Mon Sep 17 00:00:00 2001 From: pacnpal <183241239+pacnpal@users.noreply.github.com> Date: Mon, 5 Jan 2026 07:37:05 -0500 Subject: [PATCH] feat: Migrate image URL access from `.url` to `.public_url` across all relevant services and serializers. --- backend/apps/api/v1/parks/serializers.py | 14 ++--- backend/apps/api/v1/rides/serializers.py | 14 ++--- .../apps/api/v1/serializers/ride_models.py | 2 +- backend/apps/api/v1/serializers/rides.py | 60 +++++++++---------- .../apps/core/services/trending_service.py | 8 +-- backend/apps/core/utils/meta.py | 2 +- 6 files changed, 50 insertions(+), 50 deletions(-) diff --git a/backend/apps/api/v1/parks/serializers.py b/backend/apps/api/v1/parks/serializers.py index 7d31fe21..99641f5a 100644 --- a/backend/apps/api/v1/parks/serializers.py +++ b/backend/apps/api/v1/parks/serializers.py @@ -79,7 +79,7 @@ class ParkPhotoOutputSerializer(serializers.ModelSerializer): def get_image_url(self, obj): """Get the full Cloudflare Images URL.""" if obj.image: - return obj.image.url + return obj.image.public_url return None @extend_schema_field( @@ -95,10 +95,10 @@ class ParkPhotoOutputSerializer(serializers.ModelSerializer): # Common variants for park photos variants = { - "thumbnail": f"{obj.image.url}/thumbnail", - "medium": f"{obj.image.url}/medium", - "large": f"{obj.image.url}/large", - "public": f"{obj.image.url}/public", + "thumbnail": f"{obj.image.public_url}/thumbnail", + "medium": f"{obj.image.public_url}/medium", + "large": f"{obj.image.public_url}/large", + "public": f"{obj.image.public_url}/public", } return variants @@ -303,14 +303,14 @@ class HybridParkSerializer(serializers.ModelSerializer): def get_banner_image_url(self, obj): """Get banner image URL.""" if obj.banner_image and obj.banner_image.image: - return obj.banner_image.image.url + return obj.banner_image.image.public_url return None @extend_schema_field(serializers.URLField(allow_null=True)) def get_card_image_url(self, obj): """Get card image URL.""" if obj.card_image and obj.card_image.image: - return obj.card_image.image.url + return obj.card_image.image.public_url return None @extend_schema_field(serializers.BooleanField()) diff --git a/backend/apps/api/v1/rides/serializers.py b/backend/apps/api/v1/rides/serializers.py index f14f2736..0d640410 100644 --- a/backend/apps/api/v1/rides/serializers.py +++ b/backend/apps/api/v1/rides/serializers.py @@ -81,7 +81,7 @@ class RidePhotoOutputSerializer(serializers.ModelSerializer): def get_image_url(self, obj): """Get the full Cloudflare Images URL.""" if obj.image: - return obj.image.url + return obj.image.public_url return None @extend_schema_field( @@ -97,10 +97,10 @@ class RidePhotoOutputSerializer(serializers.ModelSerializer): # Common variants for ride photos variants = { - "thumbnail": f"{obj.image.url}/thumbnail", - "medium": f"{obj.image.url}/medium", - "large": f"{obj.image.url}/large", - "public": f"{obj.image.url}/public", + "thumbnail": f"{obj.image.public_url}/thumbnail", + "medium": f"{obj.image.public_url}/medium", + "large": f"{obj.image.public_url}/large", + "public": f"{obj.image.public_url}/public", } return variants @@ -481,14 +481,14 @@ class HybridRideSerializer(serializers.ModelSerializer): def get_banner_image_url(self, obj): """Get banner image URL.""" if obj.banner_image and obj.banner_image.image: - return obj.banner_image.image.url + return obj.banner_image.image.public_url return None @extend_schema_field(serializers.URLField(allow_null=True)) def get_card_image_url(self, obj): """Get card image URL.""" if obj.card_image and obj.card_image.image: - return obj.card_image.image.url + return obj.card_image.image.public_url return None # Computed property diff --git a/backend/apps/api/v1/serializers/ride_models.py b/backend/apps/api/v1/serializers/ride_models.py index 3c1c267e..d9b40ff7 100644 --- a/backend/apps/api/v1/serializers/ride_models.py +++ b/backend/apps/api/v1/serializers/ride_models.py @@ -59,7 +59,7 @@ class RideModelPhotoOutputSerializer(serializers.Serializer): def get_image_url(self, obj): """Get the image URL.""" if obj.image: - return obj.image.url + return obj.image.public_url return None diff --git a/backend/apps/api/v1/serializers/rides.py b/backend/apps/api/v1/serializers/rides.py index 10d63191..a3c07259 100644 --- a/backend/apps/api/v1/serializers/rides.py +++ b/backend/apps/api/v1/serializers/rides.py @@ -265,13 +265,13 @@ class RideDetailOutputSerializer(serializers.Serializer): return [ { "id": photo.id, - "image_url": photo.image.url if photo.image else None, + "image_url": photo.image.public_url if photo.image else None, "image_variants": ( { - "thumbnail": (f"{photo.image.url}/thumbnail" if photo.image else None), - "medium": f"{photo.image.url}/medium" if photo.image else None, - "large": f"{photo.image.url}/large" if photo.image else None, - "public": f"{photo.image.url}/public" if photo.image else None, + "thumbnail": (f"{photo.image.public_url}/thumbnail" if photo.image else None), + "medium": f"{photo.image.public_url}/medium" if photo.image else None, + "large": f"{photo.image.public_url}/large" if photo.image else None, + "public": f"{photo.image.public_url}/public" if photo.image else None, } if photo.image else {} @@ -295,12 +295,12 @@ class RideDetailOutputSerializer(serializers.Serializer): if photo and photo.image: return { "id": photo.id, - "image_url": photo.image.url, + "image_url": photo.image.public_url, "image_variants": { - "thumbnail": f"{photo.image.url}/thumbnail", - "medium": f"{photo.image.url}/medium", - "large": f"{photo.image.url}/large", - "public": f"{photo.image.url}/public", + "thumbnail": f"{photo.image.public_url}/thumbnail", + "medium": f"{photo.image.public_url}/medium", + "large": f"{photo.image.public_url}/large", + "public": f"{photo.image.public_url}/public", }, "caption": photo.caption, "alt_text": photo.alt_text, @@ -318,12 +318,12 @@ class RideDetailOutputSerializer(serializers.Serializer): if obj.banner_image and obj.banner_image.image: return { "id": obj.banner_image.id, - "image_url": obj.banner_image.image.url, + "image_url": obj.banner_image.image.public_url, "image_variants": { - "thumbnail": f"{obj.banner_image.image.url}/thumbnail", - "medium": f"{obj.banner_image.image.url}/medium", - "large": f"{obj.banner_image.image.url}/large", - "public": f"{obj.banner_image.image.url}/public", + "thumbnail": f"{obj.banner_image.image.public_url}/thumbnail", + "medium": f"{obj.banner_image.image.public_url}/medium", + "large": f"{obj.banner_image.image.public_url}/large", + "public": f"{obj.banner_image.image.public_url}/public", }, "caption": obj.banner_image.caption, "alt_text": obj.banner_image.alt_text, @@ -343,12 +343,12 @@ class RideDetailOutputSerializer(serializers.Serializer): if latest_photo and latest_photo.image: return { "id": latest_photo.id, - "image_url": latest_photo.image.url, + "image_url": latest_photo.image.public_url, "image_variants": { - "thumbnail": f"{latest_photo.image.url}/thumbnail", - "medium": f"{latest_photo.image.url}/medium", - "large": f"{latest_photo.image.url}/large", - "public": f"{latest_photo.image.url}/public", + "thumbnail": f"{latest_photo.image.public_url}/thumbnail", + "medium": f"{latest_photo.image.public_url}/medium", + "large": f"{latest_photo.image.public_url}/large", + "public": f"{latest_photo.image.public_url}/public", }, "caption": latest_photo.caption, "alt_text": latest_photo.alt_text, @@ -367,12 +367,12 @@ class RideDetailOutputSerializer(serializers.Serializer): if obj.card_image and obj.card_image.image: return { "id": obj.card_image.id, - "image_url": obj.card_image.image.url, + "image_url": obj.card_image.image.public_url, "image_variants": { - "thumbnail": f"{obj.card_image.image.url}/thumbnail", - "medium": f"{obj.card_image.image.url}/medium", - "large": f"{obj.card_image.image.url}/large", - "public": f"{obj.card_image.image.url}/public", + "thumbnail": f"{obj.card_image.image.public_url}/thumbnail", + "medium": f"{obj.card_image.image.public_url}/medium", + "large": f"{obj.card_image.image.public_url}/large", + "public": f"{obj.card_image.image.public_url}/public", }, "caption": obj.card_image.caption, "alt_text": obj.card_image.alt_text, @@ -392,12 +392,12 @@ class RideDetailOutputSerializer(serializers.Serializer): if latest_photo and latest_photo.image: return { "id": latest_photo.id, - "image_url": latest_photo.image.url, + "image_url": latest_photo.image.public_url, "image_variants": { - "thumbnail": f"{latest_photo.image.url}/thumbnail", - "medium": f"{latest_photo.image.url}/medium", - "large": f"{latest_photo.image.url}/large", - "public": f"{latest_photo.image.url}/public", + "thumbnail": f"{latest_photo.image.public_url}/thumbnail", + "medium": f"{latest_photo.image.public_url}/medium", + "large": f"{latest_photo.image.public_url}/large", + "public": f"{latest_photo.image.public_url}/public", }, "caption": latest_photo.caption, "alt_text": latest_photo.alt_text, diff --git a/backend/apps/core/services/trending_service.py b/backend/apps/core/services/trending_service.py index 1378c571..88b05e07 100644 --- a/backend/apps/core/services/trending_service.py +++ b/backend/apps/core/services/trending_service.py @@ -199,7 +199,7 @@ class TrendingService: # Get card image URL card_image_url = "" if park.card_image and hasattr(park.card_image, "image"): - card_image_url = park.card_image.image.url if park.card_image.image else "" + card_image_url = park.card_image.image.public_url if park.card_image.image else "" # Get primary company (operator) primary_company = park.operator.name if park.operator else "" @@ -247,7 +247,7 @@ class TrendingService: # Get card image URL card_image_url = "" if ride.card_image and hasattr(ride.card_image, "image"): - card_image_url = ride.card_image.image.url if ride.card_image.image else "" + card_image_url = ride.card_image.image.public_url if ride.card_image.image else "" trending_rides.append( { @@ -450,7 +450,7 @@ class TrendingService: # Get card image URL card_image_url = "" if park.card_image and hasattr(park.card_image, "image"): - card_image_url = park.card_image.image.url if park.card_image.image else "" + card_image_url = park.card_image.image.public_url if park.card_image.image else "" # Get primary company (operator) primary_company = park.operator.name if park.operator else "" @@ -506,7 +506,7 @@ class TrendingService: # Get card image URL card_image_url = "" if ride.card_image and hasattr(ride.card_image, "image"): - card_image_url = ride.card_image.image.url if ride.card_image.image else "" + card_image_url = ride.card_image.image.public_url if ride.card_image.image else "" results.append( { diff --git a/backend/apps/core/utils/meta.py b/backend/apps/core/utils/meta.py index e1ea48b6..90409162 100644 --- a/backend/apps/core/utils/meta.py +++ b/backend/apps/core/utils/meta.py @@ -142,7 +142,7 @@ def get_og_image( try: first_photo = instance.photos.first() if first_photo and hasattr(first_photo, "image"): - return urljoin(base_url, first_photo.image.url) + return urljoin(base_url, first_photo.image.public_url) except Exception: pass