|
# retoor <retoor@molodetz.nl>
|
|
|
|
import logging
|
|
|
|
from devplacepy.database import (
|
|
SEO_META_TYPES,
|
|
get_table,
|
|
has_fresh_seo_metadata,
|
|
mark_seo_metadata_stale,
|
|
)
|
|
from devplacepy.seo_meta_text import plain_seo_defaults
|
|
from devplacepy.services.jobs import queue
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
TABLE_TO_TYPE = {
|
|
"posts": "post",
|
|
"projects": "project",
|
|
"gists": "gist",
|
|
"news": "news",
|
|
}
|
|
|
|
TYPE_TABLES = {
|
|
"post": "posts",
|
|
"project": "projects",
|
|
"gist": "gists",
|
|
"news": "news",
|
|
}
|
|
|
|
TITLE_FIELD = {
|
|
"post": "title",
|
|
"project": "title",
|
|
"gist": "title",
|
|
"news": "title",
|
|
"issue": "enhanced_title",
|
|
}
|
|
|
|
BODY_FIELD = {
|
|
"post": "content",
|
|
"project": "description",
|
|
"gist": "description",
|
|
"news": "description",
|
|
"issue": "original_description",
|
|
}
|
|
|
|
|
|
def target_type_for_table(table: str) -> str:
|
|
return TABLE_TO_TYPE.get(table, "")
|
|
|
|
|
|
def load_target_row(target_type: str, target_uid: str) -> dict | None:
|
|
table = TYPE_TABLES.get(target_type)
|
|
if table:
|
|
row = get_table(table).find_one(uid=target_uid, deleted_at=None)
|
|
return dict(row) if row else None
|
|
if target_type == "issue":
|
|
from devplacepy.services.gitea import store
|
|
|
|
try:
|
|
row = store.get_ticket(int(target_uid))
|
|
except (ValueError, TypeError):
|
|
return None
|
|
return dict(row) if row else None
|
|
return None
|
|
|
|
|
|
def defaults_for_target(target_type: str, target_uid: str) -> dict:
|
|
row = load_target_row(target_type, target_uid)
|
|
if not row:
|
|
return plain_seo_defaults("", "")
|
|
title = row.get(TITLE_FIELD.get(target_type, "title")) or ""
|
|
body = row.get(BODY_FIELD.get(target_type, "content")) or ""
|
|
return plain_seo_defaults(title, body)
|
|
|
|
|
|
def schedule_seo_meta(target_type: str, target_uid: str, regenerate: bool = False) -> None:
|
|
if target_type not in SEO_META_TYPES or not target_uid:
|
|
return
|
|
target_uid = str(target_uid)
|
|
if regenerate:
|
|
mark_seo_metadata_stale(target_type, target_uid)
|
|
elif has_fresh_seo_metadata(target_type, target_uid):
|
|
return
|
|
if _has_pending_job(target_type, target_uid):
|
|
return
|
|
queue.enqueue(
|
|
"seo_meta",
|
|
{"target_type": target_type, "target_uid": target_uid},
|
|
"system",
|
|
"seo_meta",
|
|
preferred_name=f"{target_type}:{target_uid[:12]}",
|
|
)
|
|
|
|
|
|
def schedule_seo_meta_for_table(table: str, target_uid: str, regenerate: bool = False) -> None:
|
|
target_type = target_type_for_table(table)
|
|
if target_type:
|
|
schedule_seo_meta(target_type, target_uid, regenerate=regenerate)
|
|
|
|
|
|
def _has_pending_job(target_type: str, target_uid: str) -> bool:
|
|
for job in queue.list_jobs(kind="seo_meta", status=queue.PENDING):
|
|
payload = job.get("payload") or {}
|
|
if (
|
|
payload.get("target_type") == target_type
|
|
and str(payload.get("target_uid")) == target_uid
|
|
):
|
|
return True
|
|
for job in queue.list_jobs(kind="seo_meta", status=queue.RUNNING):
|
|
payload = job.get("payload") or {}
|
|
if (
|
|
payload.get("target_type") == target_type
|
|
and str(payload.get("target_uid")) == target_uid
|
|
):
|
|
return True
|
|
return False
|