Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 18 additions & 20 deletions backend/adapter_processor/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from cryptography.fernet import Fernet
from rest_framework import serializers
from unstract.adapters.constants import Common as common
from utils.serializer_utils import SerializerUtils

from backend.constants import FieldLengthConstants as FLC
from backend.serializers import AuditSerializer
Expand Down Expand Up @@ -42,12 +41,9 @@ class DefaultAdapterSerializer(serializers.Serializer):
class AdapterInstanceSerializer(BaseAdapterSerializer):
"""Inherits BaseAdapterSerializer.

Used for GET/POST request for adapter
Used for CRUD other than listing
"""

class Meta(BaseAdapterSerializer.Meta):
pass

def to_internal_value(self, data: dict[str, Any]) -> dict[str, Any]:
encryption_secret: EncryptionSecret = EncryptionSecret.objects.get()
f: Fernet = Fernet(encryption_secret.key.encode("utf-8"))
Expand All @@ -62,30 +58,32 @@ def to_internal_value(self, data: dict[str, Any]) -> dict[str, Any]:
def to_representation(self, instance: AdapterInstance) -> dict[str, str]:
rep: dict[str, str] = super().to_representation(instance)

if SerializerUtils.check_context_for_GET_or_POST(context=self.context):
rep[common.ICON] = AdapterProcessor.get_adapter_data_with_key(
instance.adapter_id, common.ICON
)
rep.pop(AdapterKeys.ADAPTER_METADATA_B)
encryption_secret: EncryptionSecret = EncryptionSecret.objects.get()
f: Fernet = Fernet(encryption_secret.key.encode("utf-8"))

rep.pop(AdapterKeys.ADAPTER_METADATA_B)
Comment thread
nehabagdia marked this conversation as resolved.
adapter_metadata = json.loads(
f.decrypt(bytes(instance.adapter_metadata_b).decode("utf-8"))
)
rep[AdapterKeys.ADAPTER_METADATA] = adapter_metadata

return rep


class AdapterDetailSerializer(BaseAdapterSerializer):
class AdapterListSerializer(BaseAdapterSerializer):
"""Inherits BaseAdapterSerializer.

Used for GET/UPDATE/DELETE request for adapter/<uuid:pk>
Used for listing adapters
"""

class Meta(BaseAdapterSerializer.Meta):
model = AdapterInstance
fields = ("id", "adapter_id", "adapter_name") # type: ignore

def to_representation(self, instance: AdapterInstance) -> dict[str, str]:
rep: dict[str, str] = super().to_representation(instance)

encryption_secret: EncryptionSecret = EncryptionSecret.objects.get()
f: Fernet = Fernet(encryption_secret.key.encode("utf-8"))

rep.pop(AdapterKeys.ADAPTER_METADATA_B)
adapter_metadata = json.loads(
f.decrypt(bytes(instance.adapter_metadata_b).decode("utf-8"))
rep[common.ICON] = AdapterProcessor.get_adapter_data_with_key(
instance.adapter_id, common.ICON
)
rep[AdapterKeys.ADAPTER_METADATA] = adapter_metadata

return rep
7 changes: 3 additions & 4 deletions backend/adapter_processor/urls.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
from adapter_processor.views import (
AdapterDetailViewSet,
AdapterInstanceViewSet,
AdapterViewSet,
DefaultAdapterViewSet,
)
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns

adapter = AdapterViewSet.as_view({"get": "list"})
default_triad = DefaultAdapterViewSet.as_view(
{"post": "configure_default_triad"}
)
adapter = AdapterViewSet.as_view({"get": "list"})
adapter_schema = AdapterViewSet.as_view({"get": "get_adapter_schema"})
adapter_test = AdapterViewSet.as_view({"post": "test"})
adapter_list = AdapterInstanceViewSet.as_view({"post": "create", "get": "list"})
adapter_detail = AdapterDetailViewSet.as_view(
adapter_detail = AdapterInstanceViewSet.as_view(
{
"get": "retrieve",
"put": "update",
"patch": "partial_update",
"delete": "destroy",
}
)
adapter_test = AdapterViewSet.as_view({"post": "test"})
urlpatterns = format_suffix_patterns(
[
path("adapter_schema/", adapter_schema, name="get_adapter_schema"),
Expand Down
38 changes: 20 additions & 18 deletions backend/adapter_processor/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
UniqueConstraintViolation,
)
from adapter_processor.serializers import (
AdapterDetailSerializer,
AdapterInstanceSerializer,
AdapterListSerializer,
DefaultAdapterSerializer,
TestAdapterSerializer,
)
Expand All @@ -23,6 +23,7 @@
from rest_framework import status
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
from rest_framework.versioning import URLPathVersioning
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from utils.filtering import FilterHelper
Expand Down Expand Up @@ -115,7 +116,7 @@ def test(self, request: Request) -> Response:

class AdapterInstanceViewSet(ModelViewSet):
queryset = AdapterInstance.objects.all()

permission_classes: list[type[IsOwner]] = [IsOwner]
serializer_class = AdapterInstanceSerializer

def get_queryset(self) -> Optional[QuerySet]:
Expand All @@ -132,6 +133,13 @@ def get_queryset(self) -> Optional[QuerySet]:
)
return queryset

def get_serializer_class(
Comment thread
nehabagdia marked this conversation as resolved.
self,
) -> ModelSerializer:
if self.action == "list":
return AdapterListSerializer
return AdapterInstanceSerializer

def create(self, request: Any) -> Response:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
Expand Down Expand Up @@ -159,6 +167,16 @@ def create(self, request: Any) -> Response:
serializer.data, status=status.HTTP_201_CREATED, headers=headers
)

def destroy(
Comment thread
nehabagdia marked this conversation as resolved.
self, request: Request, *args: tuple[Any], **kwargs: dict[str, Any]
) -> Response:
adapter_instance: AdapterInstance = self.get_object()
if adapter_instance.is_default:
logger.error("Cannot delete a default adapter")
raise CannotDeleteDefaultAdapter()
super().perform_destroy(adapter_instance)
return Response(status=status.HTTP_204_NO_CONTENT)

def get_existing_defaults(
self, adapter_config: dict[str, Any], user: User
) -> Optional[AdapterInstance]:
Expand All @@ -172,19 +190,3 @@ def get_existing_defaults(
)

return existing_adapter_default


class AdapterDetailViewSet(ModelViewSet):
queryset = AdapterInstance.objects.all()
serializer_class = AdapterDetailSerializer
permission_classes = [IsOwner]

def destroy(
self, request: Request, *args: tuple[Any], **kwargs: dict[str, Any]
) -> Response:
adapter_instance: AdapterInstance = self.get_object()
if adapter_instance.is_default:
logger.error("Cannot delete a default adapter")
raise CannotDeleteDefaultAdapter
super().perform_destroy(adapter_instance)
return Response(status=status.HTTP_204_NO_CONTENT)