fix: 隐藏 Demo 标识并修正时间展示

This commit is contained in:
meijiali
2026-07-06 14:57:59 +08:00
parent c406364d14
commit 9d212b54be
5 changed files with 40 additions and 9 deletions
+3 -1
View File
@@ -3,6 +3,7 @@ import json
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from collections.abc import Callable from collections.abc import Callable
from datetime import UTC, datetime from datetime import UTC, datetime
from zoneinfo import ZoneInfo
from sqlalchemy import func, select from sqlalchemy import func, select
from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.orm import Session, sessionmaker
@@ -22,6 +23,7 @@ RUNNING_TASK_MESSAGE = "当前有正在运行的任务,请稍后再试"
RESTART_ERROR_MESSAGE = "系统重启,任务被中断" RESTART_ERROR_MESSAGE = "系统重启,任务被中断"
STALE_PROGRESS_THRESHOLD_SECONDS = 10 * 60 STALE_PROGRESS_THRESHOLD_SECONDS = 10 * 60
STALE_PROGRESS_ERROR_TYPE = "stale_progress_timeout" STALE_PROGRESS_ERROR_TYPE = "stale_progress_timeout"
DISPLAY_TIMEZONE = ZoneInfo("Asia/Shanghai")
task_executor = ThreadPoolExecutor(max_workers=1) task_executor = ThreadPoolExecutor(max_workers=1)
@@ -227,7 +229,7 @@ def calculate_task_display_number(session: Session, task: Task) -> int:
def format_datetime_minute(value: datetime | None) -> str: def format_datetime_minute(value: datetime | None) -> str:
value = ensure_utc_datetime(value) value = ensure_utc_datetime(value)
return value.strftime("%Y-%m-%d %H:%M") if value else "" return value.astimezone(DISPLAY_TIMEZONE).strftime("%Y-%m-%d %H:%M") if value else ""
def build_task_error_summary(task: Task) -> str | None: def build_task_error_summary(task: Task) -> str | None:
+1 -1
View File
@@ -56,7 +56,7 @@
<div class="section-heading"> <div class="section-heading">
<div> <div>
<p class="section-kicker">任务历史</p> <p class="section-kicker">任务历史</p>
<h2>最近任务与 Demo 数据</h2> <h2>最近任务</h2>
</div> </div>
{% if has_running_tasks %}<span class="badge text-bg-warning">自动更新中</span>{% endif %} {% if has_running_tasks %}<span class="badge text-bg-warning">自动更新中</span>{% endif %}
</div> </div>
-3
View File
@@ -5,9 +5,6 @@
<tr> <tr>
<td> <td>
<span class="task-number">{{ task.display_id or loop.index }}</span> <span class="task-number">{{ task.display_id or loop.index }}</span>
{% if task.is_demo %}
<br><span class="badge text-bg-info">Demo 数据</span>
{% endif %}
</td> </td>
<td>{{ task.platform | platform_label }}</td> <td>{{ task.platform | platform_label }}</td>
<td>{{ task.created_at_label }}</td> <td>{{ task.created_at_label }}</td>
+1 -1
View File
@@ -20,7 +20,7 @@
{% set ai_percent = rate_percent(task.analysis_success_rate) %} {% set ai_percent = rate_percent(task.analysis_success_rate) %}
{% set target_comments = task.hotspot_limit * task.item_limit_per_hotspot * task.comment_limit_per_item %} {% set target_comments = task.hotspot_limit * task.item_limit_per_hotspot * task.comment_limit_per_item %}
<div class="d-flex flex-wrap justify-content-between gap-3 mb-3"> <div class="d-flex flex-wrap justify-content-between gap-3 mb-3">
<p class="mb-0">平台:{{ task.platform | platform_label }}{% if task.is_demo %}<span class="badge text-bg-info ms-2">Demo 数据</span>{% endif %}</p> <p class="mb-0">平台:{{ task.platform | platform_label }}</p>
<p class="mb-0 text-muted">创建时间 {{ task.created_at_label }} · 阶段 {{ task.current_stage_label or "等待启动" }}</p> <p class="mb-0 text-muted">创建时间 {{ task.created_at_label }} · 阶段 {{ task.current_stage_label or "等待启动" }}</p>
</div> </div>
<div class="mb-3"> <div class="mb-3">
+35 -3
View File
@@ -107,8 +107,9 @@ def test_index_page_uses_short_task_numbers_compact_fields_and_friendly_error_co
assert "#" not in visible_text assert "#" not in visible_text
assert first_id not in visible_text assert first_id not in visible_text
assert second_id not in visible_text assert second_id not in visible_text
assert "2026-07-03 10:30" in visible_text assert "2026-07-03 18:30" in visible_text
assert "2026-07-03 10:35" in visible_text assert "2026-07-03 18:35" in visible_text
assert "Demo 数据" not in visible_text
assert "5热点 × 5内容 × 50评论" in visible_text assert "5热点 × 5内容 × 50评论" in visible_text
assert "1热点 × 1内容 × 10评论" in visible_text assert "1热点 × 1内容 × 10评论" in visible_text
assert "小红书 · 5热点" not in visible_text assert "小红书 · 5热点" not in visible_text
@@ -207,7 +208,38 @@ def test_task_detail_uses_short_number_title_and_hides_full_uuid():
assert task_id not in visible_text assert task_id not in visible_text
assert "任务 #33333333-3333-4333-8333-333333333333" not in visible_text assert "任务 #33333333-3333-4333-8333-333333333333" not in visible_text
assert "#" not in visible_text assert "#" not in visible_text
assert "创建时间 2026-07-03 10:30" in visible_text assert "创建时间 2026-07-03 18:30" in visible_text
assert "Demo 数据" not in visible_text
def test_demo_task_flag_is_kept_but_demo_copy_is_hidden_from_pages():
with make_test_client() as (client, engine):
from sqlalchemy.orm import Session
with Session(engine) as session:
session.add(
Task(
id="demo-task-hidden-copy",
platform="xiaohongshu",
status="success",
created_at=datetime(2026, 7, 3, 10, 30, tzinfo=UTC),
hotspot_limit=1,
item_limit_per_hotspot=1,
comment_limit_per_item=10,
)
)
session.commit()
index_response = client.get("/")
detail_response = client.get("/tasks/demo-task-hidden-copy")
api_response = client.get("/api/tasks/demo-task-hidden-copy")
assert index_response.status_code == 200
assert detail_response.status_code == 200
assert api_response.status_code == 200
assert api_response.json()["is_demo"] is True
assert "Demo 数据" not in BeautifulSoup(index_response.text, "html.parser").get_text(" ")
assert "Demo 数据" not in BeautifulSoup(detail_response.text, "html.parser").get_text(" ")
def test_running_task_detail_page_keeps_polling_after_hotspots_exist(): def test_running_task_detail_page_keeps_polling_after_hotspots_exist():