feat(douyu): 支持账号批量撤回并刷新未分配状态

新增按勾选或标签批量撤回账号归属,撤回只处理确实已分配的账号。账号管理和分配管理增加可见时自动刷新、窗口聚焦刷新及手动刷新,解决批量登录完成后未分配账号延迟出现。
This commit is contained in:
yml2213
2026-11-06 13:25:32 +08:00
parent 4c1aff47da
commit c9fbbdb828
6 changed files with 431 additions and 35 deletions
+52
View File
@@ -213,6 +213,38 @@ class TestAllMatchingAssign(_Base):
self.session.refresh(account)
assert account.assigned_to is None
def test_unassign_all_matching_by_tag_only_touches_assigned_tag(self):
"""按标签撤回:只动该标签下当前已分配的账号,未分配和别的标签都保留。"""
assigned_a = self.make_account(
"mut-a-assigned", tag="撤回标签", assigned_to=self.support.id
)
assigned_a_2 = self.make_account(
"mut-a-assigned-2", tag="撤回标签", assigned_to=self.other.id
)
unassigned_a = self.make_account("mut-a-free", tag="撤回标签")
assigned_b = self.make_account(
"mut-b-assigned", tag="保留标签", assigned_to=self.support.id
)
result = batch_assign_accounts(
BatchAssign(
all_matching=True,
assign_status="assigned",
tag="撤回标签",
assigned_to=None,
),
db=self.session,
current=self.admin,
)
assert result["count"] == 2
for account in (assigned_a, assigned_a_2, unassigned_a, assigned_b):
self.session.refresh(account)
assert assigned_a.assigned_to is None
assert assigned_a_2.assigned_to is None
assert unassigned_a.assigned_to is None
assert assigned_b.assigned_to == self.support.id
def test_explicit_ids_still_work(self):
"""旧路径(显式勾选)不能被 all_matching 改动带坏。"""
a = self.make_account("me-a")
@@ -230,6 +262,26 @@ class TestAllMatchingAssign(_Base):
assert a.assigned_to == self.support.id
assert b.assigned_to is None
def test_explicit_unassign_counts_only_assigned_accounts(self):
"""显式勾选混合未分配账号时,撤回只处理有归属的那些并返回真实数量。"""
assigned = self.make_account("mul-assigned", assigned_to=self.support.id)
unassigned = self.make_account("mul-free")
result = batch_assign_accounts(
BatchAssign(
account_ids=[assigned.id, unassigned.id],
assigned_to=None,
),
db=self.session,
current=self.admin,
)
assert result["count"] == 1
self.session.refresh(assigned)
self.session.refresh(unassigned)
assert assigned.assigned_to is None
assert unassigned.assigned_to is None
def test_all_matching_without_match_is_rejected(self):
import pytest
from fastapi import HTTPException