Data return for STAC collections (#1483)

* render data viewing page for collections #1409

render data viewing page for STAC collections if there is no STAC item below.

* flake8

* flake8

* add additional check for collections

* render data viewing page for collections #1409

render data viewing page for STAC collections if there is no STAC item below.

* flake8

* flake8

* add additional check for collections
This commit is contained in:
Sarah Jordan
2024-01-09 15:14:02 -06:00
committed by GitHub
parent e9bb5dcc95
commit fe7ea108a7
3 changed files with 172 additions and 10 deletions
+23 -3
View File
@@ -3810,9 +3810,29 @@ class API:
if request.format == F_HTML: # render
content['path'] = path
if 'assets' in content: # item view
content = render_j2_template(self.tpl_config,
'stac/item.html',
content, request.locale)
if content['type'] == 'Collection':
content = render_j2_template(
self.tpl_config,
'stac/collection_base.html',
content,
request.locale
)
elif content['type'] == 'Feature':
content = render_j2_template(
self.tpl_config,
'stac/item.html',
content,
request.locale
)
else:
msg = f'Unknown STAC type {content.type}'
LOGGER.error(msg)
return self.get_exception(
HTTPStatus.INTERNAL_SERVER_ERROR,
headers,
request.format,
'NoApplicableCode',
msg)
else:
content = render_j2_template(self.tpl_config,
'stac/catalog.html',
+35 -7
View File
@@ -169,15 +169,17 @@ class HateoasProvider(BaseProvider):
'entry:type': 'Item'
})
if resource_type == "Collection" and len(link_href_list) == 0:
content = jsondata
content = _modify_content_for_display(
content,
baseurl,
urlpath
)
elif resource_type == 'Assets':
content = jsondata
content['assets']['default'] = {
'href': os.path.join(baseurl, urlpath).replace('\\', '/'),
}
for key in content['assets']:
content['assets'][key]['file:size'] = 0
content['assets'][key]['created'] = jsondata["properties"]["datetime"] # noqa
content = _modify_content_for_display(content, baseurl, urlpath)
content['links'].extend(child_links)
@@ -187,6 +189,32 @@ class HateoasProvider(BaseProvider):
return f'<HateoasProvider> {self.data}'
def _modify_content_for_display(
content: dict,
baseurl: str,
urlpath: str) -> dict:
"""
Helper function to fill in required information for HTML display.
:param content: `dict` of JSON item
:param baseurl: base URL of endpoint
:param urlpath: base path of URL
:returns: `dict` of JSON item
"""
content['assets']['default'] = {
'href': os.path.join(baseurl, urlpath).replace('\\', '/'),
}
for key in content['assets']:
content['assets'][key]['file:size'] = 0
try:
content['assets'][key]['created'] = content["properties"]["datetime"] # noqa
except Exception as err:
LOGGER.debug(err)
LOGGER.debug('no properties included in STAC')
return content
def _get_json_data(jsonpath):
"""
Helper function used to load a json file that is located on the WEB
@@ -0,0 +1,114 @@
{% extends "_base.html" %}
{% block title %}{{ super() }} stac/{{ data['path'] }} {% endblock %}
{% block crumbs %}{{ super() }}
/ <a href="{{ config['server']['url'] }}/stac">{% trans %}SpatioTemporal Asset Catalog{% endtrans %}</a>
{% for link in get_breadcrumbs(data['path']) %}
/ <a class="crumbs-path" href="{{config['server']['url'] }}/stac/{{ link['href'] }}">{{ link['title'] }}</a>
{% endfor %}
{% endblock %}
{% block extrahead %}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js"></script>
{% endblock %}
{% block body %}
<section id="item">
<div class="row">
<div class="col-sm">
<h2>{% trans %}Collections{% endtrans %}: {{ data['id'] }}</h2>
</div>
</div>
<div class="row">
<div class="col-md-6 col-sm-12">
<div class="row">
<div class="col-sm-12">
<div id="items-map"></div>
<div id="assets">
<h4>{% trans %}Assets{% endtrans %}</h4>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>{% trans %}URL{% endtrans %}</th>
<th>{% trans %}Last Modified{% endtrans %}</th>
<th>{% trans %}Size{% endtrans %}</th>
</tr>
</thead>
<tbody>
{% for k, link in data['assets'].items() %}
<tr>
<td data-label="name">
<a title="{{ link['href'] }}" href="{{ link['href'] }}">
<span>{{ link['href'] | get_path_basename }}</span></a>
</td>
<td data-label="created">{{ link['created'] }}</td>
<td data-label="size">{{ link['file:size'] | human_size }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>{% trans %}Property{% endtrans %}</th>
<th>{% trans %}Value{% endtrans %}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{% trans %}id{% endtrans %}</td>
<td>{{ data.id }}</td>
</tr>
<tr>
<td>{% trans %}description{% endtrans %}</td>
<td>{{ data.description }}</td>
</tr>
<tr>
<td>{% trans %}extent{% endtrans %}</td>
<td>{{ data.extent }}</td>
</tr>
{% if data['cube:dimensions'] %}
<tr>
<td>{% trans %}cube:dimensions{% endtrans %}</td>
<td>{{ data['cube:dimensions'] }}</td>
</tr>
{% endif %}
{% if data['cube:variables'] %}
<tr>
<td>{% trans %}cube:variables{% endtrans %}</td>
<td>{{ data['cube:variables'] }}</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</section>
{% endblock %}
{% block extrafoot %}
<script>
//var map = L.map('items-map').setView([{{ 45 }}, {{ -75 }}], 2);
var map = L.map('items-map').setView([{{ 0 }}, {{ 0 }}], 1);
map.addLayer(new L.TileLayer(
'{{ config['server']['map']['url'] }}', {
maxZoom: 18,
attribution: '{{ config['server']['map']['attribution'] | safe }}'
}
));
var bbox_layer = L.polygon([
[{{ data['extent']['spatial']['bbox'][0][1] }}, {{ data['extent']['spatial']['bbox'][0][0] }}],
[{{ data['extent']['spatial']['bbox'][0][3] }}, {{ data['extent']['spatial']['bbox'][0][0] }}],
[{{ data['extent']['spatial']['bbox'][0][3] }}, {{ data['extent']['spatial']['bbox'][0][2] }}],
[{{ data['extent']['spatial']['bbox'][0][1] }}, {{ data['extent']['spatial']['bbox'][0][2] }}],
]);
map.addLayer(bbox_layer);
map.fitBounds(bbox_layer.getBounds(), {maxZoom: 10});
</script>
{% endblock %}