Skip to content

Commit

Permalink
Merge pull request #431 from geoadmin/feat-PB-769-assets
Browse files Browse the repository at this point in the history
PB-769: STAC v1 optional asset features
  • Loading branch information
benschs authored Jul 18, 2024
2 parents 06a8e63 + 99b75a0 commit bd7e36a
Show file tree
Hide file tree
Showing 16 changed files with 1,636 additions and 297 deletions.
103 changes: 102 additions & 1 deletion app/stac_api/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from stac_api.models import Asset
from stac_api.models import AssetUpload
from stac_api.models import Collection
from stac_api.models import CollectionAsset
from stac_api.models import CollectionLink
from stac_api.models import Item
from stac_api.models import ItemLink
Expand Down Expand Up @@ -271,6 +272,106 @@ def save_model(self, request, obj, form, change):
return super().save_model(request, obj, form, change)


@admin.register(CollectionAsset)
class CollectionAssetAdmin(admin.ModelAdmin):

class Media:
js = ('js/admin/asset_help_search.js',)
css = {'all': ('style/hover.css',)}

autocomplete_fields = ['collection']
search_fields = ['name', 'collection__name']
readonly_fields = [
'collection_name',
'href',
'checksum_multihash',
'created',
'updated',
'etag',
'update_interval'
]
list_display = ['name', 'collection_name', 'collection_published']
fieldsets = (
(None, {
'fields': ('name', 'collection', 'created', 'updated', 'etag')
}),
(
'File', {
'fields': ('file', 'media_type', 'href', 'checksum_multihash', 'update_interval')
}
),
('Description', {
'fields': ('title', 'description', 'roles')
}),
('Attributes', {
'fields': ['proj_epsg']
}),
)
list_filter = [AutocompleteFilterFactory('Collection name', 'collection', use_pk_exact=True)]

def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super().get_search_results(request, queryset, search_term)
if search_term.startswith('"') and search_term.endswith('"'):
search_terms = search_term.strip('"').split('/', maxsplit=2)
if len(search_terms) == 2:
collection_name = search_terms[0]
asset_name = search_terms[1]
else:
collection_name = None
asset_name = search_terms[0]
queryset |= self.model.objects.filter(name__exact=asset_name)
if collection_name:
queryset &= self.model.objects.filter(collection__name__exact=collection_name)
return queryset, use_distinct

def collection_published(self, instance):
return instance.collection.published

collection_published.admin_order_field = 'collection__published'
collection_published.short_description = 'Published'
collection_published.boolean = True

def collection_name(self, instance):
return instance.collection.name

collection_name.admin_order_field = 'collection__name'
collection_name.short_description = 'Collection Id'

def save_model(self, request, obj, form, change):
if obj.description == '':
# The admin interface with TextArea uses empty string instead
# of None. We use None for empty value, None value are stripped
# then in the output will empty string not.
obj.description = None

super().save_model(request, obj, form, change)

# Note: this is a bit hacky and only required to get access
# to the request object in 'href' method.
def get_form(self, request, obj=None, **kwargs): # pylint: disable=arguments-differ
self.request = request # pylint: disable=attribute-defined-outside-init
return super().get_form(request, obj, **kwargs)

def href(self, instance):
path = instance.file.name
return build_asset_href(self.request, path)

# We don't want to move the assets on S3
# That's why some fields like the name of the asset are set readonly here
# for update operations
def get_fieldsets(self, request, obj=None):
fields = super().get_fieldsets(request, obj)
if obj is None:
# In case a new Asset is added use the normal field 'collection' from model that have
# a help text fort the search functionality.
fields[0][1]['fields'] = ('name', 'collection', 'created', 'updated', 'etag')
return fields
# Otherwise if this is an update operation only display the read only fields
# without help text
fields[0][1]['fields'] = ('name', 'collection_name', 'created', 'updated', 'etag')
return fields


@admin.register(Asset)
class AssetAdmin(admin.ModelAdmin):

Expand Down Expand Up @@ -301,7 +402,7 @@ class Media:
}
),
('Description', {
'fields': ('title', 'description')
'fields': ('title', 'description', 'roles')
}),
('Attributes', {
'fields': ('eo_gsd', 'proj_epsg', 'geoadmin_variant', 'geoadmin_lang')
Expand Down
27 changes: 27 additions & 0 deletions app/stac_api/migrations/0035_asset_roles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 5.0.6 on 2024-07-09 14:10

import django.contrib.postgres.fields
from django.db import migrations
from django.db import models


class Migration(migrations.Migration):

dependencies = [
('stac_api', '0034_merge_0032_alter_asset_file_0033_auto_20240704_1157'),
]

operations = [
migrations.AddField(
model_name='asset',
name='roles',
field=django.contrib.postgres.fields.ArrayField(
base_field=models.CharField(max_length=255),
blank=True,
default=None,
help_text='Comma-separated list of roles to describe the purpose of the asset',
null=True,
size=None
),
),
]
Loading

0 comments on commit bd7e36a

Please sign in to comment.