mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-03-05 09:17:37 +08:00
Some checks are pending
Python Linting / Run Ruff (push) Waiting to run
Python Linting / Run Pylint (push) Waiting to run
Build package / Build Test (3.10) (push) Waiting to run
Build package / Build Test (3.11) (push) Waiting to run
Build package / Build Test (3.12) (push) Waiting to run
Build package / Build Test (3.13) (push) Waiting to run
Build package / Build Test (3.14) (push) Waiting to run
- Reject path separators (/, \, os.sep) in tag components for defense-in-depth - Add comment explaining double-relpath normalization trick - Add _require_assets_feature_enabled decorator returning 503 when disabled - Call asset_seeder.disable() when --enable-assets is not passed - Add iter_chunks to bulk_update_needs_verify, bulk_update_is_missing, and delete_references_by_ids to respect SQLite bind param limits - Fix CacheStateRow.size_bytes NULL coercion (0 -> None) to avoid false needs_verify flags on assets with unknown size - Add PermissionError catch in delete_asset_tags route (403 vs 500) - Add hash-is-None guard in delete_orphaned_seed_asset - Validate from_asset_id in reassign_asset_references - Initialize _prune_first in __init__, remove getattr workaround - Cap error accumulation in _add_error to 200 - Remove confirmed dead code: seed_assets, compute_filename_for_asset, ALLOWED_ROOTS, AssetNotFoundError, SetTagsResult, update_enrichment_level, Asset.to_dict, AssetReference.to_dict, _AssetSeeder.enable Amp-Thread-ID: https://ampcode.com/threads/T-019cb610-1b55-74b6-8dbb-381d73c387c0 Co-authored-by: Amp <amp@ampcode.com>
124 lines
2.4 KiB
Python
124 lines
2.4 KiB
Python
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from typing import Any, NamedTuple
|
|
|
|
from app.assets.database.models import Asset, AssetReference
|
|
|
|
UserMetadata = dict[str, Any] | None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class AssetData:
|
|
hash: str | None
|
|
size_bytes: int | None
|
|
mime_type: str | None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ReferenceData:
|
|
"""Data transfer object for AssetReference."""
|
|
|
|
id: str
|
|
name: str
|
|
file_path: str | None
|
|
user_metadata: UserMetadata
|
|
preview_id: str | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
last_access_time: datetime | None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class AssetDetailResult:
|
|
ref: ReferenceData
|
|
asset: AssetData | None
|
|
tags: list[str]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RegisterAssetResult:
|
|
ref: ReferenceData
|
|
asset: AssetData
|
|
tags: list[str]
|
|
created: bool
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class IngestResult:
|
|
asset_created: bool
|
|
asset_updated: bool
|
|
ref_created: bool
|
|
ref_updated: bool
|
|
reference_id: str | None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class AddTagsResult:
|
|
added: list[str]
|
|
already_present: list[str]
|
|
total_tags: list[str]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RemoveTagsResult:
|
|
removed: list[str]
|
|
not_present: list[str]
|
|
total_tags: list[str]
|
|
|
|
|
|
class TagUsage(NamedTuple):
|
|
name: str
|
|
tag_type: str
|
|
count: int
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class AssetSummaryData:
|
|
ref: ReferenceData
|
|
asset: AssetData | None
|
|
tags: list[str]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class ListAssetsResult:
|
|
items: list[AssetSummaryData]
|
|
total: int
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class DownloadResolutionResult:
|
|
abs_path: str
|
|
content_type: str
|
|
download_name: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class UploadResult:
|
|
ref: ReferenceData
|
|
asset: AssetData
|
|
tags: list[str]
|
|
created_new: bool
|
|
|
|
|
|
def extract_reference_data(ref: AssetReference) -> ReferenceData:
|
|
return ReferenceData(
|
|
id=ref.id,
|
|
name=ref.name,
|
|
file_path=ref.file_path,
|
|
user_metadata=ref.user_metadata,
|
|
preview_id=ref.preview_id,
|
|
created_at=ref.created_at,
|
|
updated_at=ref.updated_at,
|
|
last_access_time=ref.last_access_time,
|
|
)
|
|
|
|
|
|
def extract_asset_data(asset: Asset | None) -> AssetData | None:
|
|
if asset is None:
|
|
return None
|
|
return AssetData(
|
|
hash=asset.hash,
|
|
size_bytes=asset.size_bytes,
|
|
mime_type=asset.mime_type,
|
|
)
|