Skip to content

Commit

Permalink
[Fixes #12513] Make is_approved, is_published API fields writable
Browse files Browse the repository at this point in the history
  • Loading branch information
mattiagiupponi authored and giohappy committed Aug 26, 2024
1 parent f8dabd5 commit 36b6796
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 6 deletions.
7 changes: 4 additions & 3 deletions geonode/base/api/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
BASIC_MANAGE_PERMISSIONS,
DOWNLOAD_PERMISSIONS,
EDIT_PERMISSIONS,
USER_CAN_PERMISSIONS,
VIEW_PERMISSIONS,
)
from distutils.util import strtobool
Expand Down Expand Up @@ -219,9 +220,9 @@ def filter_queryset(self, request, queryset, view):
class UserHasPerms(DjangoModelPermissions):
perms_map = {
"GET": [f"base.{x}" for x in VIEW_PERMISSIONS + DOWNLOAD_PERMISSIONS],
"POST": ["base.add_resourcebase"] + [f"base.{x}" for x in EDIT_PERMISSIONS],
"PUT": [f"base.{x}" for x in EDIT_PERMISSIONS],
"PATCH": [f"base.{x}" for x in EDIT_PERMISSIONS],
"POST": ["base.add_resourcebase"] + [f"base.{x}" for x in EDIT_PERMISSIONS + USER_CAN_PERMISSIONS],
"PUT": [f"base.{x}" for x in EDIT_PERMISSIONS + USER_CAN_PERMISSIONS],
"PATCH": [f"base.{x}" for x in EDIT_PERMISSIONS + USER_CAN_PERMISSIONS],
"DELETE": [f"base.{x}" for x in BASIC_MANAGE_PERMISSIONS],
}

Expand Down
20 changes: 17 additions & 3 deletions geonode/base/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,20 @@ def to_representation(self, instance):
return ret


class MetadataBooleanField(serializers.BooleanField):
MAPPING = {"is_approved": "can_approve", "is_published": "can_publish", "featured": "can_feature"}

def to_internal_value(self, data):
new_val = super().to_internal_value(data)
user = self.context["request"].user
user_action = self.MAPPING.get(self.field_name)
if getattr(user, user_action)(self.root.instance):
return new_val
else:
logger.warning(f"The user does not have the perms to update the value of {self.field_name}")
return getattr(self.root.instance, self.field_name)


class ResourceBaseSerializer(DynamicModelSerializer):
pk = serializers.CharField(read_only=True)
uuid = serializers.CharField(read_only=True)
Expand Down Expand Up @@ -592,10 +606,10 @@ class ResourceBaseSerializer(DynamicModelSerializer):
popular_count = serializers.CharField(required=False)
share_count = serializers.CharField(required=False)
rating = serializers.CharField(required=False)
featured = serializers.BooleanField(required=False)
featured = MetadataBooleanField(required=False, read_only=False)
advertised = serializers.BooleanField(required=False)
is_published = serializers.BooleanField(required=False, read_only=True)
is_approved = serializers.BooleanField(required=False, read_only=True)
is_published = MetadataBooleanField(required=False, read_only=False)
is_approved = MetadataBooleanField(required=False, read_only=False)
detail_url = DetailUrlField(read_only=True)
created = serializers.DateTimeField(read_only=True)
last_updated = serializers.DateTimeField(read_only=True)
Expand Down
6 changes: 6 additions & 0 deletions geonode/security/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,12 @@
"change_resourcebase_metadata",
]

USER_CAN_PERMISSIONS = [
"publish_resourcebase",
"approve_resourcebase",
"feature_resourcebase",
]

BASIC_MANAGE_PERMISSIONS = [
"delete_resourcebase",
"change_resourcebase_permissions",
Expand Down

0 comments on commit 36b6796

Please sign in to comment.