Автолинковка событий и постов по площадкам. Управление автопубликацией событий (перенос функций evtg_prefetch)
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
@@ -89,6 +89,7 @@ DESC_PREFIX = "https://reg.konvent.ru/zk2025/events/actions/"
|
|||||||
# Event status
|
# Event status
|
||||||
IS_EVENT = true
|
IS_EVENT = true
|
||||||
AUTO_PUBLISH = true
|
AUTO_PUBLISH = true
|
||||||
|
AUTO_PUB_EVT = true
|
||||||
PROCESS_EVENT_UPDATES = false
|
PROCESS_EVENT_UPDATES = false
|
||||||
|
|
||||||
# OpenRouter
|
# OpenRouter
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ def ensure_database_structure():
|
|||||||
post_id INT NOT NULL,
|
post_id INT NOT NULL,
|
||||||
event_id INT NOT NULL,
|
event_id INT NOT NULL,
|
||||||
created_at DATETIME NULL,
|
created_at DATETIME NULL,
|
||||||
|
auto_added BOOLEAN DEFAULT 0,
|
||||||
FOREIGN KEY (post_id)
|
FOREIGN KEY (post_id)
|
||||||
REFERENCES posts(id)
|
REFERENCES posts(id)
|
||||||
ON DELETE CASCADE,
|
ON DELETE CASCADE,
|
||||||
@@ -189,6 +190,9 @@ def ensure_database_structure():
|
|||||||
'marks_evt': [
|
'marks_evt': [
|
||||||
{'column': 'autolink', 'type': 'BOOLEAN DEFAULT 0'},
|
{'column': 'autolink', 'type': 'BOOLEAN DEFAULT 0'},
|
||||||
{'column': 'reminded_at', 'type': 'DATETIME NULL'}
|
{'column': 'reminded_at', 'type': 'DATETIME NULL'}
|
||||||
|
],
|
||||||
|
'interlinks': [
|
||||||
|
{'column': 'auto_added', 'type': 'BOOLEAN DEFAULT 0'}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+61
-3
@@ -18,6 +18,7 @@ MDB_PW = os.getenv('MDB_PW')
|
|||||||
MDBASE = os.getenv('MDBASE')
|
MDBASE = os.getenv('MDBASE')
|
||||||
LOG_FILE = os.getenv('LOG_FILE')
|
LOG_FILE = os.getenv('LOG_FILE')
|
||||||
PROCESS_EVENT_UPDATES = os.getenv('PROCESS_EVENT_UPDATES', 'false').lower() in ('true', '1', 'yes', 'on')
|
PROCESS_EVENT_UPDATES = os.getenv('PROCESS_EVENT_UPDATES', 'false').lower() in ('true', '1', 'yes', 'on')
|
||||||
|
AUTO_PUB_EVT = os.getenv('AUTO_PUB_EVT', 'false').lower() in ('true', '1', 'yes', 'on')
|
||||||
|
|
||||||
def log_message(message, category="JSON_loader"):
|
def log_message(message, category="JSON_loader"):
|
||||||
"""Функция для записи в лог-файл с повторными попытками при блокировке"""
|
"""Функция для записи в лог-файл с повторными попытками при блокировке"""
|
||||||
@@ -53,6 +54,41 @@ def parse_datetime(dt_str):
|
|||||||
|
|
||||||
return dt
|
return dt
|
||||||
|
|
||||||
|
def create_event_post_links(cursor, event_id, unit_name):
|
||||||
|
"""Создание связей между событием и постами по auto_unit"""
|
||||||
|
if not unit_name:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Поиск постов с соответствующим auto_unit
|
||||||
|
cursor.execute(
|
||||||
|
"SELECT id FROM posts WHERE auto_unit = %s",
|
||||||
|
(unit_name,)
|
||||||
|
)
|
||||||
|
posts = cursor.fetchall()
|
||||||
|
|
||||||
|
for post in posts:
|
||||||
|
post_id = post['id']
|
||||||
|
|
||||||
|
# Проверяем, существует ли уже связь
|
||||||
|
cursor.execute(
|
||||||
|
"SELECT id FROM interlinks WHERE post_id = %s AND event_id = %s",
|
||||||
|
(post_id, event_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not cursor.fetchone():
|
||||||
|
# Создаем новую связь с auto_added = 1
|
||||||
|
cursor.execute(
|
||||||
|
"INSERT INTO interlinks (post_id, event_id, created_at, auto_added) VALUES (%s, %s, %s, 1)",
|
||||||
|
(post_id, event_id, datetime.now())
|
||||||
|
)
|
||||||
|
log_message(f"Создана автоматическая связь: событие {event_id} <-> пост {post_id} (unit: {unit_name})")
|
||||||
|
else:
|
||||||
|
log_message(f"Связь уже существует: событие {event_id} <-> пост {post_id}")
|
||||||
|
|
||||||
|
except Error as e:
|
||||||
|
log_message(f"Ошибка при создании связей для события {event_id}: {e}", "ERROR")
|
||||||
|
|
||||||
def process_json_data():
|
def process_json_data():
|
||||||
inserted_count = 0
|
inserted_count = 0
|
||||||
updated_count = 0
|
updated_count = 0
|
||||||
@@ -117,6 +153,9 @@ def process_json_data():
|
|||||||
# Вычисление is_visible
|
# Вычисление is_visible
|
||||||
is_visible = bool(name and about and not is_canceled and not denied)
|
is_visible = bool(name and about and not is_canceled and not denied)
|
||||||
|
|
||||||
|
# Определение marked_to_publication для новой записи
|
||||||
|
marked_to_publication = 1 if (is_visible and AUTO_PUB_EVT) else 0
|
||||||
|
|
||||||
# Проверка существующей записи
|
# Проверка существующей записи
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"SELECT id_event, number, modified, name, about, is_posted_tg FROM events WHERE id_event = %s AND number = %s",
|
"SELECT id_event, number, modified, name, about, is_posted_tg FROM events WHERE id_event = %s AND number = %s",
|
||||||
@@ -135,10 +174,16 @@ def process_json_data():
|
|||||||
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
|
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
|
||||||
(id_event, number, unit_name, name, about, about_social_picture,
|
(id_event, number, unit_name, name, about, about_social_picture,
|
||||||
modified, added, tags, is_canceled, accepted, denied,
|
modified, added, tags, is_canceled, accepted, denied,
|
||||||
is_visible, 0, 0, None, None, None)
|
is_visible, 0, marked_to_publication, None, None, None)
|
||||||
)
|
)
|
||||||
inserted_count += 1
|
inserted_count += 1
|
||||||
log_message(f"Добавление: Запись {id_event}, Created: {added}")
|
log_message(f"Добавление: Запись {id_event}, Created: {added}")
|
||||||
|
|
||||||
|
# Создание связей с постами для новой записи
|
||||||
|
cursor.execute("SELECT id FROM events WHERE id_event = %s AND number = %s", (id_event, number))
|
||||||
|
event_record = cursor.fetchone()
|
||||||
|
if event_record:
|
||||||
|
create_event_post_links(cursor, event_record['id'], unit_name)
|
||||||
else:
|
else:
|
||||||
# Преобразуем дату из БД к наивному datetime для сравнения
|
# Преобразуем дату из БД к наивному datetime для сравнения
|
||||||
existing_modified = existing['modified']
|
existing_modified = existing['modified']
|
||||||
@@ -154,6 +199,10 @@ def process_json_data():
|
|||||||
name_changed = existing['name'] != name
|
name_changed = existing['name'] != name
|
||||||
# Сброс флага is_posted_tg только если PROCESS_EVENT_UPDATES = true
|
# Сброс флага is_posted_tg только если PROCESS_EVENT_UPDATES = true
|
||||||
is_posted_tg = 0 if (name_changed and PROCESS_EVENT_UPDATES) else existing['is_posted_tg']
|
is_posted_tg = 0 if (name_changed and PROCESS_EVENT_UPDATES) else existing['is_posted_tg']
|
||||||
|
|
||||||
|
# Обновление marked_to_publication на основе новых данных
|
||||||
|
new_marked_to_publication = 1 if (is_visible and AUTO_PUB_EVT) else 0
|
||||||
|
|
||||||
# log_message(f"PROCESS_EVENT_UPDATES: {PROCESS_EVENT_UPDATES}")
|
# log_message(f"PROCESS_EVENT_UPDATES: {PROCESS_EVENT_UPDATES}")
|
||||||
# log_message(f"name_changed: {name_changed}")
|
# log_message(f"name_changed: {name_changed}")
|
||||||
|
|
||||||
@@ -162,20 +211,29 @@ def process_json_data():
|
|||||||
"""UPDATE events SET
|
"""UPDATE events SET
|
||||||
unit_name = %s, name = %s, about = %s, about_social_picture = %s,
|
unit_name = %s, name = %s, about = %s, about_social_picture = %s,
|
||||||
modified = %s, added = %s, tags = %s, is_canceled = %s,
|
modified = %s, added = %s, tags = %s, is_canceled = %s,
|
||||||
accepted = %s, denied = %s, is_visible = %s, is_posted_tg = %s
|
accepted = %s, denied = %s, is_visible = %s, is_posted_tg = %s,
|
||||||
|
marked_to_publication = %s
|
||||||
WHERE id_event = %s AND number = %s""",
|
WHERE id_event = %s AND number = %s""",
|
||||||
(unit_name, name, about, about_social_picture, modified, added,
|
(unit_name, name, about, about_social_picture, modified, added,
|
||||||
tags, is_canceled, accepted, denied, is_visible, is_posted_tg,
|
tags, is_canceled, accepted, denied, is_visible, is_posted_tg,
|
||||||
id_event, number)
|
new_marked_to_publication, id_event, number)
|
||||||
)
|
)
|
||||||
updated_count += 1
|
updated_count += 1
|
||||||
|
|
||||||
|
# Создание связей с постами для обновленной записи
|
||||||
|
cursor.execute("SELECT id FROM events WHERE id_event = %s AND number = %s", (id_event, number))
|
||||||
|
event_record = cursor.fetchone()
|
||||||
|
if event_record:
|
||||||
|
create_event_post_links(cursor, event_record['id'], unit_name)
|
||||||
|
|
||||||
# Формирование сообщения для лога
|
# Формирование сообщения для лога
|
||||||
update_msg = f"Обновление: Запись {id_event}, Updated: {modified}"
|
update_msg = f"Обновление: Запись {id_event}, Updated: {modified}"
|
||||||
if name_changed and PROCESS_EVENT_UPDATES:
|
if name_changed and PROCESS_EVENT_UPDATES:
|
||||||
update_msg += ". Флаг публикации сброшен."
|
update_msg += ". Флаг публикации сброшен."
|
||||||
elif name_changed and not PROCESS_EVENT_UPDATES:
|
elif name_changed and not PROCESS_EVENT_UPDATES:
|
||||||
update_msg += ". Имя изменено, но флаг публикации сохранен (PROCESS_EVENT_UPDATES=false)."
|
update_msg += ". Имя изменено, но флаг публикации сохранен (PROCESS_EVENT_UPDATES=false)."
|
||||||
|
if new_marked_to_publication:
|
||||||
|
update_msg += f" marked_to_publication установлен в 1 (is_visible={is_visible}, AUTO_PUB_EVT={AUTO_PUB_EVT})."
|
||||||
log_message(update_msg)
|
log_message(update_msg)
|
||||||
|
|
||||||
connection.commit()
|
connection.commit()
|
||||||
|
|||||||
Reference in New Issue
Block a user