diff --git a/django_large_image/rest/data.py b/django_large_image/rest/data.py index 01d134f..4999a79 100644 --- a/django_large_image/rest/data.py +++ b/django_large_image/rest/data.py @@ -10,6 +10,7 @@ from django_large_image import tilesource, utilities from django_large_image.rest import params from django_large_image.rest.base import CACHE_TIMEOUT, LargeImageMixinBase +from django_large_image.rest.renderers import image_data_renderers, image_renderers thumbnail_summary = 'Returns thumbnail of full image.' thumbnail_parameters = params.BASE + params.THUMBNAIL + params.STYLE @@ -28,7 +29,11 @@ class DataMixin(LargeImageMixinBase): operation_summary=thumbnail_summary, manual_parameters=thumbnail_parameters, ) - @action(detail=False, url_path=r'data/thumbnail.(?Ppng|jpg|jpeg)') + @action( + detail=False, + url_path=r'data/thumbnail.(?Ppng|jpg|jpeg)', + renderer_classes=image_renderers, + ) def thumbnail(self, request: Request, pk: int = None, fmt: str = 'png') -> HttpResponse: encoding = tilesource.format_to_encoding(fmt) width = int(self.get_query_param(request, 'max_width', 256)) @@ -42,7 +47,11 @@ def thumbnail(self, request: Request, pk: int = None, fmt: str = 'png') -> HttpR operation_summary=region_summary, manual_parameters=region_parameters + params.STYLE, ) - @action(detail=False, url_path=r'data/region.(?Ppng|jpg|jpeg|tif|tiff)') + @action( + detail=False, + url_path=r'data/region.(?Ppng|jpg|jpeg|tif|tiff)', + renderer_classes=image_data_renderers, + ) def region(self, request: Request, pk: int = None, fmt: str = 'tiff') -> HttpResponse: """Return the region tile binary from world coordinates in given EPSG. @@ -125,7 +134,11 @@ class DataDetailMixin(DataMixin): operation_summary=thumbnail_summary, manual_parameters=thumbnail_parameters, ) - @action(detail=True, url_path=r'data/thumbnail.(?Ppng|jpg|jpeg)') + @action( + detail=True, + url_path=r'data/thumbnail.(?Ppng|jpg|jpeg)', + renderer_classes=image_renderers, + ) def thumbnail(self, request: Request, pk: int = None, fmt: str = 'png') -> HttpResponse: return super().thumbnail(request, pk, fmt) @@ -134,7 +147,11 @@ def thumbnail(self, request: Request, pk: int = None, fmt: str = 'png') -> HttpR operation_summary=region_summary, manual_parameters=region_parameters + params.STYLE, ) - @action(detail=True, url_path=r'data/region.(?Ppng|jpg|jpeg|tif|tiff)') + @action( + detail=True, + url_path=r'data/region.(?Ppng|jpg|jpeg|tif|tiff)', + renderer_classes=image_data_renderers, + ) def region(self, request: Request, pk: int = None, fmt: str = 'tiff') -> HttpResponse: return super().region(request, pk, fmt) diff --git a/django_large_image/rest/renderers.py b/django_large_image/rest/renderers.py new file mode 100644 index 0000000..14c6194 --- /dev/null +++ b/django_large_image/rest/renderers.py @@ -0,0 +1,40 @@ +from rest_framework.renderers import BaseRenderer as RFBaseRenderer + + +class BaseRenderer(RFBaseRenderer): + render_style = 'binary' + charset = None + + def render(self, data, media_type=None, renderer_context=None): + return data + + +class PNGRenderer(BaseRenderer): + media_type = 'image/png' + format = 'png' + + +class JPEGRenderer(BaseRenderer): + media_type = 'image/jpeg' + format = 'jpeg' + + +class JPGRenderer(BaseRenderer): + media_type = 'image/jpeg' + format = 'jpg' + + +image_renderers = [PNGRenderer, JPEGRenderer, JPGRenderer] + + +class TifRenderer(BaseRenderer): + media_type = 'image/tiff' + format = 'tif' + + +class TiffRenderer(BaseRenderer): + media_type = 'image/tiff' + format = 'tiff' + + +image_data_renderers = image_renderers + [TifRenderer, TiffRenderer] diff --git a/django_large_image/rest/tiles.py b/django_large_image/rest/tiles.py index be39381..48cdd08 100644 --- a/django_large_image/rest/tiles.py +++ b/django_large_image/rest/tiles.py @@ -11,6 +11,7 @@ from django_large_image import tilesource from django_large_image.rest import params from django_large_image.rest.base import CACHE_TIMEOUT, LargeImageMixinBase +from django_large_image.rest.renderers import image_renderers from django_large_image.rest.serializers import TileMetadataSerializer tile_metadata_summary = 'Returns tile metadata.' @@ -40,7 +41,11 @@ def tiles_metadata(self, request: Request, pk: int = None) -> Response: operation_summary=tile_summary, manual_parameters=tile_parameters, ) - @action(detail=False, url_path=r'tiles/(?P\d+)/(?P\d+)/(?P\d+).(?Ppng|jpg|jpeg)') + @action( + detail=False, + url_path=r'tiles/(?P\d+)/(?P\d+)/(?P\d+).(?Ppng|jpg|jpeg)', + renderer_classes=image_renderers, + ) def tile( self, request: Request, x: int, y: int, z: int, pk: int = None, fmt: str = 'png' ) -> HttpResponse: @@ -91,7 +96,11 @@ def tiles_metadata(self, request: Request, pk: int = None) -> Response: operation_summary=tile_summary, manual_parameters=tile_parameters, ) - @action(detail=True, url_path=r'tiles/(?P\d+)/(?P\d+)/(?P\d+).(?Ppng|jpg|jpeg)') + @action( + detail=True, + url_path=r'tiles/(?P\d+)/(?P\d+)/(?P\d+).(?Ppng|jpg|jpeg)', + renderer_classes=image_renderers, + ) def tile( self, request: Request, x: int, y: int, z: int, pk: int = None, fmt: str = 'png' ) -> HttpResponse: