Skip to content

Commit 47ac7ed

Browse files
committed
PB-1885 added media type application/x-hdf5
1 parent f4fc1e4 commit 47ac7ed

File tree

7 files changed

+274
-16
lines changed

7 files changed

+274
-16
lines changed
Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
# Generated by Django 5.0.11 on 2025-08-14 14:19
2+
3+
from django.db import migrations
4+
from django.db import models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('stac_api', '0067_update_conformance'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='asset',
16+
name='media_type',
17+
field=models.CharField(
18+
choices=
19+
[(
20+
'application/vnd.apache.parquet',
21+
'Apache Parquet column-oriented data file format (application/vnd.apache.parquet)'
22+
),
23+
(
24+
'application/x.ascii-grid+zip',
25+
'Zipped ESRI ASCII raster format (.asc) (application/x.ascii-grid+zip)'
26+
),
27+
('application/x.ascii-xyz+zip', 'Zipped XYZ (.xyz) (application/x.ascii-xyz+zip)'),
28+
('application/x.e00+zip', 'Zipped e00 (application/x.e00+zip)'),
29+
('application/x.geotiff+zip', 'Zipped GeoTIFF (application/x.geotiff+zip)'),
30+
('image/tiff; application=geotiff', 'GeoTIFF (image/tiff; application=geotiff)'),
31+
('application/x.tiff+zip', 'Zipped TIFF (application/x.tiff+zip)'),
32+
('application/x.png+zip', 'Zipped PNG (application/x.png+zip)'),
33+
('application/x.jpeg+zip', 'Zipped JPEG (application/x.jpeg+zip)'),
34+
(
35+
'application/vnd.google-earth.kml+xml',
36+
'KML (application/vnd.google-earth.kml+xml)'
37+
),
38+
(
39+
'application/vnd.google-earth.kmz',
40+
'Zipped KML (application/vnd.google-earth.kmz)'
41+
), ('application/x.dxf+zip', 'Zipped DXF (application/x.dxf+zip)'),
42+
('application/gml+xml', 'GML (application/gml+xml)'),
43+
('application/x.gml+zip', 'Zipped GML (application/x.gml+zip)'),
44+
('application/vnd.las', 'LIDAR (application/vnd.las)'),
45+
('application/vnd.laszip', 'Zipped LIDAR (application/vnd.laszip)'),
46+
('application/x.vnd.las+zip', 'Zipped LAS (application/x.vnd.las+zip)'),
47+
(
48+
'application/vnd.laszip+copc',
49+
'Cloud Optimized Point Cloud (COPC) (application/vnd.laszip+copc)'
50+
),
51+
('application/x.shapefile+zip',
52+
'Zipped Shapefile (application/x.shapefile+zip)'), (
53+
'application/x.filegdb+zip',
54+
'Zipped File Geodatabase (application/x.filegdb+zip)'
55+
),
56+
(
57+
'application/x.filegdbp+zip',
58+
'Zipped File Geodatabase (ArcGIS Pro) (application/x.filegdbp+zip)'
59+
),
60+
(
61+
'application/x.ms-access+zip',
62+
'Zipped Personal Geodatabase (application/x.ms-access+zip)'
63+
), ('application/x.ms-excel+zip', 'Zipped Excel (application/x.ms-excel+zip)'),
64+
('application/x.tab+zip', 'Zipped Mapinfo-TAB (application/x.tab+zip)'),
65+
(
66+
'application/x.tab-raster+zip',
67+
'Zipped Mapinfo-Raster-TAB (application/x.tab-raster+zip)'
68+
), ('application/x.csv+zip',
69+
'Zipped CSV (application/x.csv+zip)'), ('text/csv', 'CSV (text/csv)'),
70+
('application/geopackage+sqlite3',
71+
'Geopackage (application/geopackage+sqlite3)'), (
72+
'application/x.geopackage+zip',
73+
'Zipped Geopackage (application/x.geopackage+zip)'
74+
), ('application/geo+json', 'GeoJSON (application/geo+json)'),
75+
('application/x.geojson+zip', 'Zipped GeoJSON (application/x.geojson+zip)'),
76+
(
77+
'application/x.interlis; version=2.3',
78+
'Interlis 2 (application/x.interlis; version=2.3)'
79+
),
80+
(
81+
'application/x.interlis+zip; version=2.3',
82+
'Zipped XTF (2.3) (application/x.interlis+zip; version=2.3)'
83+
),
84+
(
85+
'application/x.interlis; version=2.4',
86+
'Interlis 2 (application/x.interlis; version=2.4)'
87+
),
88+
(
89+
'application/x.interlis+zip; version=2.4',
90+
'Zipped XTF (2.4) (application/x.interlis+zip; version=2.4)'
91+
),
92+
(
93+
'application/x.interlis; version=1',
94+
'Interlis 1 (application/x.interlis; version=1)'
95+
),
96+
(
97+
'application/x.interlis+zip; version=1',
98+
'Zipped ITF (application/x.interlis+zip; version=1)'
99+
),
100+
(
101+
'image/tiff; application=geotiff; profile=cloud-optimized',
102+
'Cloud Optimized GeoTIFF (COG) (image/tiff; application=geotiff; profile=cloud-optimized)'
103+
), ('application/pdf', 'PDF (application/pdf)'),
104+
('application/x.pdf+zip', 'Zipped PDF (application/x.pdf+zip)'),
105+
('application/json', 'JSON (application/json)'),
106+
('application/x.json+zip', 'Zipped JSON (application/x.json+zip)'),
107+
('application/x-netcdf', 'NetCDF (application/x-netcdf)'),
108+
('application/x.netcdf+zip', 'Zipped NetCDF (application/x.netcdf+zip)'),
109+
('application/xml', 'XML (application/xml)'),
110+
('application/x.xml+zip', 'Zipped XML (application/x.xml+zip)'),
111+
(
112+
'application/vnd.mapbox-vector-tile',
113+
'mbtiles (application/vnd.mapbox-vector-tile)'
114+
), ('text/plain',
115+
'Text (text/plain)'), ('text/x.plain+zip', 'Zipped text (text/x.plain+zip)'),
116+
('application/x.dwg+zip', 'Zipped DWG (application/x.dwg+zip)'),
117+
('application/zip',
118+
'Generic Zip File (application/zip)'), ('image/tiff', 'TIFF (image/tiff)'),
119+
('image/jpeg', 'JPEG (image/jpeg)'), ('image/png', 'PNG (image/png)'),
120+
('application/vnd.sqlite3', 'sqlite (application/vnd.sqlite3)'),
121+
('application/grib', 'GRIB/GRIB2 (application/grib)'),
122+
('application/x-hdf5', 'HDF5 (application/x-hdf5)')],
123+
help_text=
124+
"This media type will be used as <em>Content-Type</em> header for the asset's object upon upload.",
125+
max_length=200
126+
),
127+
),
128+
migrations.AlterField(
129+
model_name='collectionasset',
130+
name='media_type',
131+
field=models.CharField(
132+
choices=[
133+
(
134+
'application/vnd.apache.parquet',
135+
'Apache Parquet column-oriented data file format (application/vnd.apache.parquet)'
136+
),
137+
(
138+
'application/x.ascii-grid+zip',
139+
'Zipped ESRI ASCII raster format (.asc) (application/x.ascii-grid+zip)'
140+
),
141+
(
142+
'application/x.ascii-xyz+zip',
143+
'Zipped XYZ (.xyz) (application/x.ascii-xyz+zip)'
144+
), ('application/x.e00+zip', 'Zipped e00 (application/x.e00+zip)'),
145+
('application/x.geotiff+zip', 'Zipped GeoTIFF (application/x.geotiff+zip)'), (
146+
'image/tiff; application=geotiff',
147+
'GeoTIFF (image/tiff; application=geotiff)'
148+
), ('application/x.tiff+zip', 'Zipped TIFF (application/x.tiff+zip)'),
149+
('application/x.png+zip', 'Zipped PNG (application/x.png+zip)'),
150+
('application/x.jpeg+zip', 'Zipped JPEG (application/x.jpeg+zip)'),
151+
(
152+
'application/vnd.google-earth.kml+xml',
153+
'KML (application/vnd.google-earth.kml+xml)'
154+
),
155+
(
156+
'application/vnd.google-earth.kmz',
157+
'Zipped KML (application/vnd.google-earth.kmz)'
158+
), ('application/x.dxf+zip', 'Zipped DXF (application/x.dxf+zip)'),
159+
('application/gml+xml', 'GML (application/gml+xml)'),
160+
('application/x.gml+zip', 'Zipped GML (application/x.gml+zip)'),
161+
('application/vnd.las', 'LIDAR (application/vnd.las)'),
162+
('application/vnd.laszip', 'Zipped LIDAR (application/vnd.laszip)'),
163+
('application/x.vnd.las+zip', 'Zipped LAS (application/x.vnd.las+zip)'),
164+
(
165+
'application/vnd.laszip+copc',
166+
'Cloud Optimized Point Cloud (COPC) (application/vnd.laszip+copc)'
167+
), (
168+
'application/x.shapefile+zip',
169+
'Zipped Shapefile (application/x.shapefile+zip)'
170+
),
171+
(
172+
'application/x.filegdb+zip',
173+
'Zipped File Geodatabase (application/x.filegdb+zip)'
174+
),
175+
(
176+
'application/x.filegdbp+zip',
177+
'Zipped File Geodatabase (ArcGIS Pro) (application/x.filegdbp+zip)'
178+
),
179+
(
180+
'application/x.ms-access+zip',
181+
'Zipped Personal Geodatabase (application/x.ms-access+zip)'
182+
), ('application/x.ms-excel+zip', 'Zipped Excel (application/x.ms-excel+zip)'),
183+
('application/x.tab+zip', 'Zipped Mapinfo-TAB (application/x.tab+zip)'),
184+
(
185+
'application/x.tab-raster+zip',
186+
'Zipped Mapinfo-Raster-TAB (application/x.tab-raster+zip)'
187+
), ('application/x.csv+zip',
188+
'Zipped CSV (application/x.csv+zip)'), ('text/csv', 'CSV (text/csv)'), (
189+
'application/geopackage+sqlite3',
190+
'Geopackage (application/geopackage+sqlite3)'
191+
),
192+
(
193+
'application/x.geopackage+zip',
194+
'Zipped Geopackage (application/x.geopackage+zip)'
195+
), ('application/geo+json', 'GeoJSON (application/geo+json)'),
196+
('application/x.geojson+zip', 'Zipped GeoJSON (application/x.geojson+zip)'),
197+
(
198+
'application/x.interlis; version=2.3',
199+
'Interlis 2 (application/x.interlis; version=2.3)'
200+
),
201+
(
202+
'application/x.interlis+zip; version=2.3',
203+
'Zipped XTF (2.3) (application/x.interlis+zip; version=2.3)'
204+
),
205+
(
206+
'application/x.interlis; version=2.4',
207+
'Interlis 2 (application/x.interlis; version=2.4)'
208+
),
209+
(
210+
'application/x.interlis+zip; version=2.4',
211+
'Zipped XTF (2.4) (application/x.interlis+zip; version=2.4)'
212+
),
213+
(
214+
'application/x.interlis; version=1',
215+
'Interlis 1 (application/x.interlis; version=1)'
216+
),
217+
(
218+
'application/x.interlis+zip; version=1',
219+
'Zipped ITF (application/x.interlis+zip; version=1)'
220+
),
221+
(
222+
'image/tiff; application=geotiff; profile=cloud-optimized',
223+
'Cloud Optimized GeoTIFF (COG) (image/tiff; application=geotiff; profile=cloud-optimized)'
224+
), ('application/pdf', 'PDF (application/pdf)'),
225+
('application/x.pdf+zip', 'Zipped PDF (application/x.pdf+zip)'),
226+
('application/json', 'JSON (application/json)'),
227+
('application/x.json+zip', 'Zipped JSON (application/x.json+zip)'),
228+
('application/x-netcdf', 'NetCDF (application/x-netcdf)'),
229+
('application/x.netcdf+zip', 'Zipped NetCDF (application/x.netcdf+zip)'),
230+
('application/xml', 'XML (application/xml)'),
231+
('application/x.xml+zip', 'Zipped XML (application/x.xml+zip)'),
232+
(
233+
'application/vnd.mapbox-vector-tile',
234+
'mbtiles (application/vnd.mapbox-vector-tile)'
235+
), ('text/plain', 'Text (text/plain)'),
236+
('text/x.plain+zip', 'Zipped text (text/x.plain+zip)'),
237+
('application/x.dwg+zip', 'Zipped DWG (application/x.dwg+zip)'),
238+
('application/zip',
239+
'Generic Zip File (application/zip)'), ('image/tiff', 'TIFF (image/tiff)'),
240+
('image/jpeg', 'JPEG (image/jpeg)'), ('image/png', 'PNG (image/png)'),
241+
('application/vnd.sqlite3', 'sqlite (application/vnd.sqlite3)'),
242+
('application/grib', 'GRIB/GRIB2 (application/grib)'),
243+
('application/x-hdf5', 'HDF5 (application/x-hdf5)')
244+
],
245+
help_text=
246+
"This media type will be used as <em>Content-Type</em> header for the asset's object upon upload.",
247+
max_length=200
248+
),
249+
),
250+
]

app/stac_api/validators.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@
104104
MediaType('image/jpeg', 'JPEG', ['.jpeg', '.jpg']),
105105
MediaType('image/png', 'PNG', ['.png']),
106106
MediaType('application/vnd.sqlite3', 'sqlite', ['.sqlite']),
107-
MediaType('application/grib', 'GRIB/GRIB2', ['.grib', '.grib2'])
107+
MediaType('application/grib', 'GRIB/GRIB2', ['.grib', '.grib2']),
108+
MediaType('application/x-hdf5', 'HDF5', ['.h5'])
108109
]
109110

110111
MT_VAR = "[0-9A-Za-z!#$%&'*+.^_`|~-]+"

app/tests/tests_09/data_factory.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ def get_json(self, method='get', keep_read_only=False):
275275
self._check_get_json_method(method)
276276
return {
277277
self.key_mapped(key): value
278-
for key, value in self.get_attributes(remove_relations=False).items()
278+
for key,
279+
value in self.get_attributes(remove_relations=False).items()
279280
if keep_read_only or self._filter_read_only_field(method, self.key_mapped(key))
280281
}
281282

@@ -616,7 +617,8 @@ def get_json(self, method='get', keep_read_only=False):
616617
'''
617618
json_data = {
618619
key: value
619-
for key, value in super().get_json(method, keep_read_only).items()
620+
for key,
621+
value in super().get_json(method, keep_read_only).items()
620622
if not key.startswith('properties_')
621623
}
622624
if method in ['get', 'serialize']:
@@ -859,8 +861,8 @@ def create_samples(self, samples, db_create=False, kwargs_list=True, **kwargs):
859861
samples = map(lambda i: None, range(samples))
860862
for i, sample_name in enumerate(samples):
861863
sample_kwargs = {
862-
key: value[i] if isinstance(value, list) and kwargs_list else value
863-
for key, value in kwargs.items()
864+
key: value[i] if isinstance(value, list) and kwargs_list else value for key,
865+
value in kwargs.items()
864866
}
865867
if sample_name:
866868
sample_kwargs['sample'] = sample_name

app/tests/tests_09/test_search_endpoint.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -520,14 +520,16 @@ def setUpTestData(cls):
520520
cls.factory.create_item_samples,
521521
[10] * len(cls.collections),
522522
map(lambda c: c.model, cls.collections),
523-
[True] * len(cls.collections),) for item in items
523+
[True] * len(cls.collections),
524+
) for item in items
524525
]
525526
cls.assets = [
526527
asset for assets in map(
527528
cls.factory.create_asset_samples,
528529
[3] * len(cls.items),
529530
map(lambda i: i.model, cls.items),
530-
[True] * len(cls.items),) for asset in assets
531+
[True] * len(cls.items),
532+
) for asset in assets
531533
]
532534

533535
def test_get_search_dft_cache_setting(self):

app/tests/tests_10/data_factory.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,8 @@ def get_json(self, method='get', keep_read_only=False):
277277
self._check_get_json_method(method)
278278
return {
279279
self.key_mapped(key): value
280-
for key, value in self.get_attributes(remove_relations=False).items()
280+
for key,
281+
value in self.get_attributes(remove_relations=False).items()
281282
if keep_read_only or self._filter_read_only_field(method, self.key_mapped(key))
282283
}
283284

@@ -618,7 +619,8 @@ def get_json(self, method='get', keep_read_only=False):
618619
'''
619620
json_data = {
620621
key: value
621-
for key, value in super().get_json(method, keep_read_only).items()
622+
for key,
623+
value in super().get_json(method, keep_read_only).items()
622624
if not key.startswith('properties_')
623625
}
624626
if method in ['get', 'serialize']:
@@ -953,8 +955,8 @@ def create_samples(self, samples, db_create=False, kwargs_list=True, **kwargs):
953955
samples = map(lambda i: None, range(samples))
954956
for i, sample_name in enumerate(samples):
955957
sample_kwargs = {
956-
key: value[i] if isinstance(value, list) and kwargs_list else value
957-
for key, value in kwargs.items()
958+
key: value[i] if isinstance(value, list) and kwargs_list else value for key,
959+
value in kwargs.items()
958960
}
959961
if sample_name:
960962
sample_kwargs['sample'] = sample_name

app/tests/tests_10/test_search_endpoint.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,14 +574,16 @@ def setUpTestData(cls):
574574
cls.factory.create_item_samples,
575575
[10] * len(cls.collections),
576576
map(lambda c: c.model, cls.collections),
577-
[True] * len(cls.collections),) for item in items
577+
[True] * len(cls.collections),
578+
) for item in items
578579
]
579580
cls.assets = [
580581
asset for assets in map(
581582
cls.factory.create_asset_samples,
582583
[3] * len(cls.items),
583584
map(lambda i: i.model, cls.items),
584-
[True] * len(cls.items),) for asset in assets
585+
[True] * len(cls.items),
586+
) for asset in assets
585587
]
586588

587589
def test_get_search_dft_cache_setting(self):

app/wsgi.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ def __init__(self, app, options=None): # pylint: disable=redefined-outer-name
5353

5454
def load_config(self):
5555
config = {
56-
key: value
57-
for key, value in self.options.items()
58-
if key in self.cfg.settings and value is not None
56+
key: value for key,
57+
value in self.options.items() if key in self.cfg.settings and value is not None
5958
}
6059
for key, value in config.items():
6160
self.cfg.set(key.lower(), value)

0 commit comments

Comments
 (0)