From 60f42fb58c2672d7207bbe37b54940e87bd3d2e7 Mon Sep 17 00:00:00 2001 From: Pigway Date: Tue, 6 Oct 2026 09:34:05 +0800 Subject: [PATCH] Keep manual redisplays separate from random task cloud heads --- pigway_frame_flow/display/cloud_library.py | 18 ++++++++++++++-- tests/test_local_cloud_library.py | 24 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/pigway_frame_flow/display/cloud_library.py b/pigway_frame_flow/display/cloud_library.py index 0cda390..8c06e55 100644 --- a/pigway_frame_flow/display/cloud_library.py +++ b/pigway_frame_flow/display/cloud_library.py @@ -12,14 +12,28 @@ class CloudLibrary: self.checked = 0.0 def register(self, device_id, image_id, asset_id, operation_id): - meta = self.service.assets.info(asset_id) + operation = self.db.one( + "SELECT payload FROM operations WHERE id=?", (operation_id,) + ) + payload = json.loads(operation["payload"]) + content = payload.get("content", {}) + job = self.db.one( + "SELECT job_id FROM job_runs WHERE operation_id=?", (operation_id,) + ) + job_id = ( + job["job_id"] + if job + and content.get("type") == "photo_source" + and content.get("item_id") is None + else None + ) self.db.execute( "INSERT INTO managed_cloud_uploads VALUES(?,?,?,?,?,?,NULL,NULL)", ( device_id, image_id, asset_id, - meta.get("job_id"), + job_id, operation_id, datetime.now(UTC).isoformat(), ), diff --git a/tests/test_local_cloud_library.py b/tests/test_local_cloud_library.py index 06409d0..e2be58d 100644 --- a/tests/test_local_cloud_library.py +++ b/tests/test_local_cloud_library.py @@ -144,3 +144,27 @@ def test_clear_cloud_requires_confirmation_and_clears_current(client, service): for _ in range(before): assert service.process_one() assert not service.registry.get("living-room").images() + + +def test_manual_display_does_not_replace_task_head(client, service, settings): + setup_photos(service, settings) + job = make_job(client, "A") + first, asset = run(client, service, job) + second, _ = run(client, service, job) + client.put(f"/api/v1/assets/{asset}/star", json={"starred": True}) + response = client.post( + "/api/v1/display", json={"content": {"type": "image", "asset_id": asset}} + ) + service.process_one() + service.sync() + op = client.get("/api/v1/operations/" + response.json()["operation_id"]).json() + row = service.db.one( + "SELECT job_id FROM managed_cloud_uploads WHERE image_id=?", + (op["result"]["image_id"],), + ) + assert row["job_id"] is None + assert service.cloud_library.retained( + service.db.one( + "SELECT * FROM managed_cloud_uploads WHERE image_id=?", (second,) + ) + )