diff --git a/.env b/.env index a68143b..8f8c6d4 100644 --- a/.env +++ b/.env @@ -89,6 +89,7 @@ DESC_PREFIX = "https://reg.konvent.ru/zk2025/events/actions/" # Event status IS_EVENT = true AUTO_PUBLISH = true +AUTO_PUB_EVT = true PROCESS_EVENT_UPDATES = false # OpenRouter diff --git a/ensure_db.py b/ensure_db.py index 94eed26..8fe78d3 100644 --- a/ensure_db.py +++ b/ensure_db.py @@ -146,6 +146,7 @@ def ensure_database_structure(): post_id INT NOT NULL, event_id INT NOT NULL, created_at DATETIME NULL, + auto_added BOOLEAN DEFAULT 0, FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE, @@ -189,6 +190,9 @@ def ensure_database_structure(): 'marks_evt': [ {'column': 'autolink', 'type': 'BOOLEAN DEFAULT 0'}, {'column': 'reminded_at', 'type': 'DATETIME NULL'} + ], + 'interlinks': [ + {'column': 'auto_added', 'type': 'BOOLEAN DEFAULT 0'} ] } diff --git a/zk_load.py b/zk_load.py index ae01bc9..ff0f239 100644 --- a/zk_load.py +++ b/zk_load.py @@ -18,6 +18,7 @@ MDB_PW = os.getenv('MDB_PW') MDBASE = os.getenv('MDBASE') LOG_FILE = os.getenv('LOG_FILE') 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"): """Функция для записи в лог-файл с повторными попытками при блокировке""" @@ -53,6 +54,41 @@ def parse_datetime(dt_str): 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(): inserted_count = 0 updated_count = 0 @@ -116,6 +152,9 @@ def process_json_data(): # Вычисление is_visible 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( @@ -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)""", (id_event, number, unit_name, name, about, about_social_picture, 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 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: # Преобразуем дату из БД к наивному datetime для сравнения existing_modified = existing['modified'] @@ -154,6 +199,10 @@ def process_json_data(): name_changed = existing['name'] != name # Сброс флага is_posted_tg только если PROCESS_EVENT_UPDATES = true 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"name_changed: {name_changed}") @@ -162,20 +211,29 @@ def process_json_data(): """UPDATE events SET unit_name = %s, name = %s, about = %s, about_social_picture = %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""", (unit_name, name, about, about_social_picture, modified, added, tags, is_canceled, accepted, denied, is_visible, is_posted_tg, - id_event, number) + new_marked_to_publication, id_event, number) ) 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}" if name_changed and PROCESS_EVENT_UPDATES: update_msg += ". Флаг публикации сброшен." elif name_changed and not PROCESS_EVENT_UPDATES: 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) connection.commit()