(session: SessionDep, data: str = Form(), files: List[UploadFile] = [])
| 113 | @router.patch('/ui', summary=f"{PLACEHOLDER_PREFIX}assistant_ui_api", description=f"{PLACEHOLDER_PREFIX}assistant_ui_api") |
| 114 | @system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.APPLICATION, result_id_expr="id")) |
| 115 | async def ui(session: SessionDep, data: str = Form(), files: List[UploadFile] = []): |
| 116 | json_data = json.loads(data) |
| 117 | uiSchema = AssistantUiSchema(**json_data) |
| 118 | id = uiSchema.id |
| 119 | db_model = session.get(AssistantModel, id) |
| 120 | if not db_model: |
| 121 | raise ValueError(f"AssistantModel with id {id} not found") |
| 122 | configuration = db_model.configuration |
| 123 | config_obj = json.loads(configuration) if configuration else {} |
| 124 | |
| 125 | ui_schema_dict = uiSchema.model_dump(exclude_none=True, exclude_unset=True) |
| 126 | if files: |
| 127 | for file in files: |
| 128 | origin_file_name = file.filename |
| 129 | file_name, flag_name = SQLBotFileUtils.split_filename_and_flag(origin_file_name) |
| 130 | file.filename = file_name |
| 131 | if flag_name == 'logo' or flag_name == 'float_icon': |
| 132 | try: |
| 133 | SQLBotFileUtils.check_file(file=file, file_types=[".jpg", ".jpeg", ".png"], |
| 134 | limit_file_size=(10 * 1024 * 1024)) |
| 135 | except ValueError as e: |
| 136 | error_msg = str(e) |
| 137 | if '文件大小超过限制' in error_msg: |
| 138 | raise ValueError(f"文件大小超过限制(最大 10 M)") |
| 139 | else: |
| 140 | raise e |
| 141 | if config_obj.get(flag_name): |
| 142 | SQLBotFileUtils.delete_file(config_obj.get(flag_name)) |
| 143 | file_id = await SQLBotFileUtils.upload(file) |
| 144 | ui_schema_dict[flag_name] = file_id |
| 145 | else: |
| 146 | raise ValueError(f"Unsupported file flag: {flag_name}") |
| 147 | |
| 148 | for flag_name in ['logo', 'float_icon']: |
| 149 | file_val = config_obj.get(flag_name) |
| 150 | if file_val and not ui_schema_dict.get(flag_name): |
| 151 | config_obj[flag_name] = None |
| 152 | SQLBotFileUtils.delete_file(file_val) |
| 153 | |
| 154 | for attr, value in ui_schema_dict.items(): |
| 155 | if attr != 'id' and not attr.startswith("__"): |
| 156 | config_obj[attr] = value |
| 157 | |
| 158 | db_model.configuration = json.dumps(config_obj, ensure_ascii=False) |
| 159 | session.add(db_model) |
| 160 | session.commit() |
| 161 | await clear_ui_cache(db_model.id) |
| 162 | return db_model |
| 163 | |
| 164 | |
| 165 | @clear_cache(namespace=CacheNamespace.EMBEDDED_INFO, cacheName=CacheName.ASSISTANT_INFO, keyExpression="id") |
nothing calls this directly
no test coverage detected