Skip to content

Commit

Permalink
[Fixes #68,#66] admin interface extension, api interface extension fo…
Browse files Browse the repository at this point in the history
…r bonares md fields
  • Loading branch information
mwallschlaeger committed May 14, 2024
1 parent 1ba8776 commit c5153e2
Show file tree
Hide file tree
Showing 11 changed files with 208 additions and 253 deletions.
66 changes: 66 additions & 0 deletions geonode/base/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@
RestrictionCodeType,
ContactRole,
Link,
RelationType,
RelatedIdentifierType,
FundingReference,
RelatedIdentifier,
Funder,
RelatedProject,
License,
HierarchicalKeyword,
MenuPlaceholder,
Expand Down Expand Up @@ -191,6 +197,60 @@ class LinkAdmin(admin.ModelAdmin):
form = forms.modelform_factory(Link, fields="__all__")


class RelationTypeAdmin(admin.ModelAdmin):
model = RelationType
list_display = ("label", "description")
list_display_links = ("label",)
list_filter = ("label",)

form = forms.modelform_factory(RelationType, fields="__all__")


class RelatedIdentifierAdmin(admin.ModelAdmin):
model = RelatedIdentifier
list_display = ("id", "related_identifier", "related_identifier_type", "relation_type")
list_display_links = ("related_identifier", "related_identifier_type", "relation_type")
list_filter = ("related_identifier", "related_identifier_type", "relation_type")

form = forms.modelform_factory(RelatedIdentifier, fields="__all__")


class RelatedIdentifierTypeAdmin(admin.ModelAdmin):
model = RelatedIdentifierType
list_display = ("label", "description")
list_display_links = ("label",)
list_filter = ("label",)

form = forms.modelform_factory(RelatedIdentifierType, fields="__all__")


class FundingReferenceAdmin(admin.ModelAdmin):
model = FundingReference
list_display = ("funder_name", "funder_identifier", "funder_identifier_type")
list_display_links = []
list_filter = ("funder_name", "funder_identifier", "funder_identifier_type")

form = forms.modelform_factory(FundingReference, fields="__all__")


class FunderAdmin(admin.ModelAdmin):
model = Funder
list_display = ("funding_reference", "award_number", "award_uri", "award_title")
list_display_links = ("funding_reference",)
list_filter = ("funding_reference", "award_number", "award_uri", "award_title")

form = forms.modelform_factory(Funder, fields="__all__")


class RelatedProjectAdmin(admin.ModelAdmin):
model = RelatedProject
list_display = ("label", "display_name")
list_display_links = []
list_filter = ("label", "display_name")

form = forms.modelform_factory(RelatedProject, fields="__all__")


class HierarchicalKeywordAdmin(TreeAdmin):
search_fields = ("name",)
form = movenodeform_factory(HierarchicalKeyword)
Expand Down Expand Up @@ -326,6 +386,12 @@ def keyword_id(self, obj):
admin.site.register(ContactRole, ContactRoleAdmin)
admin.site.register(Link, LinkAdmin)
admin.site.register(License, LicenseAdmin)
admin.site.register(RelationType, RelationTypeAdmin)
admin.site.register(RelatedIdentifierType, RelatedIdentifierTypeAdmin)
admin.site.register(RelatedIdentifier, RelatedIdentifierAdmin)
admin.site.register(FundingReference, FundingReferenceAdmin)
admin.site.register(Funder, FunderAdmin)
admin.site.register(RelatedProject, RelatedProjectAdmin)
admin.site.register(HierarchicalKeyword, HierarchicalKeywordAdmin)
admin.site.register(MenuPlaceholder, MenuPlaceholderAdmin)
admin.site.register(Menu, MenuAdmin)
Expand Down
6 changes: 6 additions & 0 deletions geonode/base/api/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,12 @@ def has_object_permission(self, request, view, obj):
return IsSelfOrAdmin.has_object_permission(self, request, view, obj)


class IsAdminOrStaffOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.user.is_superuser or request.user.is_staff:
return True


class IsOwnerOrAdmin(permissions.BasePermission):
"""
Object-level permission to only allow admin and owners of an object to edit it.
Expand Down
78 changes: 49 additions & 29 deletions geonode/base/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ def to_representation(self, value):
for _i18n_label in ThesaurusKeywordLabel.objects.filter(keyword__id=value.id).iterator():
_i18n[_i18n_label.lang] = _i18n_label.label
return {
"keyword": value.id,
"name": value.alt_label,
"slug": slugify(value.about),
"uri": value.about,
Expand All @@ -200,6 +201,13 @@ class Meta:
fields = ("alt_label",)


class SimpleThesaurusKeywordLabelSerializer(DynamicModelSerializer):
class Meta:
model = ThesaurusKeywordLabel
name = "ThesaurusKeywordLabel"
fields = ("keyword", "lang", "label")


class SimpleRegionSerializer(DynamicModelSerializer):
class Meta:
model = Region
Expand Down Expand Up @@ -282,6 +290,13 @@ class Meta:
fields = ("identifier",)


class FullLicenseSerializer(DynamicModelSerializer):
class Meta:
model = License
name = "License"
fields = ("identifier", "name", "abbreviation", "description", "url", "license_text")


class SpatialRepresentationTypeSerializer(DynamicModelSerializer):
class Meta:
model = SpatialRepresentationType
Expand Down Expand Up @@ -414,37 +429,37 @@ def get_attribute(self, instance):
return False



class UserSerializer(BaseDynamicModelSerializer):
class Meta:
ref_name = "UserProfile"
model = get_user_model()
name = "user"
view_name = "users-list"
fields = ("pk",
"username",
"first_name",
"last_name",
"avatar",
"perms",
"is_superuser",
"is_staff",
"email",
"organization",
"profile",
"position",
"voice",
"fax",
"delivery",
"city",
"area",
"zipcode",
"keywords",
"country",
"language",
"timezone",
"orcid_identifier"
)
fields = (
"pk",
"username",
"first_name",
"last_name",
"avatar",
"perms",
"is_superuser",
"is_staff",
"email",
"organization",
"profile",
"position",
"voice",
"fax",
"delivery",
"city",
"area",
"zipcode",
"keywords",
"country",
"language",
"timezone",
"orcid_identifier",
)

@classmethod
def setup_eager_loading(cls, queryset):
Expand All @@ -466,10 +481,7 @@ def to_representation(self, instance):
return data

avatar = AvatarUrlField(240, read_only=True)
keywords = ComplexDynamicRelationField(
SimpleHierarchicalKeywordSerializer, embed=False, many=True
)

keywords = ComplexDynamicRelationField(SimpleHierarchicalKeywordSerializer, embed=False, many=True)


class ContactRoleField(DynamicComputedField):
Expand Down Expand Up @@ -995,6 +1007,14 @@ class Meta:
fields = "__all__"


class RelatedIdentifierSerializer(DynamicModelSerializer):
class Meta:
name = "relatedidentifiers"
model = RelatedIdentifier
count_type = "relatedidentifier"
fields = "__all__"


class FundingReferenceSerializer(DynamicModelSerializer):
class Meta:
name = "fundingreferences"
Expand Down
3 changes: 3 additions & 0 deletions geonode/base/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,15 @@
router.register(r"resources", views.ResourceBaseViewSet, "base-resources")
router.register(r"owners", views.OwnerViewSet, "owners")
router.register(r"categories", views.TopicCategoryViewSet, "categories")
router.register(r"licenses", views.LicenseViewSet, "licenses")
router.register(r"relationtypes", views.RelationTypeViewSet, "relationtypes")
router.register(r"relatedidentifiertypes", views.RelatedIdentifierTypeViewSet, "relatedidentifiertypes")
router.register(r"relatedidentifiers", views.RelatedIdentifierViewSet, "relatedidentifiers")
router.register(r"fundingreferences", views.FundingReferenceViewSet, "fundingreferences")
router.register(r"relatedprojects", views.RelatedProjectViewSet, "relatedprojects")
router.register(r"keywords", views.HierarchicalKeywordViewSet, "keywords")
router.register(r"tkeywords", views.ThesaurusKeywordViewSet, "tkeywords")
router.register(r"tkeywordlabels", views.ThesaurusKeywordLabelViewSet, "tkeywordlabels")
router.register(r"regions", views.RegionViewSet, "regions")

urlpatterns = []
56 changes: 56 additions & 0 deletions geonode/base/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,11 @@
ResourceBase,
TopicCategory,
ThesaurusKeyword,
ThesaurusKeywordLabel,
License,
RelationType,
RelatedIdentifierType,
RelatedIdentifier,
FundingReference,
RelatedProject,
)
Expand Down Expand Up @@ -116,12 +119,15 @@
OwnerSerializer,
HierarchicalKeywordSerializer,
TopicCategorySerializer,
FullLicenseSerializer,
RelationTypeSerializer,
RelatedIdentifierTypeSerializer,
RelatedIdentifierSerializer,
FundingReferenceSerializer,
RelatedProjectSerializer,
RegionSerializer,
ThesaurusKeywordSerializer,
SimpleThesaurusKeywordLabelSerializer,
ExtraMetadataSerializer,
LinkedResourceSerializer,
)
Expand Down Expand Up @@ -314,6 +320,20 @@ class ThesaurusKeywordViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveM
pagination_class = GeoNodeApiPagination


class ThesaurusKeywordLabelViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
API endpoint that lists Thesaurus keyword labels
"""

permission_classes = [
AllowAny,
]
filter_backends = [DynamicFilterBackend, DynamicSortingFilter, DynamicSearchFilter]
queryset = ThesaurusKeywordLabel.objects.all()
serializer_class = SimpleThesaurusKeywordLabelSerializer
pagination_class = GeoNodeApiPagination


class TopicCategoryViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
API endpoint that lists categories.
Expand All @@ -328,6 +348,22 @@ class TopicCategoryViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveMode
pagination_class = GeoNodeApiPagination


class LicenseViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
API endpoint that lists licenses.
"""

permission_classes = [
AllowAny,
]
filter_backends = [DynamicFilterBackend, DynamicSortingFilter, DynamicSearchFilter]
permission_classes = [IsAuthenticatedOrReadOnly, UserHasPerms]

queryset = License.objects.all()
serializer_class = FullLicenseSerializer
pagination_class = GeoNodeApiPagination


class RelationTypeViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
API endpoint that lists relationtype.
Expand All @@ -337,6 +373,8 @@ class RelationTypeViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModel
AllowAny,
]
filter_backends = [DynamicFilterBackend, DynamicSortingFilter, DynamicSearchFilter]
permission_classes = [IsAuthenticatedOrReadOnly, UserHasPerms]

queryset = RelationType.objects.all()
serializer_class = RelationTypeSerializer
pagination_class = GeoNodeApiPagination
Expand All @@ -351,11 +389,29 @@ class RelatedIdentifierTypeViewSet(WithDynamicViewSetMixin, ListModelMixin, Retr
AllowAny,
]
filter_backends = [DynamicFilterBackend, DynamicSortingFilter, DynamicSearchFilter]
permission_classes = [IsAuthenticatedOrReadOnly, UserHasPerms]

queryset = RelatedIdentifierType.objects.all()
serializer_class = RelatedIdentifierTypeSerializer
pagination_class = GeoNodeApiPagination


class RelatedIdentifierViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
API endpoint that lists relatedidentifier.
"""

permission_classes = [
AllowAny,
]
filter_backends = [DynamicFilterBackend, DynamicSortingFilter, DynamicSearchFilter]
permission_classes = [IsAuthenticatedOrReadOnly, UserHasPerms]

queryset = RelatedIdentifier.objects.all()
serializer_class = RelatedIdentifierSerializer
pagination_class = GeoNodeApiPagination


class FundingReferenceViewSet(WithDynamicViewSetMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
API endpoint that lists fundingreference.
Expand Down
Loading

0 comments on commit c5153e2

Please sign in to comment.