Skip to content

Commit 84d8348

Browse files
committed
Improve openapi parameters
1 parent 27de86f commit 84d8348

File tree

7 files changed

+146
-36
lines changed

7 files changed

+146
-36
lines changed

django_large_image/rest/base.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,17 @@ def get_style(self, request: Request):
4444
style['min'] = bmin
4545
if not utilities.param_nully(bmax):
4646
style['max'] = bmax
47-
palette = request.query_params.get('palette', None)
47+
palette = request.query_params.get(
48+
'palette', request.query_params.get('cmap', None)
49+
)
4850
if not utilities.param_nully(palette):
4951
style['palette'] = palette
5052
nodata = request.query_params.get('nodata', None)
5153
if not utilities.param_nully(nodata):
5254
style['nodata'] = nodata
55+
scheme = request.query_params.get('scheme', None)
56+
if not utilities.param_nully:
57+
style['scheme'] = scheme
5358
style = json.dumps(style)
5459
return style
5560

django_large_image/rest/data.py

Lines changed: 60 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@
1111
from django_large_image.rest import params
1212
from django_large_image.rest.base import CACHE_TIMEOUT, LargeImageMixinBase
1313

14+
thumbnail_summary = 'Returns thumbnail of full image.'
15+
thumbnail_parameters = [params.projection] + params.STYLE
16+
region_summary = 'Returns region tile binary.'
17+
region_parameters = [params.projection] + params.REGION
18+
pixel_summary = 'Returns single pixel.'
19+
pixel_parameters = [params.projection, params.left, params.top] + params.STYLE
20+
histogram_summary = 'Returns histogram'
21+
histogram_parameters = [params.projection] + params.HISTOGRAM
22+
1423

1524
class DataMixin(LargeImageMixinBase):
1625
def thumbnail(self, request: Request, pk: int = None, format: str = None) -> HttpResponse:
@@ -22,8 +31,8 @@ def thumbnail(self, request: Request, pk: int = None, format: str = None) -> Htt
2231
@method_decorator(cache_page(CACHE_TIMEOUT))
2332
@swagger_auto_schema(
2433
method='GET',
25-
operation_summary='Returns thumbnail of full image as PNG.',
26-
manual_parameters=[params.projection] + params.STYLE,
34+
operation_summary=thumbnail_summary,
35+
manual_parameters=thumbnail_parameters,
2736
)
2837
@action(detail=False, url_path='thumbnail.png')
2938
def thumbnail_png(self, request: Request, pk: int = None) -> HttpResponse:
@@ -32,8 +41,8 @@ def thumbnail_png(self, request: Request, pk: int = None) -> HttpResponse:
3241
@method_decorator(cache_page(CACHE_TIMEOUT))
3342
@swagger_auto_schema(
3443
method='GET',
35-
operation_summary='Returns thumbnail of full image as JPEG.',
36-
manual_parameters=[params.projection] + params.STYLE,
44+
operation_summary=thumbnail_summary,
45+
manual_parameters=thumbnail_parameters,
3746
)
3847
@action(detail=False, url_path='thumbnail.jpeg')
3948
def thumbnail_jpeg(self, request: Request, pk: int = None) -> HttpResponse:
@@ -75,35 +84,35 @@ def region(self, request: Request, pk: int = None, format: str = None) -> HttpRe
7584

7685
@swagger_auto_schema(
7786
method='GET',
78-
operation_summary='Returns region tile binary from world coordinates in given EPSG as a tiled tif image.',
79-
manual_parameters=[params.projection] + params.REGION,
87+
operation_summary=region_summary,
88+
manual_parameters=region_parameters,
8089
)
8190
@action(detail=False, url_path=r'region.tif')
8291
def region_tif(self, request: Request, pk: int = None) -> HttpResponse:
8392
return self.region(request, pk, format='tif')
8493

8594
@swagger_auto_schema(
8695
method='GET',
87-
operation_summary='Returns region tile binary from world coordinates in given EPSG as a png image.',
88-
manual_parameters=[params.projection] + params.REGION,
96+
operation_summary=region_summary,
97+
manual_parameters=region_parameters + params.STYLE,
8998
)
9099
@action(detail=False, url_path=r'region.png')
91100
def region_png(self, request: Request, pk: int = None) -> HttpResponse:
92101
return self.region(request, pk, format='png')
93102

94103
@swagger_auto_schema(
95104
method='GET',
96-
operation_summary='Returns region tile binary from world coordinates in given EPSG as a jpeg image.',
97-
manual_parameters=[params.projection] + params.REGION,
105+
operation_summary=region_summary,
106+
manual_parameters=region_parameters + params.STYLE,
98107
)
99108
@action(detail=False, url_path=r'region.jpeg')
100109
def region_jpeg(self, request: Request, pk: int = None) -> HttpResponse:
101110
return self.region(request, pk, format='jpeg')
102111

103112
@swagger_auto_schema(
104113
method='GET',
105-
operation_summary='Returns single pixel.',
106-
manual_parameters=[params.projection, params.left, params.top] + params.STYLE,
114+
operation_summary=pixel_summary,
115+
manual_parameters=pixel_parameters,
107116
)
108117
@action(detail=False)
109118
def pixel(self, request: Request, pk: int = None) -> Response:
@@ -115,8 +124,8 @@ def pixel(self, request: Request, pk: int = None) -> Response:
115124

116125
@swagger_auto_schema(
117126
method='GET',
118-
operation_summary='Returns histogram',
119-
manual_parameters=[params.projection] + params.HISTOGRAM,
127+
operation_summary=histogram_summary,
128+
manual_parameters=histogram_parameters,
120129
)
121130
@action(detail=False)
122131
def histogram(self, request: Request, pk: int = None) -> Response:
@@ -141,30 +150,67 @@ def histogram(self, request: Request, pk: int = None) -> Response:
141150

142151

143152
class DataDetailMixin(DataMixin):
153+
@method_decorator(cache_page(CACHE_TIMEOUT))
154+
@swagger_auto_schema(
155+
method='GET',
156+
operation_summary=thumbnail_summary,
157+
manual_parameters=thumbnail_parameters,
158+
)
144159
@action(detail=True, url_path='thumbnail.png')
145160
def thumbnail_png(self, request: Request, pk: int = None) -> HttpResponse:
146161
return super().thumbnail_png(request, pk)
147162

163+
@method_decorator(cache_page(CACHE_TIMEOUT))
164+
@swagger_auto_schema(
165+
method='GET',
166+
operation_summary=thumbnail_summary,
167+
manual_parameters=thumbnail_parameters,
168+
)
148169
@action(detail=True, url_path='thumbnail.jpeg')
149170
def thumbnail_jpeg(self, request: Request, pk: int = None) -> HttpResponse:
150171
return super().thumbnail_jpeg(request, pk)
151172

173+
@swagger_auto_schema(
174+
method='GET',
175+
operation_summary=region_summary,
176+
manual_parameters=region_parameters,
177+
)
152178
@action(detail=True, url_path=r'region.tif')
153179
def region_tif(self, request: Request, pk: int = None) -> HttpResponse:
154180
return super().region_tif(request, pk)
155181

182+
@swagger_auto_schema(
183+
method='GET',
184+
operation_summary=region_summary,
185+
manual_parameters=region_parameters + params.STYLE,
186+
)
156187
@action(detail=True, url_path=r'region.png')
157188
def region_png(self, request: Request, pk: int = None) -> HttpResponse:
158189
return super().region_png(request, pk)
159190

191+
@swagger_auto_schema(
192+
method='GET',
193+
operation_summary=region_summary,
194+
manual_parameters=region_parameters + params.STYLE,
195+
)
160196
@action(detail=True, url_path=r'region.jpeg')
161197
def region_jpeg(self, request: Request, pk: int = None) -> HttpResponse:
162198
return super().region_jpeg(request, pk)
163199

200+
@swagger_auto_schema(
201+
method='GET',
202+
operation_summary=pixel_summary,
203+
manual_parameters=pixel_parameters,
204+
)
164205
@action(detail=True)
165206
def pixel(self, request: Request, pk: int = None) -> Response:
166207
return super().pixel(request, pk)
167208

209+
@swagger_auto_schema(
210+
method='GET',
211+
operation_summary=histogram_summary,
212+
manual_parameters=histogram_parameters,
213+
)
168214
@action(detail=True)
169215
def histogram(self, request: Request, pk: int = None) -> Response:
170216
return super().histogram(request, pk)

