fix(notifier): маппинг input_data в модели Task для уведомлений о завершении
send_task_done падал с AttributeError: минимальная модель Task в notifier не мапила колонку input_data (она есть в БД и в полной модели API), а _build_summary читал task.input_data для search/plagiarism. Задача уходила в бесконечные ретраи. Добавлен маппинг колонки + защита от NULL. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -25,6 +25,7 @@ class Task(Base):
|
|||||||
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
|
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"))
|
||||||
type: Mapped[str] = mapped_column(String(20))
|
type: Mapped[str] = mapped_column(String(20))
|
||||||
status: Mapped[str] = mapped_column(String(20))
|
status: Mapped[str] = mapped_column(String(20))
|
||||||
|
input_data: Mapped[dict | None] = mapped_column(JSON, nullable=True)
|
||||||
result: Mapped[dict | None] = mapped_column(JSON, nullable=True)
|
result: Mapped[dict | None] = mapped_column(JSON, nullable=True)
|
||||||
error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||||
created_at: Mapped[datetime] = mapped_column(server_default=func.now())
|
created_at: Mapped[datetime] = mapped_column(server_default=func.now())
|
||||||
|
|||||||
@@ -68,10 +68,11 @@ def send_task_done(self, task_id: str) -> dict:
|
|||||||
def _build_summary(task) -> str:
|
def _build_summary(task) -> str:
|
||||||
"""Сформировать краткое описание результата для email."""
|
"""Сформировать краткое описание результата для email."""
|
||||||
result = task.result or {}
|
result = task.result or {}
|
||||||
|
input_data = task.input_data or {}
|
||||||
|
|
||||||
if task.type == "search":
|
if task.type == "search":
|
||||||
count = len(result.get("sources", []))
|
count = len(result.get("sources", []))
|
||||||
query = task.input_data.get("query", "")
|
query = input_data.get("query", "")
|
||||||
return (
|
return (
|
||||||
f'Найдено <strong>{count} источников</strong> по запросу "{query[:80]}".'
|
f'Найдено <strong>{count} источников</strong> по запросу "{query[:80]}".'
|
||||||
f' Откройте результат, чтобы просмотреть список с ГОСТ-цитатами.'
|
f' Откройте результат, чтобы просмотреть список с ГОСТ-цитатами.'
|
||||||
@@ -81,7 +82,7 @@ def _build_summary(task) -> str:
|
|||||||
similarity = result.get("overall_similarity", 0)
|
similarity = result.get("overall_similarity", 0)
|
||||||
total = result.get("total_fragments", 0)
|
total = result.get("total_fragments", 0)
|
||||||
flagged = result.get("flagged_fragments", 0)
|
flagged = result.get("flagged_fragments", 0)
|
||||||
filename = task.input_data.get("filename", "")
|
filename = input_data.get("filename", "")
|
||||||
|
|
||||||
color = "#dc2626" if similarity > 30 else "#d97706" if similarity > 10 else "#16a34a"
|
color = "#dc2626" if similarity > 30 else "#d97706" if similarity > 10 else "#16a34a"
|
||||||
label = "Высокий" if similarity > 30 else "Средний" if similarity > 10 else "Низкий"
|
label = "Высокий" if similarity > 30 else "Средний" if similarity > 10 else "Низкий"
|
||||||
|
|||||||
Reference in New Issue
Block a user