Skip to content
Merged
Show file tree
Hide file tree
Changes from 28 commits
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
85 changes: 41 additions & 44 deletions backend/adapter_processor/adapter_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import logging
from typing import Any, Optional

import adapter_processor
from account.models import User
from adapter_processor.constants import AdapterKeys
from adapter_processor.exceptions import (
Expand All @@ -21,7 +20,7 @@
from unstract.adapters.exceptions import AdapterError
from unstract.adapters.x2text.constants import X2TextConstants

from .models import AdapterInstance
from .models import AdapterInstance, UserDefaultAdapter

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -131,47 +130,34 @@ def __fetch_adapters_by_key_value(key: str, value: Any) -> Adapter:

@staticmethod
def set_default_triad(default_triad: dict[str, str], user: User) -> None:
filter_params: dict[str, Any] = {}

try:
for key in default_triad:
filter_params.clear()
adapter_id = default_triad[key]
# Query rows where adapter_type=X and is_default=True
if key == AdapterKeys.LLM_DEFAULT:
adapter_type = AdapterTypes.LLM.name
elif key == AdapterKeys.EMBEDDING_DEFAULT:
adapter_type = AdapterTypes.EMBEDDING.name
elif key == AdapterKeys.VECTOR_DB_DEFAULT:
adapter_type = AdapterTypes.VECTOR_DB.name
elif key == AdapterKeys.X2TEXT_DEFAULT:
adapter_type = AdapterTypes.X2TEXT.name

filter_params["adapter_type"] = adapter_type
filter_params["is_default"] = True
filter_params["created_by"] = user

AdapterInstance.objects.filter(**filter_params).update(
is_default=False
)
(
user_default_adapter,
created,
) = UserDefaultAdapter.objects.get_or_create(user=user)

# Update the adapter_id in the incoming
# list to set is_default=True
filter_params.clear()
try:
new_adapter_default: AdapterInstance = (
AdapterInstance.objects.get(pk=adapter_id)
if default_triad.get(AdapterKeys.LLM_DEFAULT, None):
user_default_adapter.default_llm_adapter = (
AdapterInstance.objects.get(
pk=default_triad[AdapterKeys.LLM_DEFAULT]
)
new_adapter_default.is_default = True
new_adapter_default.save()
except (
adapter_processor.models.AdapterInstance.DoesNotExist
) as e:
logger.error(
f"Error while retrieving adapter: {adapter_id} "
f"reason: {e}"
)
if default_triad.get(AdapterKeys.EMBEDDING_DEFAULT, None):
user_default_adapter.default_embedding_adapter = (
AdapterInstance.objects.get(
pk=default_triad[AdapterKeys.EMBEDDING_DEFAULT]
)
raise InValidAdapterId()
)

if default_triad.get(AdapterKeys.VECTOR_DB_DEFAULT, None):
user_default_adapter.default_vector_db_adapter = (
AdapterInstance.objects.get(
pk=default_triad[AdapterKeys.VECTOR_DB_DEFAULT]
)
)

user_default_adapter.save()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@johnyrahul don't we need to handle this for X2Text / OCR as well?


logger.info("Changed defaults successfully")
except Exception as e:
logger.error(f"Unable to save defaults because: {e}")
Expand Down Expand Up @@ -209,13 +195,17 @@ def get_adapters_by_type(

Parameters:
- adapter_type (AdapterTypes): The type of adapters to retrieve.
- user: Logged in User

Returns:
- list[AdapterInstance]: A list of AdapterInstance objects that match
the specified adapter type.
"""
adapters: list[AdapterInstance] = AdapterInstance.objects.filter(
adapter_type=adapter_type.value, created_by=user

adapters: list[AdapterInstance] = AdapterInstance.objects.for_user(
user
).filter(
adapter_type=adapter_type.value,
)
return adapters

Expand Down Expand Up @@ -260,9 +250,16 @@ def get_default_adapters(user: User) -> list[AdapterInstance]:
marked as default.
"""
try:
adapters: list[AdapterInstance] = AdapterInstance.objects.filter(
is_default=True, created_by=user
)
adapters: list[AdapterInstance] = []
default_adapter = UserDefaultAdapter.objects.get(user=user)

if default_adapter.default_embedding_adapter:
adapters.append(default_adapter.default_embedding_adapter)
if default_adapter.default_llm_adapter:
adapters.append(default_adapter.default_llm_adapter)
if default_adapter.default_vector_db_adapter:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@johnyrahul need to handle similarly for x2text also

adapters.append(default_adapter.default_vector_db_adapter)

return adapters
except ObjectDoesNotExist as e:
logger.error(f"No default adapters found: {e}")
Expand Down
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
),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Generated by Django 4.2.1 on 2024-03-14 11:37

import django.db.models.deletion
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", "0006_adapterinstance_shared_users"),
]

operations = [
migrations.RemoveField(
model_name="adapterinstance",
name="is_default",
),
migrations.CreateModel(
name="UserDefaultAdapter",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("modified_at", models.DateTimeField(auto_now=True)),
(
"default_embedding_adapter",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="default_embedding_adapter",
to="adapter_processor.adapterinstance",
),
),
(
"default_llm_adapter",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="default_llm_adapter",
to="adapter_processor.adapterinstance",
),
),
(
"default_vector_db_adapter",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="default_vector_db_adapter",
to="adapter_processor.adapterinstance",
),
),
(
"default_x2text_adapter",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="default_x2text_adapter",
to="adapter_processor.adapterinstance",
),
),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
]
51 changes: 47 additions & 4 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,18 @@
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))
.distinct("id")
)


class AdapterInstance(BaseModel):
id = models.UUIDField(
primary_key=True,
Expand Down Expand Up @@ -61,10 +75,10 @@ class AdapterInstance(BaseModel):
default=False,
db_comment="Is the adapter instance currently being used",
)
is_default = models.BooleanField(
default=False,
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"
Expand All @@ -76,3 +90,32 @@ class Meta:
name="unique_adapter",
),
]


class UserDefaultAdapter(BaseModel):
user = models.OneToOneField(User, on_delete=models.CASCADE)
default_llm_adapter = models.ForeignKey(
AdapterInstance,
on_delete=models.SET_NULL,
null=True,
related_name="default_llm_adapter",
)
default_embedding_adapter = models.ForeignKey(
AdapterInstance,
on_delete=models.SET_NULL,
null=True,
related_name="default_embedding_adapter",
)
default_vector_db_adapter = models.ForeignKey(
AdapterInstance,
on_delete=models.SET_NULL,
null=True,
related_name="default_vector_db_adapter",
)

default_x2text_adapter = models.ForeignKey(
AdapterInstance,
on_delete=models.SET_NULL,
null=True,
related_name="default_x2text_adapter",
)
Loading