Advance issue status from repair actions
Magent CI/CD / verify (push) Successful in 10m30s
Magent CI/CD / deploy-prod (push) Skipped
Magent CI/CD / deploy-beta (push) Canceled after 5s

This commit is contained in:
2026-09-01 14:48:08 +12:00
parent c7a56f2525
commit 16876e1cf0
2 changed files with 33 additions and 0 deletions
+13
View File
@@ -44,6 +44,7 @@ from ..db import (
get_artwork_cache_status_count,
get_setting,
set_setting,
update_portal_item,
update_artwork_cache_stats,
cleanup_history,
is_seerr_media_failure_suppressed,
@@ -1830,6 +1831,18 @@ def _record_replacement_activity(
) -> None:
if not issue:
return
current_status = str(issue.get("status") or "new").strip().lower()
next_status: Optional[str] = None
if event_type.endswith("_started"):
next_status = "in_progress"
elif event_type.endswith("_failed"):
next_status = "blocked"
if next_status and current_status not in {"done", "closed"}:
update_portal_item(
int(issue["id"]),
status=next_status,
issue_resolved_at=None,
)
add_portal_item_activity(
int(issue["id"]),
event_type=event_type,
+20
View File
@@ -1271,6 +1271,21 @@ class AuthFlowTests(TempDatabaseMixin, unittest.IsolatedAsyncioTestCase):
class MediaReplacementTests(unittest.IsolatedAsyncioTestCase):
def test_failed_repair_marks_linked_issue_as_blocked(self) -> None:
issue = {"id": 12, "status": "in_progress"}
with (
patch.object(requests_router, "update_portal_item") as update_issue,
patch.object(requests_router, "add_portal_item_activity"),
):
requests_router._record_replacement_activity(
issue,
user={"username": "viewer", "role": "user"},
event_type="replacement_failed",
message="Radarr could not start the replacement.",
)
update_issue.assert_called_once_with(12, status="blocked", issue_resolved_at=None)
async def test_movie_replacement_validates_file_then_deletes_and_searches(self) -> None:
snapshot = Snapshot(
request_id="3914",
@@ -1315,6 +1330,7 @@ class MediaReplacementTests(unittest.IsolatedAsyncioTestCase):
"created_by_username": "admin",
},
),
patch.object(requests_router, "update_portal_item") as update_issue,
patch.object(requests_router, "add_portal_item_activity") as add_activity,
):
result = await requests_router.action_replace_media(
@@ -1328,6 +1344,7 @@ class MediaReplacementTests(unittest.IsolatedAsyncioTestCase):
radarr.search.assert_awaited_once_with(44)
add_activity.assert_called_once()
self.assertEqual(add_activity.call_args.kwargs["event_type"], "replacement_started")
update_issue.assert_called_once_with(12, status="in_progress", issue_resolved_at=None)
async def test_tv_replacement_options_return_only_safe_file_details(self) -> None:
snapshot = Snapshot(
@@ -1470,6 +1487,7 @@ class MediaReplacementTests(unittest.IsolatedAsyncioTestCase):
"external_ref": "/requests/3909",
"created_by_username": "viewer",
}),
patch.object(requests_router, "update_portal_item"),
patch.object(requests_router, "add_portal_item_activity"),
):
result = await requests_router.action_replace_media(
@@ -1510,6 +1528,7 @@ class MediaReplacementTests(unittest.IsolatedAsyncioTestCase):
"external_ref": "/requests/3914",
"created_by_username": "viewer",
}),
patch.object(requests_router, "update_portal_item") as update_issue,
patch.object(requests_router, "add_portal_item_activity") as add_activity,
):
result = await requests_router.action_repair_subtitles(
@@ -1521,6 +1540,7 @@ class MediaReplacementTests(unittest.IsolatedAsyncioTestCase):
self.assertEqual(result["status"], "ok")
bazarr.search_movie_subtitles.assert_awaited_once_with(44, language="en", forced=True)
self.assertEqual(add_activity.call_args.kwargs["event_type"], "subtitle_repair_started")
update_issue.assert_called_once_with(12, status="in_progress", issue_resolved_at=None)
class PortalMediaStatusTests(unittest.IsolatedAsyncioTestCase):