Обновление конфигурации API ВОЛК для нового события volk26 и улучшение логики обработки событий в коде. Теперь используется id_event для уникальной идентификации событий, что позволяет избежать проблем с дублированием и улучшает логику обновления записей.

This commit is contained in:
2025-12-20 16:52:23 +03:00
parent cf57eb3743
commit e74779fa32
2 changed files with 32 additions and 21 deletions
+3 -3
View File
@@ -98,9 +98,9 @@ DESC_PREFIX = "https://reg.konvent.ru/zk2025/events/actions/"
# VOLK mode API links # VOLK mode API links
# add category ID (volk24_larp for ex.) # add category ID (volk24_larp for ex.)
VOLK_API_VERSION = "1.0" VOLK_API_VERSION = "1.0"
VOLK_CATEGORY_LIST = "https://base-dev.volk-nn.ru/api/categories?event=volk24&form=volk24_event" VOLK_CATEGORY_LIST = "https://base.volk-nn.ru/api/categories?event=volk26&form=volk26_event"
VOLK_CATEGORY_DESC_PREFIX = "https://base-dev.volk-nn.ru/api/category?event=volk24&form=volk24_event&category=" VOLK_CATEGORY_DESC_PREFIX = "https://base.volk-nn.ru/api/category?event=volk26&form=volk26_event&category="
VOLK_EVENT_LIST_PREFIX = "https://base-dev.volk-nn.ru/api/applications?event=volk24&form=volk24_event&apps_on_page=200&page=0&category=" VOLK_EVENT_LIST_PREFIX = "https://base.volk-nn.ru/api/applications?event=volk26&form=volk26_event&apps_on_page=200&page=0&category="
# Event status # Event status
IS_EVENT = true IS_EVENT = true
+29 -18
View File
@@ -292,55 +292,66 @@ def load_events_by_category(category_id):
log_message("Проверка структуры базы данных") log_message("Проверка структуры базы данных")
ensure_database_structure() ensure_database_structure()
# Получаем максимальный number и id_event для всей таблицы, чтобы продолжить нумерацию # Получаем максимальный number для всей таблицы, чтобы продолжить нумерацию
# Значения должны быть уникальными во всей таблице, а не только для категории
cursor.execute( cursor.execute(
"SELECT MAX(number) as max_number, MAX(id_event) as max_id_event FROM events" "SELECT MAX(number) as max_number FROM events"
) )
result = cursor.fetchone() result = cursor.fetchone()
max_number = result['max_number'] or 0 max_number = result['max_number'] or 0
max_id_event = result['max_id_event'] or 0 start_number = max_number + 1
# Используем максимальное значение из обоих полей для начала нумерации
start_number = max(max_number, max_id_event) + 1
# Обработка событий # Обработка событий
current_number = start_number current_number = start_number
for item in events_data: for item in events_data:
# Проверка обязательного поля id
if 'id' not in item or item['id'] is None:
log_message(f"Пропущено событие без id: {item}", "WARNING")
continue
# Проверка обязательного поля title # Проверка обязательного поля title
if 'title' not in item or not item['title']: if 'title' not in item or not item['title']:
log_message(f"Пропущено событие без title: {item}", "WARNING") log_message(f"Пропущено событие без title (id: {item.get('id', 'N/A')}): {item}", "WARNING")
continue continue
# Подготовка значений с маппингом полей # Подготовка значений с маппингом полей
# Преобразуем id в число, если это необходимо
try:
id_event = int(item['id']) # Уникальный идентификатор события из JSON
except (ValueError, TypeError):
log_message(f"Пропущено событие с некорректным id (не число): {item.get('id', 'N/A')}", "WARNING")
continue
name = item.get('title', '') name = item.get('title', '')
about = item.get('announce', '') or '' about = item.get('announce', '') or ''
authors = item.get('authors', '') or '' authors = item.get('authors', '') or ''
about_social_picture = item.get('image', '') or '' about_social_picture = item.get('image', '') or ''
unit_name = category_id unit_name = category_id
# Проверка существующей записи по name (title) # Проверка существующей записи по id_event (уникальный идентификатор)
cursor.execute( cursor.execute(
"SELECT id, name, authors, about, about_social_picture FROM events WHERE name = %s", "SELECT id, id_event, name, authors, about, about_social_picture FROM events WHERE id_event = %s",
(name,) (id_event,)
) )
existing = cursor.fetchone() existing = cursor.fetchone()
if not existing: if not existing:
# Вставка новой записи # Вставка новой записи
# Используем одинаковое значение для id_event и number # Используем id из JSON для id_event, а для number используем автоинкремент
cursor.execute( cursor.execute(
"""INSERT INTO events (id_event, number, unit_name, name, about, about_social_picture, authors) """INSERT INTO events (id_event, number, unit_name, name, about, about_social_picture, authors)
VALUES (%s, %s, %s, %s, %s, %s, %s)""", VALUES (%s, %s, %s, %s, %s, %s, %s)""",
(current_number, current_number, unit_name, name, about, about_social_picture, authors) (id_event, current_number, unit_name, name, about, about_social_picture, authors)
) )
inserted_count += 1 inserted_count += 1
log_message(f"Добавление: Событие '{name}', номер: {current_number}, категория: {category_id}") log_message(f"Добавление: Событие '{name}', id_event: {id_event}, номер: {current_number}, категория: {category_id}")
current_number += 1 current_number += 1
else: else:
# Обновление существующей записи # Обновление существующей записи
needs_update = False needs_update = False
update_fields = [] update_fields = []
if existing['name'] != name:
needs_update = True
update_fields.append('name')
if existing['authors'] != authors: if existing['authors'] != authors:
needs_update = True needs_update = True
update_fields.append('authors') update_fields.append('authors')
@@ -353,14 +364,14 @@ def load_events_by_category(category_id):
if needs_update: if needs_update:
cursor.execute( cursor.execute(
"""UPDATE events SET authors = %s, about = %s, about_social_picture = %s """UPDATE events SET name = %s, authors = %s, about = %s, about_social_picture = %s
WHERE name = %s""", WHERE id_event = %s""",
(authors, about, about_social_picture, name) (name, authors, about, about_social_picture, id_event)
) )
updated_count += 1 updated_count += 1
log_message(f"Обновление: Событие '{name}', обновлены поля: {', '.join(update_fields)}") log_message(f"Обновление: Событие id_event={id_event} '{name}', обновлены поля: {', '.join(update_fields)}")
else: else:
log_message(f"Событие '{name}' без изменений") log_message(f"Событие id_event={id_event} '{name}' без изменений")
connection.commit() connection.commit()