Tagging-v2: heads are the suggestion source (learn-from-tags) + rail accept/reject #142

Merged
bvandeusen merged 7 commits from dev into main 2026-06-28 11:55:49 -04:00
Showing only changes of commit 291b90803d - Show all commits
+11 -6
View File
@@ -170,14 +170,19 @@ async def test_rejected_tag_surfaced_flagged_then_reversible(db):
sl = await SuggestionService(db).for_image(img.id)
general = sl.by_category["general"]
by_name = {s.display_name: s for s in general}
assert by_name["Rejectme"].rejected is True
assert by_name["Keepme"].rejected is False
# Match by id, not display casing (an existing tag keeps its stored name).
rej = next(s for s in general if s.canonical_tag_id == rejected_tag.id)
assert rej.rejected is True
live = [s for s in general if not s.rejected]
assert live, "the un-rejected 'keepme' suggestion should still surface"
# Live suggestions sort ahead of rejected ones regardless of score.
assert general[-1].display_name == "Rejectme"
assert general[-1].canonical_tag_id == rejected_tag.id
# Un-reject reverts it to a live suggestion.
await AllowlistService(db).undismiss(img.id, rejected_tag.id)
sl2 = await SuggestionService(db).for_image(img.id)
by_name2 = {s.display_name: s for s in sl2.by_category["general"]}
assert by_name2["Rejectme"].rejected is False
rej2 = next(
s for s in sl2.by_category["general"]
if s.canonical_tag_id == rejected_tag.id
)
assert rej2.rejected is False