From f74388346e1e2e26dd39d431d959b2e161feb488 Mon Sep 17 00:00:00 2001 From: Simon Pinfold Date: Sat, 27 Jun 2026 15:35:10 +1200 Subject: [PATCH] fix(assets): mark path-derived upload tags automatic Amp-Thread-ID: https://ampcode.com/threads/T-019ecf39-2e6f-747d-ae80-addba6b8e4f5 Co-authored-by: Amp --- app/assets/services/ingest.py | 31 +++++++++----- .../assets_test/services/test_ingest.py | 41 +++++++++++++++++++ 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/app/assets/services/ingest.py b/app/assets/services/ingest.py index ea10ef365..61359464c 100644 --- a/app/assets/services/ingest.py +++ b/app/assets/services/ingest.py @@ -106,17 +106,28 @@ def _ingest_file_from_path( backend_tags = get_path_derived_tags_from_path(locator) except ValueError: backend_tags = [] - norm = normalize_tags([*list(tags), *backend_tags]) - if norm: + caller_tags = normalize_tags(tags) + backend_tags = normalize_tags(backend_tags) + all_tags = normalize_tags([*caller_tags, *backend_tags]) + if all_tags: if require_existing_tags: - validate_tags_exist(session, norm) - add_tags_to_reference( - session, - reference_id=reference_id, - tags=norm, - origin=tag_origin, - create_if_missing=not require_existing_tags, - ) + validate_tags_exist(session, all_tags) + if backend_tags: + add_tags_to_reference( + session, + reference_id=reference_id, + tags=backend_tags, + origin="automatic", + create_if_missing=not require_existing_tags, + ) + if caller_tags: + add_tags_to_reference( + session, + reference_id=reference_id, + tags=caller_tags, + origin=tag_origin, + create_if_missing=not require_existing_tags, + ) _update_metadata_with_filename( session, diff --git a/tests-unit/assets_test/services/test_ingest.py b/tests-unit/assets_test/services/test_ingest.py index 12a3bdfe6..93e2469fe 100644 --- a/tests-unit/assets_test/services/test_ingest.py +++ b/tests-unit/assets_test/services/test_ingest.py @@ -94,6 +94,47 @@ class TestIngestFileFromPath: ref_tags = get_reference_tags(session, reference_id=result.reference_id) assert set(ref_tags) == {"models", "checkpoints"} + def test_path_derived_tags_use_automatic_origin( + self, mock_create_session, temp_dir: Path, session: Session + ): + input_dir = temp_dir / "input" + output_dir = temp_dir / "output" + temp_root = temp_dir / "temp" + for directory in (input_dir, output_dir, temp_root): + directory.mkdir() + file_path = input_dir / "pasted" / "tagged.png" + file_path.parent.mkdir() + file_path.write_bytes(b"data") + + with ( + patch("app.assets.services.path_utils.folder_paths") as mock_fp, + patch( + "app.assets.services.path_utils.get_comfy_models_folders", + return_value=[], + ), + ): + mock_fp.get_input_directory.return_value = str(input_dir) + mock_fp.get_output_directory.return_value = str(output_dir) + mock_fp.get_temp_directory.return_value = str(temp_root) + + result = _ingest_file_from_path( + abs_path=str(file_path), + asset_hash="blake3:pathorigin", + size_bytes=4, + mtime_ns=1234567890000000000, + info_name="Tagged Asset", + tags=["input", "manual-label"], + ) + + assert result.reference_id is not None + links = session.query(AssetReferenceTag).filter_by( + asset_reference_id=result.reference_id + ) + origin_by_tag = {link.tag_name: link.origin for link in links} + assert origin_by_tag["input"] == "automatic" + assert origin_by_tag["pasted"] == "automatic" + assert origin_by_tag["manual-label"] == "manual" + def test_idempotent_upsert(self, mock_create_session, temp_dir: Path, session: Session): file_path = temp_dir / "dup.bin" file_path.write_bytes(b"content")