Spaces:
Build error
Build error
| import os | |
| from pathlib import Path | |
| from typing import Optional | |
| import logging | |
| from open_webui.models.users import Users, UserInfoResponse | |
| from open_webui.models.groups import ( | |
| Groups, | |
| GroupForm, | |
| GroupInfoResponse, | |
| GroupUpdateForm, | |
| GroupResponse, | |
| UserIdsForm, | |
| ) | |
| from open_webui.config import CACHE_DIR | |
| from open_webui.constants import ERROR_MESSAGES | |
| from fastapi import APIRouter, Depends, HTTPException, Request, status | |
| from open_webui.internal.db import get_async_session | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from open_webui.utils.auth import get_admin_user, get_verified_user | |
| log = logging.getLogger(__name__) | |
| router = APIRouter() | |
| ############################ | |
| # GetFunctions | |
| ############################ | |
| async def get_groups( | |
| share: Optional[bool] = None, | |
| user=Depends(get_verified_user), | |
| db: AsyncSession = Depends(get_async_session), | |
| ): | |
| filter = {} | |
| # Admins can share to all groups regardless of share setting | |
| if user.role != 'admin': | |
| filter['member_id'] = user.id | |
| if share is not None: | |
| filter['share'] = share | |
| groups = await Groups.get_groups(filter=filter, db=db) | |
| return groups | |
| ############################ | |
| # CreateNewGroup | |
| ############################ | |
| async def create_new_group( | |
| form_data: GroupForm, | |
| user=Depends(get_admin_user), | |
| db: AsyncSession = Depends(get_async_session), | |
| ): | |
| try: | |
| group = await Groups.insert_new_group(user.id, form_data, db=db) | |
| if group: | |
| return GroupResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT('Error creating group'), | |
| ) | |
| except Exception as e: | |
| log.exception(f'Error creating a new group: {e}') | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT(e), | |
| ) | |
| ############################ | |
| # GetGroupById | |
| ############################ | |
| async def get_group_by_id(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): | |
| group = await Groups.get_group_by_id(id, db=db) | |
| if group: | |
| return GroupResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| detail=ERROR_MESSAGES.NOT_FOUND, | |
| ) | |
| async def get_group_info_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): | |
| group = await Groups.get_group_by_id(id, db=db) | |
| if group: | |
| return GroupInfoResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| detail=ERROR_MESSAGES.NOT_FOUND, | |
| ) | |
| ############################ | |
| # ExportGroupById | |
| ############################ | |
| class GroupExportResponse(GroupResponse): | |
| user_ids: list[str] = [] | |
| pass | |
| async def export_group_by_id(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): | |
| group = await Groups.get_group_by_id(id, db=db) | |
| if group: | |
| return GroupExportResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| user_ids=await Groups.get_group_user_ids_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| detail=ERROR_MESSAGES.NOT_FOUND, | |
| ) | |
| ############################ | |
| # GetUsersInGroupById | |
| ############################ | |
| async def get_users_in_group(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): | |
| try: | |
| users = await Users.get_users_by_group_id(id, db=db) | |
| return users | |
| except Exception as e: | |
| log.exception(f'Error adding users to group {id}: {e}') | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT(e), | |
| ) | |
| ############################ | |
| # UpdateGroupById | |
| ############################ | |
| async def update_group_by_id( | |
| id: str, | |
| form_data: GroupUpdateForm, | |
| user=Depends(get_admin_user), | |
| db: AsyncSession = Depends(get_async_session), | |
| ): | |
| try: | |
| group = await Groups.update_group_by_id(id, form_data, db=db) | |
| if group: | |
| return GroupResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT('Error updating group'), | |
| ) | |
| except Exception as e: | |
| log.exception(f'Error updating group {id}: {e}') | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT(e), | |
| ) | |
| ############################ | |
| # AddUserToGroupByUserIdAndGroupId | |
| ############################ | |
| async def add_user_to_group( | |
| id: str, | |
| form_data: UserIdsForm, | |
| user=Depends(get_admin_user), | |
| db: AsyncSession = Depends(get_async_session), | |
| ): | |
| try: | |
| if form_data.user_ids: | |
| form_data.user_ids = await Users.get_valid_user_ids(form_data.user_ids, db=db) | |
| group = await Groups.add_users_to_group(id, form_data.user_ids, db=db) | |
| if group: | |
| return GroupResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT('Error adding users to group'), | |
| ) | |
| except Exception as e: | |
| log.exception(f'Error adding users to group {id}: {e}') | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT(e), | |
| ) | |
| async def remove_users_from_group( | |
| id: str, | |
| form_data: UserIdsForm, | |
| user=Depends(get_admin_user), | |
| db: AsyncSession = Depends(get_async_session), | |
| ): | |
| try: | |
| group = await Groups.remove_users_from_group(id, form_data.user_ids, db=db) | |
| if group: | |
| return GroupResponse( | |
| **group.model_dump(), | |
| member_count=await Groups.get_group_member_count_by_id(group.id, db=db), | |
| ) | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT('Error removing users from group'), | |
| ) | |
| except Exception as e: | |
| log.exception(f'Error removing users from group {id}: {e}') | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT(e), | |
| ) | |
| ############################ | |
| # DeleteGroupById | |
| ############################ | |
| async def delete_group_by_id(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): | |
| try: | |
| result = await Groups.delete_group_by_id(id, db=db) | |
| if result: | |
| return result | |
| else: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT('Error deleting group'), | |
| ) | |
| except Exception as e: | |
| log.exception(f'Error deleting group {id}: {e}') | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=ERROR_MESSAGES.DEFAULT(e), | |
| ) | |