Tighten raw rewrite selection UI
This commit is contained in:
@@ -1123,6 +1123,13 @@ def prepare_raw_post(row: Any) -> dict[str, Any]:
|
|||||||
post["qualified_at_fmt"] = format_dt(post.get("qualified_at"))
|
post["qualified_at_fmt"] = format_dt(post.get("qualified_at"))
|
||||||
post["stage"] = pipeline_stage(post)
|
post["stage"] = pipeline_stage(post)
|
||||||
post["ai_badge"] = ai_badge(post)
|
post["ai_badge"] = ai_badge(post)
|
||||||
|
post["can_send_to_rewrite"] = (
|
||||||
|
post.get("status") == "storage_ready"
|
||||||
|
and (
|
||||||
|
(post.get("qualification_status") or "pending") == "rejected"
|
||||||
|
or (post.get("editorial_status") or "review") == "rejected"
|
||||||
|
)
|
||||||
|
)
|
||||||
return post
|
return post
|
||||||
|
|
||||||
|
|
||||||
@@ -2727,8 +2734,7 @@ async def raw_send_to_rewrite(
|
|||||||
WHERE id=ANY($1::bigint[])
|
WHERE id=ANY($1::bigint[])
|
||||||
AND status='storage_ready'
|
AND status='storage_ready'
|
||||||
AND (
|
AND (
|
||||||
COALESCE(rewrite_status, 'pending') IN ('pending', 'failed')
|
COALESCE(qualification_status, 'pending')='rejected'
|
||||||
OR COALESCE(qualification_status, 'pending')='rejected'
|
|
||||||
OR COALESCE(editorial_status, 'review')='rejected'
|
OR COALESCE(editorial_status, 'review')='rejected'
|
||||||
)
|
)
|
||||||
FOR UPDATE
|
FOR UPDATE
|
||||||
|
|||||||
@@ -107,7 +107,11 @@
|
|||||||
{% for p in posts %}
|
{% for p in posts %}
|
||||||
<div class="block p-4 hover:bg-app-surfaceHover transition-colors">
|
<div class="block p-4 hover:bg-app-surfaceHover transition-colors">
|
||||||
<div class="flex items-start justify-between gap-3">
|
<div class="flex items-start justify-between gap-3">
|
||||||
<input type="checkbox" name="raw_post_id" value="{{ p.id }}" form="raw-rewrite-form" class="checkbox mt-1" aria-label="Выбрать raw #{{ p.id }}">
|
{% if p.can_send_to_rewrite %}
|
||||||
|
<input type="checkbox" name="raw_post_id" value="{{ p.id }}" form="raw-rewrite-form" class="checkbox mt-1" aria-label="Выбрать raw #{{ p.id }}">
|
||||||
|
{% else %}
|
||||||
|
<span class="mt-1 h-4 w-4 flex-shrink-0"></span>
|
||||||
|
{% endif %}
|
||||||
<div class="min-w-0">
|
<div class="min-w-0">
|
||||||
<div class="font-mono text-xs text-app-primary">#{{ p.id }}</div>
|
<div class="font-mono text-xs text-app-primary">#{{ p.id }}</div>
|
||||||
<div class="mt-1 font-semibold text-app-textMain truncate">{{ p.source_name }}</div>
|
<div class="mt-1 font-semibold text-app-textMain truncate">{{ p.source_name }}</div>
|
||||||
@@ -131,7 +135,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<details class="mt-3 group">
|
<details class="mt-3 group">
|
||||||
<summary class="list-none cursor-pointer text-xs text-app-textMain/80 leading-relaxed">
|
<summary class="list-none cursor-pointer text-xs text-app-textMain/80 leading-relaxed">
|
||||||
<span class="block group-open:hidden line-clamp-3">{{ p.raw_text }}</span>
|
<span class="block group-open:hidden" style="display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;">{{ p.raw_text }}</span>
|
||||||
<span class="hidden group-open:block whitespace-pre-wrap">{{ p.raw_text }}</span>
|
<span class="hidden group-open:block whitespace-pre-wrap">{{ p.raw_text }}</span>
|
||||||
</summary>
|
</summary>
|
||||||
{% if p.media_items %}
|
{% if p.media_items %}
|
||||||
@@ -173,19 +177,21 @@
|
|||||||
{% for p in posts %}
|
{% for p in posts %}
|
||||||
<tr class="hover:bg-app-surfaceHover transition-colors group">
|
<tr class="hover:bg-app-surfaceHover transition-colors group">
|
||||||
<td class="px-4 py-3 align-top">
|
<td class="px-4 py-3 align-top">
|
||||||
<input type="checkbox" name="raw_post_id" value="{{ p.id }}" form="raw-rewrite-form" class="checkbox" aria-label="Выбрать raw #{{ p.id }}">
|
{% if p.can_send_to_rewrite %}
|
||||||
|
<input type="checkbox" name="raw_post_id" value="{{ p.id }}" form="raw-rewrite-form" class="checkbox" aria-label="Выбрать raw #{{ p.id }}">
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3 font-mono text-xs">
|
<td class="px-4 py-3 align-top font-mono text-xs">
|
||||||
<span class="text-app-primary">#{{ p.id }}</span>
|
<span class="text-app-primary">#{{ p.id }}</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3 whitespace-normal min-w-[200px]">
|
<td class="px-4 py-3 align-top whitespace-normal min-w-[200px]">
|
||||||
<a href="{{ p.original_url }}" target="_blank" class="font-semibold text-app-textMain hover:text-app-primary transition-colors">{{ p.source_name }}</a>
|
<a href="{{ p.original_url }}" target="_blank" class="font-semibold text-app-textMain hover:text-app-primary transition-colors">{{ p.source_name }}</a>
|
||||||
<div class="flex items-center gap-2 mt-1">
|
<div class="flex items-center gap-2 mt-1">
|
||||||
<span class="text-[10px] text-app-textMuted font-mono bg-app-bg px-1 rounded">{{ p.source_platform }}</span>
|
<span class="text-[10px] text-app-textMuted font-mono bg-app-bg px-1 rounded">{{ p.source_platform }}</span>
|
||||||
<span class="text-[10px] text-blue-400 font-mono">#{{ p.source_tag or "—" }}</span>
|
<span class="text-[10px] text-blue-400 font-mono">#{{ p.source_tag or "—" }}</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3">
|
<td class="px-4 py-3 align-top">
|
||||||
<div class="flex flex-col items-start gap-1">
|
<div class="flex flex-col items-start gap-1">
|
||||||
<span class="badge badge-neutral text-[9px] uppercase tracking-wider">{{ p.status }}</span>
|
<span class="badge badge-neutral text-[9px] uppercase tracking-wider">{{ p.status }}</span>
|
||||||
{% if p.qualification_status %}
|
{% if p.qualification_status %}
|
||||||
@@ -199,10 +205,10 @@
|
|||||||
<div class="text-[10px] text-app-error mt-1 max-w-[200px] whitespace-normal leading-tight">{{ p.error }}</div>
|
<div class="text-[10px] text-app-error mt-1 max-w-[200px] whitespace-normal leading-tight">{{ p.error }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3 whitespace-normal w-full max-w-sm lg:max-w-xl xl:max-w-2xl">
|
<td class="px-4 py-3 align-top whitespace-normal w-full max-w-sm lg:max-w-xl xl:max-w-2xl">
|
||||||
<details class="group">
|
<details class="group">
|
||||||
<summary class="list-none cursor-pointer text-xs text-app-textMain/80 leading-relaxed font-sans">
|
<summary class="list-none cursor-pointer text-xs text-app-textMain/80 leading-relaxed font-sans">
|
||||||
<span class="block group-open:hidden line-clamp-3">{{ p.raw_text }}</span>
|
<span class="block group-open:hidden" style="display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;">{{ p.raw_text }}</span>
|
||||||
<span class="hidden group-open:block whitespace-pre-wrap">{{ p.raw_text }}</span>
|
<span class="hidden group-open:block whitespace-pre-wrap">{{ p.raw_text }}</span>
|
||||||
</summary>
|
</summary>
|
||||||
{% if p.media_items %}
|
{% if p.media_items %}
|
||||||
@@ -223,7 +229,7 @@
|
|||||||
<div class="text-[10px] text-app-textMuted mt-1">Создан: {{ p.created_at_fmt }}</div>
|
<div class="text-[10px] text-app-textMuted mt-1">Создан: {{ p.created_at_fmt }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3 text-center">
|
<td class="px-4 py-3 align-top text-center">
|
||||||
{% if p.qualification_score is not none %}
|
{% if p.qualification_score is not none %}
|
||||||
<div class="font-mono font-bold text-lg {% if p.qualification_score >= 8 %}text-app-success{% elif p.qualification_score >= 5 %}text-app-warning{% else %}text-app-error{% endif %}">{{ p.qualification_score }}</div>
|
<div class="font-mono font-bold text-lg {% if p.qualification_score >= 8 %}text-app-success{% elif p.qualification_score >= 5 %}text-app-warning{% else %}text-app-error{% endif %}">{{ p.qualification_score }}</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
Reference in New Issue
Block a user