mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-09-19 12:03:54 +02:00
Whitelableing for Logo / Name via Admin panel
This commit is contained in:
@@ -19,6 +19,12 @@ from danswer.utils.variable_functionality import global_version
|
||||
from ee.danswer.configs.app_configs import OPENID_CONFIG_URL
|
||||
from ee.danswer.server.analytics.api import router as analytics_router
|
||||
from ee.danswer.server.api_key.api import router as api_key_router
|
||||
from ee.danswer.server.enterprise_settings.api import (
|
||||
admin_router as enterprise_settings_admin_router,
|
||||
)
|
||||
from ee.danswer.server.enterprise_settings.api import (
|
||||
basic_router as enterprise_settings_router,
|
||||
)
|
||||
from ee.danswer.server.query_and_chat.chat_backend import (
|
||||
router as chat_router,
|
||||
)
|
||||
@@ -74,6 +80,11 @@ def get_ee_application() -> FastAPI:
|
||||
# EE only backend APIs
|
||||
include_router_with_global_prefix_prepended(application, query_router)
|
||||
include_router_with_global_prefix_prepended(application, chat_router)
|
||||
# Enterprise-only global settings
|
||||
include_router_with_global_prefix_prepended(
|
||||
application, enterprise_settings_admin_router
|
||||
)
|
||||
include_router_with_global_prefix_prepended(application, enterprise_settings_router)
|
||||
return application
|
||||
|
||||
|
||||
|
65
backend/ee/danswer/server/enterprise_settings/api.py
Normal file
65
backend/ee/danswer/server/enterprise_settings/api.py
Normal file
@@ -0,0 +1,65 @@
|
||||
from fastapi import APIRouter
|
||||
from fastapi import Depends
|
||||
from fastapi import HTTPException
|
||||
from fastapi import UploadFile
|
||||
from fastapi.responses import StreamingResponse
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from danswer.auth.users import current_admin_user
|
||||
from danswer.db.engine import get_session
|
||||
from danswer.db.file_store import get_default_file_store
|
||||
from danswer.db.models import User
|
||||
from ee.danswer.server.enterprise_settings.models import EnterpriseSettings
|
||||
from ee.danswer.server.enterprise_settings.store import load_settings
|
||||
from ee.danswer.server.enterprise_settings.store import store_settings
|
||||
|
||||
|
||||
admin_router = APIRouter(prefix="/admin/enterprise-settings")
|
||||
basic_router = APIRouter(prefix="/enterprise-settings")
|
||||
|
||||
|
||||
@admin_router.put("")
|
||||
def put_settings(
|
||||
settings: EnterpriseSettings, _: User | None = Depends(current_admin_user)
|
||||
) -> None:
|
||||
try:
|
||||
settings.check_validity()
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
store_settings(settings)
|
||||
|
||||
|
||||
@basic_router.get("")
|
||||
def fetch_settings() -> EnterpriseSettings:
|
||||
return load_settings()
|
||||
|
||||
|
||||
_LOGO_FILENAME = "__logo__"
|
||||
|
||||
|
||||
@admin_router.put("/logo")
|
||||
def upload_logo(
|
||||
file: UploadFile,
|
||||
db_session: Session = Depends(get_session),
|
||||
_: User | None = Depends(current_admin_user),
|
||||
) -> None:
|
||||
if (
|
||||
not file.filename.endswith(".png")
|
||||
and not file.filename.endswith(".jpg")
|
||||
and not file.filename.endswith(".jpeg")
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Invalid file type - only .png, .jpg, and .jpeg files are allowed",
|
||||
)
|
||||
|
||||
# Save the file to the server
|
||||
file_store = get_default_file_store(db_session)
|
||||
file_store.save_file(_LOGO_FILENAME, file.file)
|
||||
|
||||
|
||||
@basic_router.get("/logo")
|
||||
def fetch_logo(db_session: Session = Depends(get_session)) -> StreamingResponse:
|
||||
file_store = get_default_file_store(db_session)
|
||||
file_io = file_store.read_file(_LOGO_FILENAME, mode="b")
|
||||
return StreamingResponse(content=file_io, media_type="image/jpeg")
|
13
backend/ee/danswer/server/enterprise_settings/models.py
Normal file
13
backend/ee/danswer/server/enterprise_settings/models.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class EnterpriseSettings(BaseModel):
|
||||
"""General settings that only apply to the Enterprise Edition of Danswer
|
||||
|
||||
NOTE: don't put anything sensitive in here, as this is accessible without auth."""
|
||||
|
||||
application_name: str | None = None
|
||||
use_custom_logo: bool = False
|
||||
|
||||
def check_validity(self) -> None:
|
||||
return
|
25
backend/ee/danswer/server/enterprise_settings/store.py
Normal file
25
backend/ee/danswer/server/enterprise_settings/store.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from typing import cast
|
||||
|
||||
from danswer.dynamic_configs.factory import get_dynamic_config_store
|
||||
from danswer.dynamic_configs.interface import ConfigNotFoundError
|
||||
from ee.danswer.server.enterprise_settings.models import EnterpriseSettings
|
||||
|
||||
|
||||
_ENTERPRISE_SETTINGS_KEY = "danswer_enterprise_settings"
|
||||
|
||||
|
||||
def load_settings() -> EnterpriseSettings:
|
||||
dynamic_config_store = get_dynamic_config_store()
|
||||
try:
|
||||
settings = EnterpriseSettings(
|
||||
**cast(dict, dynamic_config_store.load(_ENTERPRISE_SETTINGS_KEY))
|
||||
)
|
||||
except ConfigNotFoundError:
|
||||
settings = EnterpriseSettings()
|
||||
dynamic_config_store.store(_ENTERPRISE_SETTINGS_KEY, settings.dict())
|
||||
|
||||
return settings
|
||||
|
||||
|
||||
def store_settings(settings: EnterpriseSettings) -> None:
|
||||
get_dynamic_config_store().store(_ENTERPRISE_SETTINGS_KEY, settings.dict())
|
Reference in New Issue
Block a user