Skip to content

Commit

Permalink
connected_operation_names, authorized_operation_names
Browse files Browse the repository at this point in the history
  • Loading branch information
aaxelb committed Mar 13, 2024
1 parent 4b51e53 commit 9e1d111
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 13 deletions.
24 changes: 19 additions & 5 deletions addon_service/authorized_storage_account/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from typing import Iterator

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

Expand All @@ -6,6 +8,7 @@
from addon_service.common.enums.validators import validate_addon_capability
from addon_toolkit import (
AddonCapabilities,
AddonImp,
AddonOperationImp,
)

Expand Down Expand Up @@ -62,9 +65,20 @@ def owner_reference(self):
@property
def authorized_operations(self) -> list[AddonOperationModel]:
return [
AddonOperationModel(_imp)
for _imp in AddonOperationImp.on_implementation_cls(
self.external_storage_service.addon_imp.imp_cls,
capabilities=self.authorized_capabilities,
)
AddonOperationModel(_operation_imp)
for _operation_imp in self.iter_authorized_operations()
]

@property
def authorized_operation_names(self):
return [
_operation_imp.operation.name
for _operation_imp in self.iter_authorized_operations()
]

def iter_authorized_operations(self) -> Iterator[AddonOperationImp]:
_addon_imp: AddonImp = self.external_storage_service.addon_imp.imp
_authorized_caps = self.authorized_capabilities
for _operation_imp in _addon_imp.get_operation_imps():
if _operation_imp.operation.capability in _authorized_caps:
yield _operation_imp
5 changes: 5 additions & 0 deletions addon_service/authorized_storage_account/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ def __init__(self, *args, **kwargs):
view_name=view_names.detail_view(RESOURCE_TYPE), required=False
)
authorized_capabilities = EnumNameMultipleChoiceField(enum_cls=AddonCapabilities)
authorized_operation_names = serializers.ListField(
child=serializers.CharField(),
read_only=True,
)
account_owner = ReadOnlyResourceRelatedField(
many=False,
queryset=UserReference.objects.all(),
Expand Down Expand Up @@ -107,4 +111,5 @@ class Meta:
"password",
"authorized_capabilities",
"authorized_operations",
"authorized_operation_names",
]
27 changes: 20 additions & 7 deletions addon_service/configured_storage_addon/models.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
from typing import Iterator

from django.contrib.postgres.fields import ArrayField
from django.core.exceptions import ValidationError
from django.db import models

from addon_service.addon_operation.models import AddonOperationModel
from addon_service.common.base_model import AddonsServiceBaseModel
from addon_service.common.enums.validators import validate_addon_capability
from addon_toolkit import AddonCapabilities
from addon_toolkit import (
AddonCapabilities,
AddonOperationImp,
)


class ConfiguredStorageAddon(AddonsServiceBaseModel):
Expand Down Expand Up @@ -63,16 +68,24 @@ def resource_uri(self):

@property
def connected_operations(self) -> list[AddonOperationModel]:
_implemented_ops = (
self.base_account.external_storage_service.implemented_operations
)
_connected_caps = self.connected_capabilities
return [
AddonOperationModel(_operation_imp)
for _operation_imp in _implemented_ops
if _operation_imp.capability in _connected_caps
for _operation_imp in self.iter_connected_operations()
]

@property
def connected_operation_names(self):
return [
_operation_imp.operation.name
for _operation_imp in self.iter_connected_operations()
]

def iter_connected_operations(self) -> Iterator[AddonOperationImp]:
_connected_caps = self.connected_capabilities
for _operation_imp in self.base_account.iter_authorized_operations():
if _operation_imp.operation.capability in _connected_caps:
yield _operation_imp

def clean(self):
_connected_caps = set(self.connected_capabilities)
if not _connected_caps.issubset(self.base_account.authorized_capabilities):
Expand Down
6 changes: 6 additions & 0 deletions addon_service/configured_storage_addon/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,14 @@ class ConfiguredStorageAddonSerializer(serializers.HyperlinkedModelSerializer):
view_name=view_names.detail_view(RESOURCE_TYPE)
)
connected_capabilities = EnumNameMultipleChoiceField(enum_cls=AddonCapabilities)
connected_operation_names = serializers.ListField(
child=serializers.CharField(),
read_only=True,
)
connected_operations = DataclassRelatedLinkField(
dataclass_model=AddonOperationModel,
related_link_view_name=view_names.related_view(RESOURCE_TYPE),
read_only=True,
)
base_account = ResourceRelatedField(
queryset=AuthorizedStorageAccount.objects.all(),
Expand Down Expand Up @@ -63,4 +68,5 @@ class Meta:
"authorized_resource",
"connected_capabilities",
"connected_operations",
"connected_operation_names",
]
9 changes: 8 additions & 1 deletion addon_service/configured_storage_addon/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,17 @@ class ConfiguredStorageAddonViewSet(RetrieveWriteViewSet):
serializer_class = ConfiguredStorageAddonSerializer

def get_permissions(self):
return []
if not self.action:
return super().get_permissions()

if self.action in ["retrieve", "retrieve_related", "update", "destroy"]:
if self.action in [
"retrieve",
"retrieve_related",
"partial_update",
"update",
"destroy",
]:
return [SessionUserCanViewReferencedResource()]
elif self.action == "create":
return [SessionUserIsReferencedResourceAdmin()]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ def test_get(self):
{
"default_root_folder",
"authorized_capabilities",
"authorized_operation_names",
},
)
self.assertEqual(
Expand Down

0 comments on commit 9e1d111

Please sign in to comment.