(
self,
preset_id: Optional[str],
name: str,
filters: dict[str, Any],
)
| 281 | } |
| 282 | |
| 283 | async def save_file_view_preset( |
| 284 | self, |
| 285 | preset_id: Optional[str], |
| 286 | name: str, |
| 287 | filters: dict[str, Any], |
| 288 | ) -> dict[str, Any]: |
| 289 | presets = await self._get_file_view_presets() |
| 290 | normalized_name = self._normalize_file_view_preset_name(name) |
| 291 | normalized_filters = self._normalize_file_view_preset_filters(filters) |
| 292 | now = await get_now() |
| 293 | updated_at = now.isoformat() |
| 294 | |
| 295 | target_index = next( |
| 296 | (index for index, preset in enumerate(presets) if preset["id"] == preset_id), |
| 297 | -1, |
| 298 | ) |
| 299 | is_update = target_index >= 0 |
| 300 | if is_update: |
| 301 | preset = presets[target_index] |
| 302 | next_preset = { |
| 303 | **preset, |
| 304 | "name": normalized_name, |
| 305 | "filters": normalized_filters, |
| 306 | "params": normalized_filters, |
| 307 | "updatedAt": updated_at, |
| 308 | "updated_at": updated_at, |
| 309 | } |
| 310 | presets[target_index] = next_preset |
| 311 | else: |
| 312 | if len(presets) >= self.MAX_VIEW_PRESETS: |
| 313 | raise HTTPException(status_code=400, detail="视图预设数量已达上限") |
| 314 | next_preset = { |
| 315 | "id": preset_id or self._build_file_view_preset_id(normalized_name, now), |
| 316 | "name": normalized_name, |
| 317 | "filters": normalized_filters, |
| 318 | "params": normalized_filters, |
| 319 | "createdAt": updated_at, |
| 320 | "created_at": updated_at, |
| 321 | "updatedAt": updated_at, |
| 322 | "updated_at": updated_at, |
| 323 | } |
| 324 | presets.append(next_preset) |
| 325 | |
| 326 | await self._save_file_view_presets(presets) |
| 327 | await self.record_admin_activity( |
| 328 | action="file.view_preset_update" if is_update else "file.view_preset_create", |
| 329 | target_type="view_preset", |
| 330 | target_id=next_preset["id"], |
| 331 | target_name=next_preset["name"], |
| 332 | count=1, |
| 333 | meta={"filters": normalized_filters}, |
| 334 | ) |
| 335 | return next_preset |
| 336 | |
| 337 | async def delete_file_view_preset(self, preset_id: str) -> dict[str, Any]: |
| 338 | preset_id = str(preset_id).strip() |
no test coverage detected