Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
538ecd1
Permissions intial commit
johnyrahul Mar 11, 2024
0beefe9
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 12, 2024
cb2b423
Update main.py
johnyrahul Mar 12, 2024
a3f0c97
Permissions for adapter intial commit
johnyrahul Mar 12, 2024
d9b345d
Corrected the query
johnyrahul Mar 12, 2024
82d1ccd
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 12, 2024
a0d4b1b
Default triad and tool setting changes
johnyrahul Mar 12, 2024
dd7be01
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 13, 2024
d2c5e7e
Default triad and tool setting changes
johnyrahul Mar 13, 2024
8ae820a
Resolving the conflicts
johnyrahul Mar 13, 2024
8c7a990
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 13, 2024
a61b366
Fix issue in pre-populating the default triad on the drpdown
mohamed-siddhiq Mar 14, 2024
8daa03d
implemented UI for adapter permissions
jaags-dev Mar 14, 2024
d4a3acc
Added permission for shared users
johnyrahul Mar 14, 2024
6f9298c
Merge branch 'feat/adapter-permission' into feat/adapter-permission-u…
jaags-dev Mar 14, 2024
7575ac9
changed delete text and code clean up
jaags-dev Mar 14, 2024
53a8f27
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 14, 2024
14d73c2
Merge branch 'feat/adapter-permission' into feat/adapter-permission-u…
jaags-dev Mar 14, 2024
331e765
Merge branch 'feat/adapter-permission-ui-changes' of github.com:Zipst…
jaags-dev Mar 14, 2024
d432ddc
changed delete text for share popup
jaags-dev Mar 14, 2024
cc2553a
removed is_defaul from serilaizer
johnyrahul Mar 14, 2024
71af56f
Merge branch 'feat/adapter-permission-ui-changes' of https://github.c…
johnyrahul Mar 14, 2024
8956656
Merge pull request #100 from Zipstack/feat/adapter-permission-ui-changes
johnyrahul Mar 14, 2024
1bc888a
handled missing value for created by email
jaags-dev Mar 14, 2024
c6dae31
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 14, 2024
ed45c7d
optimized migration file
johnyrahul Mar 14, 2024
0ebbd62
Merge branch 'feat/adapter-permission' of https://github.com/Zipstack…
johnyrahul Mar 14, 2024
5ab0ac8
Merge branch 'main' into feat/adapter-permission
johnyrahul Mar 14, 2024
dc56311
code optimization
jaags-dev Mar 14, 2024
22e953a
Added comments
johnyrahul Mar 15, 2024
f292941
Merge branch 'main' into feat/adapter-permission
jaags-dev Mar 15, 2024
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
Next Next commit
Permissions intial commit
  • Loading branch information
johnyrahul committed Mar 11, 2024
commit 538ecd153c5a7444ead152becbf296a38f7aa3ee
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.2.1 on 2024-03-11 07:55

from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("adapter_processor", "0005_alter_adapterinstance_adapter_type"),
]

operations = [
migrations.AddField(
model_name="adapterinstance",
name="shared_users",
field=models.ManyToManyField(
related_name="shared_adapters", to=settings.AUTH_USER_MODEL
),
),
]
16 changes: 16 additions & 0 deletions backend/adapter_processor/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import uuid
from typing import Any

from account.models import User
from django.db import models
from django.db.models import QuerySet
from unstract.adapters.enums import AdapterTypes
from utils.models.base_model import BaseModel

Expand All @@ -10,6 +12,16 @@
ADAPTER_ID_LENGTH = 128


class AdapterInstanceModelManager(models.Manager):
def get_queryset(self) -> QuerySet[Any]:
return super().get_queryset()

def for_user(self, user: User) -> QuerySet[Any]:
return self.get_queryset().filter(
models.Q(created_by=user) | models.Q(shared_users=user)
)


class AdapterInstance(BaseModel):
id = models.UUIDField(
primary_key=True,
Expand Down Expand Up @@ -66,6 +78,10 @@ class AdapterInstance(BaseModel):
db_comment="Is the adapter instance default",
)

shared_users = models.ManyToManyField(User, related_name="shared_adapters")
Comment thread
gaya3-vijayakumar marked this conversation as resolved.

objects = AdapterInstanceModelManager()

class Meta:
verbose_name = "adapter_adapterinstance"
verbose_name_plural = "adapter_adapterinstance"
Expand Down
41 changes: 35 additions & 6 deletions backend/adapter_processor/serializers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import json
from typing import Any

