fix: 隐藏 Demo 标识并修正时间展示
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user