django_large_image/rest/metadata.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,21 @@
77
from django_large_image.rest import params
88
from django_large_image.rest.base import LargeImageMixinBase
99

10+
metadata_summary = 'Returns tile metadata.'
11+
metadata_parameters = [params.projection]
12+
internal_metadata_summary = 'Returns additional known metadata about the tile source.'
13+
internal_metadata_parameters = [params.projection]
14+
bands_summary = 'Returns bands information.'
15+
bands_parameters = [params.projection]
16+
band_summary = 'Returns single band information.'
17+
band_parameters = [params.projection, params.band]
18+
1019

1120
class MetaDataMixin(LargeImageMixinBase):
1221
@swagger_auto_schema(
1322
method='GET',
14-
operation_summary='Returns tile metadata.',
15-
manual_parameters=[params.projection],
23+
operation_summary=metadata_summary,
24+
manual_parameters=metadata_parameters,
1625
)
1726
@action(detail=False)
1827
def metadata(self, request: Request, pk: int = None) -> Response:
@@ -22,8 +31,8 @@ def metadata(self, request: Request, pk: int = None) -> Response:
2231

2332
@swagger_auto_schema(
2433
method='GET',
25-
operation_summary='Returns additional known metadata about the tile source.',
26-
manual_parameters=[params.projection],
34+
operation_summary=internal_metadata_summary,
35+
manual_parameters=internal_metadata_parameters,
2736
)
2837
@action(detail=False)
2938
def internal_metadata(self, request: Request, pk: int = None) -> Response:
@@ -33,8 +42,8 @@ def internal_metadata(self, request: Request, pk: int = None) -> Response:
3342

3443
@swagger_auto_schema(
3544
method='GET',
36-
operation_summary='Returns bands information.',
37-
manual_parameters=[params.projection],
45+
operation_summary=bands_summary,
46+
manual_parameters=bands_parameters,
3847
)
3948
@action(detail=False)
4049
def bands(self, request: Request, pk: int = None) -> Response:
@@ -44,11 +53,8 @@ def bands(self, request: Request, pk: int = None) -> Response:
4453

4554
@swagger_auto_schema(
4655
method='GET',
47-
operation_summary='Returns single band information.',
48-
manual_parameters=[
49-
params.projection,
50-
params.band,
51-
],
56+
operation_summary=bands_summary,
57+
manual_parameters=band_parameters,
5258
)
5359
@action(detail=False)
5460
def band(self, request: Request, pk: int = None) -> Response:
@@ -59,18 +65,38 @@ def band(self, request: Request, pk: int = None) -> Response:
5965

6066

6167
class MetaDataDetailMixin(MetaDataMixin):
68+
@swagger_auto_schema(
69+
method='GET',
70+
operation_summary=metadata_summary,
71+
manual_parameters=metadata_parameters,
72+
)
6273
@action(detail=True)
6374
def metadata(self, request: Request, pk: int = None) -> Response:
6475
return super().metadata(request, pk)
6576

77+
@swagger_auto_schema(
78+
method='GET',
79+
operation_summary=internal_metadata_summary,
80+
manual_parameters=internal_metadata_parameters,
81+
)
6682
@action(detail=True)
6783
def internal_metadata(self, request: Request, pk: int = None) -> Response:
6884
return super().internal_metadata(request, pk)
6985

86+
@swagger_auto_schema(
87+
method='GET',
88+
operation_summary=bands_summary,
89+
manual_parameters=bands_parameters,
90+
)
7091
@action(detail=True)
7192
def bands(self, request: Request, pk: int = None) -> Response:
7293
return super().bands(request, pk)
7394

95+
@swagger_auto_schema(
96+
method='GET',
97+
operation_summary=bands_summary,
98+
manual_parameters=band_parameters,
99+
)
74100
@action(detail=True)
75101
def band(self, request: Request, pk: int = None) -> Response:
76102
return super().band(request, pk)

django_large_image/rest/params.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@
4242
description='The value to map as no data (often made transparent).',
4343
type=openapi.TYPE_NUMBER,
4444
)
45+
scheme = openapi.Parameter(
46+
'scheme',
47+
openapi.IN_QUERY,
48+
description='This is either ``linear`` (the default) or ``discrete``. If a palette is specified, ``linear`` uses a piecewise linear interpolation, and ``discrete`` uses exact colors from the palette with the range of the data mapped into the specified number of colors (e.g., a palette with two colors will split exactly halfway between the min and max values).',
49+
type=openapi.TYPE_STRING,
50+
)
4551

