+58
-10
@@ -205,6 +205,48 @@ async def _apply_update(
|
||||
return item
|
||||
|
||||
|
||||
async def _notify_status_change(
|
||||
session: AsyncSession,
|
||||
*,
|
||||
ws_id: uuid.UUID,
|
||||
item: Item,
|
||||
previous: str,
|
||||
to_status: str,
|
||||
actor_id: uuid.UUID,
|
||||
actor_name: str,
|
||||
) -> None:
|
||||
"""状态变化的通知。
|
||||
|
||||
"完成"单独一种 kind:收件人一眼能看出是结项,而不是又一次普通的状态流转;
|
||||
其余状态仍走 `task_status_changed`,正文里写清从什么改成了什么。
|
||||
"""
|
||||
if to_status == "done":
|
||||
await notify(
|
||||
session,
|
||||
ws_id=ws_id,
|
||||
user_ids=(item.creator_id, item.assignee_id),
|
||||
kind="task_completed",
|
||||
item_id=item.id,
|
||||
title=f"「{item.title}」已完成",
|
||||
body=f"{actor_name} 把它标记为完成。",
|
||||
actor_id=actor_id,
|
||||
)
|
||||
return
|
||||
await notify(
|
||||
session,
|
||||
ws_id=ws_id,
|
||||
user_ids=(item.creator_id, item.assignee_id),
|
||||
kind="task_status_changed",
|
||||
item_id=item.id,
|
||||
title=f"「{item.title}」变成{TASK_STATUS_CN.get(to_status, to_status)}了",
|
||||
body=(
|
||||
f"{actor_name} 把它从 {TASK_STATUS_CN.get(previous, previous)} "
|
||||
f"改成了 {TASK_STATUS_CN.get(to_status, to_status)}"
|
||||
),
|
||||
actor_id=actor_id,
|
||||
)
|
||||
|
||||
|
||||
# ── 列表 ────────────────────────────────────────────────────────────────
|
||||
def _apply_filters(
|
||||
stmt: Select,
|
||||
@@ -581,6 +623,17 @@ async def batch_status(body: BatchStatusIn, ctx: MemberDep, session: SessionDep)
|
||||
}
|
||||
)
|
||||
continue
|
||||
# 批量改状态以前是"悄悄改完":被指派人/创建人收不到任何通知,
|
||||
# 和单条改状态的行为不一致。这里补上同一条通知。
|
||||
await _notify_status_change(
|
||||
session,
|
||||
ws_id=ctx.ws_id,
|
||||
item=item,
|
||||
previous=previous,
|
||||
to_status=body.status,
|
||||
actor_id=ctx.user.id,
|
||||
actor_name=ctx.user.nickname or "同事",
|
||||
)
|
||||
updated.append({"id": str(item.id), "version": item.version, "unchanged": False})
|
||||
|
||||
return ok(
|
||||
@@ -682,19 +735,14 @@ async def change_status(
|
||||
payload={"from": previous, "to": body.status},
|
||||
)
|
||||
tags = await _tags_of(session, ctx.ws_id, [item.id])
|
||||
await notify(
|
||||
await _notify_status_change(
|
||||
session,
|
||||
ws_id=ctx.ws_id,
|
||||
user_ids=(item.creator_id, item.assignee_id),
|
||||
kind="task_status_changed",
|
||||
item_id=item.id,
|
||||
title=f"「{item.title}」变成{TASK_STATUS_CN.get(body.status, body.status)}了",
|
||||
body=(
|
||||
f"{ctx.user.nickname or '同事'} 把它从 "
|
||||
f"{TASK_STATUS_CN.get(previous, previous)} 改成了 "
|
||||
f"{TASK_STATUS_CN.get(body.status, body.status)}"
|
||||
),
|
||||
item=item,
|
||||
previous=previous,
|
||||
to_status=body.status,
|
||||
actor_id=ctx.user.id,
|
||||
actor_name=ctx.user.nickname or "同事",
|
||||
)
|
||||
return ok(_item_out(item, tags.get(item.id)), message="状态已更新")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user