|
@@ -0,0 +1,169 @@
|
|
|
+import json
|
|
|
+import logging
|
|
|
+import time
|
|
|
+from typing import Optional
|
|
|
+import uuid
|
|
|
+
|
|
|
+from open_webui.apps.webui.internal.db import Base, get_db
|
|
|
+from open_webui.env import SRC_LOG_LEVELS
|
|
|
+
|
|
|
+from open_webui.apps.webui.models.files import FileMetadataResponse
|
|
|
+
|
|
|
+
|
|
|
+from pydantic import BaseModel, ConfigDict
|
|
|
+from sqlalchemy import BigInteger, Column, String, Text, JSON
|
|
|
+
|
|
|
+
|
|
|
+log = logging.getLogger(__name__)
|
|
|
+log.setLevel(SRC_LOG_LEVELS["MODELS"])
|
|
|
+
|
|
|
+####################
|
|
|
+# UserGroup DB Schema
|
|
|
+####################
|
|
|
+
|
|
|
+
|
|
|
+class Group(Base):
|
|
|
+ __tablename__ = "group"
|
|
|
+
|
|
|
+ id = Column(Text, unique=True, primary_key=True)
|
|
|
+ user_id = Column(Text)
|
|
|
+
|
|
|
+ name = Column(Text)
|
|
|
+ description = Column(Text)
|
|
|
+ meta = Column(JSON, nullable=True)
|
|
|
+
|
|
|
+ permissions = Column(JSON, nullable=True)
|
|
|
+ user_ids = Column(JSON, nullable=True)
|
|
|
+ admin_ids = Column(JSON, nullable=True)
|
|
|
+
|
|
|
+ created_at = Column(BigInteger)
|
|
|
+ updated_at = Column(BigInteger)
|
|
|
+
|
|
|
+
|
|
|
+class GroupModel(BaseModel):
|
|
|
+ model_config = ConfigDict(from_attributes=True)
|
|
|
+ id: str
|
|
|
+ user_id: str
|
|
|
+
|
|
|
+ name: str
|
|
|
+ description: str
|
|
|
+ meta: Optional[dict] = None
|
|
|
+
|
|
|
+ permissions: Optional[dict] = None
|
|
|
+ user_ids: list[str] = []
|
|
|
+ admin_ids: list[str] = []
|
|
|
+
|
|
|
+ created_at: int # timestamp in epoch
|
|
|
+ updated_at: int # timestamp in epoch
|
|
|
+
|
|
|
+
|
|
|
+####################
|
|
|
+# Forms
|
|
|
+####################
|
|
|
+
|
|
|
+
|
|
|
+class GroupResponse(BaseModel):
|
|
|
+ id: str
|
|
|
+ user_id: str
|
|
|
+ name: str
|
|
|
+ description: str
|
|
|
+ permissions: Optional[dict] = None
|
|
|
+ meta: Optional[dict] = None
|
|
|
+ user_ids: list[str] = []
|
|
|
+ admin_ids: list[str] = []
|
|
|
+ created_at: int # timestamp in epoch
|
|
|
+ updated_at: int # timestamp in epoch
|
|
|
+
|
|
|
+
|
|
|
+class GroupForm(BaseModel):
|
|
|
+ name: str
|
|
|
+ description: str
|
|
|
+
|
|
|
+
|
|
|
+class GroupUpdateForm(GroupForm):
|
|
|
+ permissions: Optional[dict] = None
|
|
|
+ user_ids: Optional[list[str]] = None
|
|
|
+ admin_ids: Optional[list[str]] = None
|
|
|
+
|
|
|
+
|
|
|
+class GroupTable:
|
|
|
+ def insert_new_group(
|
|
|
+ self, user_id: str, form_data: GroupForm
|
|
|
+ ) -> Optional[GroupModel]:
|
|
|
+ with get_db() as db:
|
|
|
+ group = GroupModel(
|
|
|
+ **{
|
|
|
+ **form_data.model_dump(),
|
|
|
+ "id": str(uuid.uuid4()),
|
|
|
+ "user_id": user_id,
|
|
|
+ "created_at": int(time.time()),
|
|
|
+ "updated_at": int(time.time()),
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ try:
|
|
|
+ result = Groups(**group.model_dump())
|
|
|
+ db.add(result)
|
|
|
+ db.commit()
|
|
|
+ db.refresh(result)
|
|
|
+ if result:
|
|
|
+ return GroupModel.model_validate(result)
|
|
|
+ else:
|
|
|
+ return None
|
|
|
+
|
|
|
+ except Exception:
|
|
|
+ return None
|
|
|
+
|
|
|
+ def get_groups(self) -> list[GroupModel]:
|
|
|
+ with get_db() as db:
|
|
|
+ return [
|
|
|
+ GroupModel.model_validate(group)
|
|
|
+ for group in db.query(Groups).order_by(Groups.updated_at.desc()).all()
|
|
|
+ ]
|
|
|
+
|
|
|
+ def get_group_by_id(self, id: str) -> Optional[GroupModel]:
|
|
|
+ try:
|
|
|
+ with get_db() as db:
|
|
|
+ group = db.query(Groups).filter_by(id=id).first()
|
|
|
+ return GroupModel.model_validate(group) if group else None
|
|
|
+ except Exception:
|
|
|
+ return None
|
|
|
+
|
|
|
+ def update_group_by_id(
|
|
|
+ self, id: str, form_data: GroupUpdateForm, overwrite: bool = False
|
|
|
+ ) -> Optional[GroupModel]:
|
|
|
+ try:
|
|
|
+ with get_db() as db:
|
|
|
+ db.query(Groups).filter_by(id=id).update(
|
|
|
+ {
|
|
|
+ **form_data.model_dump(exclude_none=True),
|
|
|
+ "updated_at": int(time.time()),
|
|
|
+ }
|
|
|
+ )
|
|
|
+ db.commit()
|
|
|
+ return self.get_group_by_id(id=id)
|
|
|
+ except Exception as e:
|
|
|
+ log.exception(e)
|
|
|
+ return None
|
|
|
+
|
|
|
+ def delete_group_by_id(self, id: str) -> bool:
|
|
|
+ try:
|
|
|
+ with get_db() as db:
|
|
|
+ db.query(Groups).filter_by(id=id).delete()
|
|
|
+ db.commit()
|
|
|
+ return True
|
|
|
+ except Exception:
|
|
|
+ return False
|
|
|
+
|
|
|
+ def delete_all_groups(self) -> bool:
|
|
|
+ with get_db() as db:
|
|
|
+ try:
|
|
|
+ db.query(Groups).delete()
|
|
|
+ db.commit()
|
|
|
+
|
|
|
+ return True
|
|
|
+ except Exception:
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
+Groups = GroupTable()
|