[ВОЛК] загрузка всех событий по всем категориям и соответствующая кнопка
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2025-11-15 21:11:14 +03:00
parent 2c84256634
commit 4a58a80401
3 changed files with 116 additions and 1 deletions
+21 -1
View File
@@ -24,7 +24,7 @@ from tg_publish import publish_to_tg_all, publish_to_tg
from db_update_shortname import ai_shortname_all, generate_ai_shortname from db_update_shortname import ai_shortname_all, generate_ai_shortname
from evtg_publish import tg_post_event_by_id, tg_post_all_events from evtg_publish import tg_post_event_by_id, tg_post_all_events
from zk_load import load_json_all from zk_load import load_json_all
from volk_load import load_categories from volk_load import load_categories, load_all_events
# Загружаем настройки из .env # Загружаем настройки из .env
load_dotenv() load_dotenv()
@@ -1092,6 +1092,26 @@ def api_load_categories():
log_event(error_msg) log_event(error_msg)
return jsonify({'success': False, 'error': error_msg}), 500 return jsonify({'success': False, 'error': error_msg}), 500
@bp.route('/api/run_volk_rescan', methods=['POST'])
@login_required
def api_run_volk_rescan():
try:
# Проверка режима работы
workmode = os.getenv('WORKMODE', 'ZILANT')
if workmode != 'VOLK':
error_msg = "Рескан ВОЛК доступен только в режиме VOLK"
log_event(error_msg)
return jsonify({'success': False, 'error': error_msg}), 403
log_event("Запуск рескана ВОЛК...")
load_all_events()
log_event("Рескан ВОЛК выполнен успешно")
return jsonify({'success': True})
except Exception as e:
error_msg = f"Ошибка при рескане ВОЛК: {str(e)}"
log_event(error_msg)
return jsonify({'success': False, 'error': error_msg}), 500
@bp.route('/api/publish_event/<int:event_id>', methods=['POST']) @bp.route('/api/publish_event/<int:event_id>', methods=['POST'])
@login_required @login_required
def api_publish_event(event_id): def api_publish_event(event_id):
+37
View File
@@ -557,6 +557,11 @@
<!-- Вкладка событий --> <!-- Вкладка событий -->
<div class="tab-pane fade" id="events-tab-pane" role="tabpanel" aria-labelledby="events-tab" tabindex="0"> <div class="tab-pane fade" id="events-tab-pane" role="tabpanel" aria-labelledby="events-tab" tabindex="0">
<div class="top-action-buttons d-flex align-items-center"> <div class="top-action-buttons d-flex align-items-center">
{% if g.workmode == 'VOLK' %}
<button class="btn btn-primary me-2" id="volk-rescan-btn">
<i class="fas fa-search me-1"></i> Рескан ВОЛК
</button>
{% endif %}
<button class="btn btn-success" id="add-event-btn"> <button class="btn btn-success" id="add-event-btn">
<i class="fas fa-plus me-1"></i> Добавить событие <i class="fas fa-plus me-1"></i> Добавить событие
</button> </button>
@@ -862,6 +867,12 @@
}, 50); }, 50);
}); });
// Новые обработчики для кнопок событий // Новые обработчики для кнопок событий
{% if g.workmode == 'VOLK' %}
const volkRescanBtn = document.getElementById('volk-rescan-btn');
if (volkRescanBtn) {
volkRescanBtn.addEventListener('click', runVolkRescan);
}
{% endif %}
{% if g.workmode == 'ZILANT' %} {% if g.workmode == 'ZILANT' %}
const zkRescanBtn = document.getElementById('zk-rescan-btn'); const zkRescanBtn = document.getElementById('zk-rescan-btn');
if (zkRescanBtn) { if (zkRescanBtn) {
@@ -962,6 +973,32 @@
alert('Произошла ошибка при рескане Зилант-сервера'); alert('Произошла ошибка при рескане Зилант-сервера');
}); });
} }
// Рескан ВОЛК
function runVolkRescan() {
showProcessingMessage("Рескан ВОЛК...");
fetch(`${PREFIX}/api/run_volk_rescan`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.json())
.then(data => {
hideProcessingMessage();
if (data.success) {
alert('Рескан ВОЛК выполнен успешно!');
loadEvents();
} else {
alert('Ошибка рескана ВОЛК: ' + (data.error || 'неизвестная ошибка'));
}
})
.catch(error => {
hideProcessingMessage();
console.error('Ошибка рескана ВОЛК:', error);
alert('Произошла ошибка при рескане ВОЛК');
});
}
// Функция для публикации всех событий // Функция для публикации всех событий
function publishAllEvents() { function publishAllEvents() {
const currentEventId = selectedEventId; const currentEventId = selectedEventId;
+58
View File
@@ -378,6 +378,64 @@ def load_events_by_category(category_id):
cursor.close() cursor.close()
connection.close() connection.close()
def load_all_events():
"""Экспортируемая функция для загрузки всех событий по всем категориям"""
try:
log_message("Начало загрузки всех событий по всем категориям")
# Подключение к базе данных
connection = mysql.connector.connect(
host=MDB_HOST,
user=MDB_USER,
password=MDB_PW,
database=MDBASE
)
cursor = connection.cursor(dictionary=True)
# Получаем список всех категорий
cursor.execute("SELECT ID FROM categories ORDER BY ID")
categories = cursor.fetchall()
if not categories:
log_message("В базе данных нет категорий для загрузки событий", "WARNING")
cursor.close()
connection.close()
return
log_message(f"Найдено {len(categories)} категорий для обработки")
# Закрываем соединение перед вызовами load_events_by_category
# (так как она создает свое соединение)
cursor.close()
connection.close()
# Загружаем события для каждой категории
processed_count = 0
for category in categories:
category_id = category['ID']
try:
log_message(f"Обработка категории {category_id} ({processed_count + 1}/{len(categories)})")
load_events_by_category(category_id)
processed_count += 1
except Exception as e:
error_msg = f"Ошибка при загрузке событий для категории {category_id}: {e}"
log_message(error_msg, "ERROR")
print(error_msg)
# Продолжаем обработку других категорий
continue
log_message(f"Завершение загрузки всех событий. Обработано категорий: {processed_count}/{len(categories)}")
except Error as e:
error_msg = f"Ошибка базы данных при загрузке всех событий: {e}"
log_message(error_msg, "ERROR")
print(error_msg)
except Exception as e:
error_msg = f"Общая ошибка при загрузке всех событий: {e}"
log_message(error_msg, "ERROR")
print(error_msg)
if __name__ == "__main__": if __name__ == "__main__":
load_categories() load_categories()