from account.models import User
from adapter_processor.adapter_processor import AdapterProcessor
from adapter_processor.constants import AdapterKeys
from cryptography.fernet import Fernet
Expand Down Expand Up @@ -45,13 +46,16 @@ class AdapterInstanceSerializer(BaseAdapterSerializer):
"""

def to_internal_value(self, data: dict[str, Any]) -> dict[str, Any]:
encryption_secret: str = settings.ENCRYPTION_KEY
f: Fernet = Fernet(encryption_secret.encode("utf-8"))
json_string: str = json.dumps(data.pop(AdapterKeys.ADAPTER_METADATA))
if data.get(AdapterKeys.ADAPTER_METADATA, None):
encryption_secret: str = settings.ENCRYPTION_KEY
f: Fernet = Fernet(encryption_secret.encode("utf-8"))
json_string: str = json.dumps(
data.pop(AdapterKeys.ADAPTER_METADATA)
)

data[AdapterKeys.ADAPTER_METADATA_B] = f.encrypt(
json_string.encode("utf-8")
)
data[AdapterKeys.ADAPTER_METADATA_B] = f.encrypt(
json_string.encode("utf-8")
)

return data

Expand Down Expand Up @@ -96,3 +100,28 @@ def to_representation(self, instance: AdapterInstance) -> dict[str, str]:
)

return rep


class SharedUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ("id", "username")


class SharedUserListSerializer(BaseAdapterSerializer):
"""Inherits BaseAdapterSerializer.

Used for listing adapters
"""

shared_users = SharedUserSerializer(many=True)

class Meta(BaseAdapterSerializer.Meta):
model = AdapterInstance
fields = (
"id",
"adapter_id",
"adapter_name",
"adapter_type",
"shared_users",
) # type: ignore
7 changes: 7 additions & 0 deletions backend/adapter_processor/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
"delete": "destroy",
}
)

adapter_users = AdapterInstanceViewSet.as_view({"get": "list_of_shared_users"})
urlpatterns = format_suffix_patterns(
[
path("adapter_schema/", adapter_schema, name="get_adapter_schema"),
Expand All @@ -29,5 +31,10 @@
path("adapter/default_triad/", default_triad, name="default_triad"),
path("adapter/<uuid:pk>/", adapter_detail, name="adapter_detail"),
path("test_adapters/", adapter_test, name="adapter-test"),
path(
"adapter/users/<uuid:pk>/",
adapter_users,
name="adapter-users",
),
]
)
31 changes: 22 additions & 9 deletions backend/adapter_processor/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@
AdapterInstanceSerializer,
AdapterListSerializer,
DefaultAdapterSerializer,
SharedUserListSerializer,
TestAdapterSerializer,
)
from django.db import IntegrityError
from django.db.models import QuerySet
from django.http import HttpRequest
from django.http.response import HttpResponse
from permissions.permission import IsOwner
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
Expand Down Expand Up @@ -95,9 +98,9 @@ def test(self, request: Request) -> Response:
adapter_metadata = serializer.validated_data.get(
AdapterKeys.ADAPTER_METADATA
)
adapter_metadata[AdapterKeys.ADAPTER_TYPE] = (
serializer.validated_data.get(AdapterKeys.ADAPTER_TYPE)
)
adapter_metadata[
AdapterKeys.ADAPTER_TYPE
] = serializer.validated_data.get(AdapterKeys.ADAPTER_TYPE)
try:
test_result = AdapterProcessor.test_adapter(
adapter_id=adapter_id, adapter_metadata=adapter_metadata
Expand All @@ -121,13 +124,11 @@ def get_queryset(self) -> Optional[QuerySet]:
self.request,
constant.ADAPTER_TYPE,
):
queryset = AdapterInstance.objects.filter(
created_by=self.request.user, **filter_args
)
queryset = AdapterInstance.objects.for_user(
self.request.user
).filter(**filter_args)
else:
queryset = AdapterInstance.objects.filter(
created_by=self.request.user
)
queryset = AdapterInstance.objects.for_user(self.request.user)
return queryset

def get_serializer_class(
Expand Down Expand Up @@ -187,3 +188,15 @@ def get_existing_defaults(
)

return existing_adapter_default

@action(detail=True, methods=["get"])
def list_of_shared_users(
self, request: HttpRequest, pk: Any = None
) -> Response:
adapter = (
self.get_object()
) # Assuming you have a get_object method in your viewset

serialized_instances = SharedUserListSerializer(adapter).data

return Response(serialized_instances)
2 changes: 1 addition & 1 deletion platform-service/src/unstract/platform_service/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
PG_V_USERNAME = os.environ.get("PG_V_USERNAME", "user")
PG_V_PASSWORD = os.environ.get("PG_V_PASSWORD", "")
PG_V_DATABASE = os.environ.get("PG_V_DATABASE", "")
ENCRYPTION_KEY = os.environ.get("ENCRYPTION_KEY")
ENCRYPTION_KEY: str = os.environ.get("ENCRYPTION_KEY", "")
if not (REDIS_HOST and REDIS_PORT):
raise ValueError(
"REDIS_HOST and REDIS_PORT must be set in the environment."
Expand Down