Compare commits

...

2 Commits

Author SHA1 Message Date
Weves
efab12a962 Remove migration 2025-04-23 13:17:48 -07:00
Weves
a5234a398b Fix google drive group sync 2025-04-22 08:43:05 -07:00
2 changed files with 71 additions and 42 deletions

View File

@@ -5,8 +5,6 @@ Revises: 6a804aeb4830
Create Date: 2025-04-01 15:07:14.977435
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
@@ -17,34 +15,36 @@ depends_on = None
def upgrade() -> None:
op.alter_column(
"prompt",
"system_prompt",
existing_type=sa.TEXT(),
type_=sa.String(length=8000),
existing_nullable=False,
)
op.alter_column(
"prompt",
"task_prompt",
existing_type=sa.TEXT(),
type_=sa.String(length=8000),
existing_nullable=False,
)
# op.alter_column(
# "prompt",
# "system_prompt",
# existing_type=sa.TEXT(),
# type_=sa.String(length=8000),
# existing_nullable=False,
# )
# op.alter_column(
# "prompt",
# "task_prompt",
# existing_type=sa.TEXT(),
# type_=sa.String(length=8000),
# existing_nullable=False,
# )
pass
def downgrade() -> None:
op.alter_column(
"prompt",
"system_prompt",
existing_type=sa.String(length=8000),
type_=sa.TEXT(),
existing_nullable=False,
)
op.alter_column(
"prompt",
"task_prompt",
existing_type=sa.String(length=8000),
type_=sa.TEXT(),
existing_nullable=False,
)
# op.alter_column(
# "prompt",
# "system_prompt",
# existing_type=sa.String(length=8000),
# type_=sa.TEXT(),
# existing_nullable=False,
# )
# op.alter_column(
# "prompt",
# "task_prompt",
# existing_type=sa.String(length=8000),
# type_=sa.TEXT(),
# existing_nullable=False,
# )
pass

View File

@@ -1,3 +1,5 @@
from googleapiclient.errors import HttpError # type: ignore
from ee.onyx.db.external_perm import ExternalUserGroup
from onyx.connectors.google_drive.connector import GoogleDriveConnector
from onyx.connectors.google_utils.google_utils import execute_paginated_retrieval
@@ -12,6 +14,7 @@ logger = setup_logger()
def _get_drive_members(
google_drive_connector: GoogleDriveConnector,
admin_service: AdminService,
) -> dict[str, tuple[set[str], set[str]]]:
"""
This builds a map of drive ids to their members (group and user emails).
@@ -20,6 +23,8 @@ def _get_drive_members(
"drive_id_2": ({"group_email_3"}, {"user_email_3"}),
}
"""
# fetches shared drives only
drive_ids = google_drive_connector.get_all_drive_ids()
drive_id_to_members_map: dict[str, tuple[set[str], set[str]]] = {}
@@ -28,20 +33,44 @@ def _get_drive_members(
google_drive_connector.primary_admin_email,
)
admin_user_info = (
admin_service.users()
.get(userKey=google_drive_connector.primary_admin_email)
.execute()
)
is_admin = admin_user_info.get("isAdmin", False) or admin_user_info.get(
"isDelegatedAdmin", False
)
for drive_id in drive_ids:
group_emails: set[str] = set()
user_emails: set[str] = set()
for permission in execute_paginated_retrieval(
drive_service.permissions().list,
list_key="permissions",
fileId=drive_id,
fields="permissions(emailAddress, type)",
supportsAllDrives=True,
):
if permission["type"] == "group":
group_emails.add(permission["emailAddress"])
elif permission["type"] == "user":
user_emails.add(permission["emailAddress"])
try:
for permission in execute_paginated_retrieval(
drive_service.permissions().list,
list_key="permissions",
fileId=drive_id,
fields="permissions(emailAddress, type)",
supportsAllDrives=True,
# can only set `useDomainAdminAccess` to true if the user
# is an admin
useDomainAdminAccess=is_admin,
):
if permission["type"] == "group":
group_emails.add(permission["emailAddress"])
elif permission["type"] == "user":
user_emails.add(permission["emailAddress"])
except HttpError as e:
if e.status_code == 404:
logger.warning(
f"Error getting permissions for drive id {drive_id}. "
f"User '{google_drive_connector.primary_admin_email}' likely "
f"does not have access to this drive. Exception: {e}"
)
else:
raise e
drive_id_to_members_map[drive_id] = (group_emails, user_emails)
return drive_id_to_members_map
@@ -132,7 +161,7 @@ def gdrive_group_sync(
)
# Get all drive members
drive_id_to_members_map = _get_drive_members(google_drive_connector)
drive_id_to_members_map = _get_drive_members(google_drive_connector, admin_service)
# Get all group emails
all_group_emails = _get_all_groups(