46-
STYLE = [palette, band, vmin, vmax, nodata]
52+
STYLE = [palette, band, vmin, vmax, nodata, scheme]
4753

4854
# Region Parameters
4955
left = openapi.Parameter(
@@ -63,7 +69,6 @@
6369
openapi.IN_QUERY,
6470
description='The projection/units of the region coordinates.',
6571
type=openapi.TYPE_STRING,
66-
default='EPSG:4326',
6772
)
6873

6974
REGION = [left, right, top, bottom, units]

django_large_image/rest/tiles.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
from django_large_image.rest import params
1313
from django_large_image.rest.base import CACHE_TIMEOUT, LargeImageMixinBase
1414

15+
tile_summary = 'Returns tile image binary.'
16+
tile_parameters = [params.projection, params.z, params.x, params.y] + params.STYLE
17+
tile_corners_summary = 'Returns bounds of a tile for a given x, y, z index.'
18+
tile_corners_parameters = [params.projection, params.z, params.x, params.y]
19+
1520

1621
class TilesMixin(LargeImageMixinBase):
1722
def tile(
@@ -29,8 +34,8 @@ def tile(
2934
@method_decorator(cache_page(CACHE_TIMEOUT))
3035
@swagger_auto_schema(
3136
method='GET',
32-
operation_summary='Returns tile image as a PNG.',
33-
manual_parameters=[params.projection, params.z, params.x, params.y] + params.STYLE,
37+
operation_summary=tile_summary,
38+
manual_parameters=tile_parameters,
3439
)
3540
@action(detail=False, url_path=r'tiles/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+).png')
3641
def tile_png(
@@ -46,8 +51,8 @@ def tile_png(
4651
@method_decorator(cache_page(CACHE_TIMEOUT))
4752
@swagger_auto_schema(
4853
method='GET',
49-
operation_summary='Returns tile image as a JPEG.',
50-
manual_parameters=[params.projection, params.z, params.x, params.y] + params.STYLE,
54+
operation_summary=tile_summary,
55+
manual_parameters=tile_parameters,
5156
)
5257
@action(detail=False, url_path=r'tiles/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+).jpeg')
5358
def tile_jpeg(
@@ -62,8 +67,8 @@ def tile_jpeg(
6267

6368
@swagger_auto_schema(
6469
method='GET',
65-
operation_summary='Returns bounds of a tile for a given x, y, z index.',
66-
manual_parameters=[params.projection, params.z, params.x, params.y],
70+
operation_summary=tile_corners_summary,
71+
manual_parameters=tile_corners_parameters,
6772
)
6873
@action(
6974
detail=False, methods=['get'], url_path=r'tiles/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+)/corners'
@@ -84,6 +89,11 @@ def tile_corners(
8489

8590

8691
class TilesDetailMixin(TilesMixin):
92+
@swagger_auto_schema(
93+
method='GET',
94+
operation_summary=tile_summary,
95+
manual_parameters=tile_parameters,
96+
)
8797
@action(detail=True, url_path=r'tiles/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+).png')
8898
def tile_png(
8999
self,
@@ -95,6 +105,11 @@ def tile_png(
95105
) -> HttpResponse:
96106
return super().tile_png(request, x, y, z, pk)
97107

108+
@swagger_auto_schema(
109+
method='GET',
110+
operation_summary=tile_summary,
111+
manual_parameters=tile_parameters,
112+
)
98113
@action(detail=True, url_path=r'tiles/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+).jpeg')
99114
def tile_jpeg(
100115
self,
@@ -106,6 +121,11 @@ def tile_jpeg(
106121
) -> HttpResponse:
107122
return super().tile_jpeg(request, x, y, z, pk)
108123

124+
@swagger_auto_schema(
125+
method='GET',
126+
operation_summary=tile_corners_summary,
127+
manual_parameters=tile_corners_parameters,
128+
)
109129
@action(
110130
detail=True, methods=['get'], url_path=r'tiles/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+)/corners'
111131
)

0 commit comments

Comments
 (0)