Files

290 lines
8.3 KiB
Python
Raw Permalink Normal View History

2024-11-14 18:35:14 -08:00
import os
from pathlib import Path
from typing import Optional
import logging
2025-12-02 11:24:23 -05:00
from open_webui.models.users import Users, UserInfoResponse
2024-12-10 00:54:13 -08:00
from open_webui.models.groups import (
2024-11-14 18:35:14 -08:00
Groups,
GroupForm,
2026-02-09 13:28:14 -06:00
GroupInfoResponse,
2024-11-14 18:35:14 -08:00
GroupUpdateForm,
GroupResponse,
UserIdsForm,
2024-11-14 18:35:14 -08:00
)
from open_webui.config import CACHE_DIR
from open_webui.constants import ERROR_MESSAGES
from fastapi import APIRouter, Depends, HTTPException, Request, status
2025-12-29 00:21:18 +04:00
from open_webui.internal.db import get_session
from sqlalchemy.orm import Session
2024-12-08 16:01:56 -08:00
from open_webui.utils.auth import get_admin_user, get_verified_user
log = logging.getLogger(__name__)
2024-11-14 18:35:14 -08:00
router = APIRouter()
############################
# GetFunctions
############################
@router.get("/", response_model=list[GroupResponse])
2025-12-29 00:21:18 +04:00
async def get_groups(
share: Optional[bool] = None,
user=Depends(get_verified_user),
db: Session = Depends(get_session),
):
2025-11-20 19:12:56 -05:00
2025-11-28 22:48:58 -05:00
filter = {}
2026-01-05 05:32:56 +04:00
# Admins can share to all groups regardless of share setting
2025-11-28 22:48:58 -05:00
if user.role != "admin":
filter["member_id"] = user.id
2026-01-05 05:32:56 +04:00
if share is not None:
filter["share"] = share
2025-11-28 22:48:58 -05:00
2025-12-29 00:21:18 +04:00
groups = Groups.get_groups(filter=filter, db=db)
2025-11-28 22:48:58 -05:00
return groups
2024-11-14 18:35:14 -08:00
############################
# CreateNewGroup
############################
@router.post("/create", response_model=Optional[GroupResponse])
2025-12-29 00:21:18 +04:00
async def create_new_group(
form_data: GroupForm,
user=Depends(get_admin_user),
db: Session = Depends(get_session),
):
2024-11-14 18:35:14 -08:00
try:
2025-12-29 00:21:18 +04:00
group = Groups.insert_new_group(user.id, form_data, db=db)
2024-11-14 18:35:14 -08:00
if group:
2025-11-17 05:09:06 -05:00
return GroupResponse(
**group.model_dump(),
2025-12-29 00:21:18 +04:00
member_count=Groups.get_group_member_count_by_id(group.id, db=db),
2025-11-17 05:09:06 -05:00
)
2024-11-14 18:35:14 -08:00
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}")
2024-11-14 18:35:14 -08:00
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e),
)
############################
# GetGroupById
############################
@router.get("/id/{id}", response_model=Optional[GroupResponse])
2025-12-29 00:21:18 +04:00
async def get_group_by_id(
id: str, user=Depends(get_admin_user), db: Session = Depends(get_session)
):
group = Groups.get_group_by_id(id, db=db)
2024-11-14 18:35:14 -08:00
if group:
2025-11-17 05:09:06 -05:00
return GroupResponse(
**group.model_dump(),
2025-12-29 00:21:18 +04:00
member_count=Groups.get_group_member_count_by_id(group.id, db=db),
2025-11-17 05:09:06 -05:00
)
2024-11-14 18:35:14 -08:00
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.NOT_FOUND,
)
2026-02-09 13:28:14 -06:00
@router.get("/id/{id}/info", response_model=Optional[GroupInfoResponse])
async def get_group_info_by_id(
id: str, user=Depends(get_verified_user), db: Session = Depends(get_session)
):
group = Groups.get_group_by_id(id, db=db)
if group:
return GroupInfoResponse(
**group.model_dump(),
member_count=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,
)
2025-11-27 04:44:01 -05:00
############################
# ExportGroupById
############################
class GroupExportResponse(GroupResponse):
user_ids: list[str] = []
pass
@router.get("/id/{id}/export", response_model=Optional[GroupExportResponse])
2025-12-29 00:21:18 +04:00
async def export_group_by_id(
id: str, user=Depends(get_admin_user), db: Session = Depends(get_session)
):
group = Groups.get_group_by_id(id, db=db)
2025-11-27 04:44:01 -05:00
if group:
return GroupExportResponse(
**group.model_dump(),
2025-12-29 00:21:18 +04:00
member_count=Groups.get_group_member_count_by_id(group.id, db=db),
user_ids=Groups.get_group_user_ids_by_id(group.id, db=db),
2025-11-27 04:44:01 -05:00
)
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.NOT_FOUND,
)
2025-12-02 11:24:23 -05:00
############################
# GetUsersInGroupById
############################
@router.post("/id/{id}/users", response_model=list[UserInfoResponse])
2025-12-29 00:21:18 +04:00
async def get_users_in_group(
id: str, user=Depends(get_admin_user), db: Session = Depends(get_session)
):
2025-12-02 11:24:23 -05:00
try:
2025-12-29 00:21:18 +04:00
users = Users.get_users_by_group_id(id, db=db)
2025-12-02 11:24:23 -05:00
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),
)
2024-11-14 18:35:14 -08:00
############################
# UpdateGroupById
############################
@router.post("/id/{id}/update", response_model=Optional[GroupResponse])
async def update_group_by_id(
2025-12-29 00:21:18 +04:00
id: str,
form_data: GroupUpdateForm,
user=Depends(get_admin_user),
db: Session = Depends(get_session),
2024-11-14 18:35:14 -08:00
):
try:
2025-12-29 00:21:18 +04:00
group = Groups.update_group_by_id(id, form_data, db=db)
2024-11-14 18:35:14 -08:00
if group:
2025-11-17 05:09:06 -05:00
return GroupResponse(
**group.model_dump(),
2025-12-29 00:21:18 +04:00
member_count=Groups.get_group_member_count_by_id(group.id, db=db),
2025-11-17 05:09:06 -05:00
)
2024-11-14 18:35:14 -08:00
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}")
2024-11-14 18:35:14 -08:00
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e),
)
############################
# AddUserToGroupByUserIdAndGroupId
############################
@router.post("/id/{id}/users/add", response_model=Optional[GroupResponse])
async def add_user_to_group(
2025-12-29 00:21:18 +04:00
id: str,
form_data: UserIdsForm,
user=Depends(get_admin_user),
db: Session = Depends(get_session),
):
try:
if form_data.user_ids:
2025-12-29 00:21:18 +04:00
form_data.user_ids = Users.get_valid_user_ids(form_data.user_ids, db=db)
2025-12-29 00:21:18 +04:00
group = Groups.add_users_to_group(id, form_data.user_ids, db=db)
if group:
2025-11-17 05:09:06 -05:00
return GroupResponse(
**group.model_dump(),
2025-12-29 00:21:18 +04:00
member_count=Groups.get_group_member_count_by_id(group.id, db=db),
2025-11-17 05:09:06 -05:00
)
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),
)
@router.post("/id/{id}/users/remove", response_model=Optional[GroupResponse])
async def remove_users_from_group(
2025-12-29 00:21:18 +04:00
id: str,
form_data: UserIdsForm,
user=Depends(get_admin_user),
db: Session = Depends(get_session),
):
try:
2025-12-29 00:21:18 +04:00
group = Groups.remove_users_from_group(id, form_data.user_ids, db=db)
if group:
2025-11-17 05:09:06 -05:00
return GroupResponse(
**group.model_dump(),
2025-12-29 00:21:18 +04:00
member_count=Groups.get_group_member_count_by_id(group.id, db=db),
2025-11-17 05:09:06 -05:00
)
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),
)
2024-11-14 18:35:14 -08:00
############################
# DeleteGroupById
############################
@router.delete("/id/{id}/delete", response_model=bool)
2025-12-29 00:21:18 +04:00
async def delete_group_by_id(
id: str, user=Depends(get_admin_user), db: Session = Depends(get_session)
):
2024-11-14 18:35:14 -08:00
try:
2025-12-29 00:21:18 +04:00
result = Groups.delete_group_by_id(id, db=db)
2024-11-14 18:35:14 -08:00
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}")
2024-11-14 18:35:14 -08:00
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=ERROR_MESSAGES.DEFAULT(e),
)