-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PB-769: STAC v1 optional asset features #431
Merged
Merged
Changes from 4 commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
43bfd8d
PB-769: stac v1 asset roles
benschs 5eeb7d4
PB-769: stac v1 collection level assets
benschs 44b6479
PB-769: collection asset tests
benschs 0d31456
PB-769: collection asset spec
benschs 9167612
PB-769: remove unused collection asset attributes
benschs 99b75a0
PB-769: stac v1 compliance gsd in spec
benschs File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 | ||
|
@@ -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': ('eo_gsd', 'proj_epsg', 'geoadmin_variant', 'geoadmin_lang') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think only |
||
}), | ||
) | ||
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): | ||
|
||
|
@@ -301,7 +402,7 @@ class Media: | |
} | ||
), | ||
('Description', { | ||
'fields': ('title', 'description') | ||
'fields': ('title', 'description', 'roles') | ||
}), | ||
('Attributes', { | ||
'fields': ('eo_gsd', 'proj_epsg', 'geoadmin_variant', 'geoadmin_lang') | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
), | ||
), | ||
] |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure we need the
update_interval
here... would it be considered at all? If I remember correctly we had set a fixed cache duration for assets uploaded via admin...There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From discussion: cachecontrol header is set to a fixed value for assets uploaded via admin ui, so
update_interval
has no effect. We decided to keep it mainly to keep the two asset models and logic similar