[ВОЛК] отметка всех записей для публикации
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2025-12-25 22:31:50 +03:00
parent 179d78a750
commit 1cda8969db
2 changed files with 169 additions and 1 deletions
+66
View File
@@ -677,6 +677,28 @@ def api_toggle_event_publication(event_id):
finally: finally:
db.close() db.close()
@bp.route('/api/events/mark_all_for_publication', methods=['POST'])
@login_required
def api_mark_all_events_for_publication():
"""Отмечает все события для публикации"""
db = get_db()
try:
with db.conn.cursor() as cursor:
cursor.execute("""
UPDATE events
SET marked_to_publication = 1
WHERE marked_to_publication = 0
""")
count = cursor.rowcount
db.conn.commit()
client_ip = get_client_ip()
log_event(f"Отмечено для публикации: {count} событий, IP {client_ip}")
return jsonify({'success': True, 'count': count})
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 500
finally:
db.close()
@bp.route('/api/events', methods=['POST']) @bp.route('/api/events', methods=['POST'])
@login_required @login_required
def api_add_event(): def api_add_event():
@@ -804,6 +826,28 @@ def api_toggle_publication(post_id):
finally: finally:
db.close() db.close()
@bp.route('/api/posts/mark_all_for_publication', methods=['POST'])
@login_required
def api_mark_all_posts_for_publication():
"""Отмечает все посты для публикации"""
db = get_db()
try:
with db.conn.cursor() as cursor:
cursor.execute("""
UPDATE posts
SET marked_to_publication = 1
WHERE marked_to_publication = 0
""")
count = cursor.rowcount
db.conn.commit()
client_ip = get_client_ip()
log_event(f"Отмечено для публикации: {count} постов, IP {client_ip}")
return jsonify({'success': True, 'count': count})
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 500
finally:
db.close()
@bp.route('/api/posts', methods=['POST']) @bp.route('/api/posts', methods=['POST'])
@login_required @login_required
def api_add_post(): def api_add_post():
@@ -1408,6 +1452,28 @@ def api_toggle_category_publication(category_id):
finally: finally:
db.close() db.close()
@bp.route('/api/categories/mark_all_for_publication', methods=['POST'])
@login_required
def api_mark_all_categories_for_publication():
"""Отмечает все категории для публикации"""
db = get_db()
try:
with db.conn.cursor() as cursor:
cursor.execute("""
UPDATE categories
SET marked_for_publication = 1
WHERE marked_for_publication = 0
""")
count = cursor.rowcount
db.conn.commit()
client_ip = get_client_ip()
log_event(f"Отмечено для публикации: {count} площадок, IP {client_ip}")
return jsonify({'success': True, 'count': count})
except Exception as e:
return jsonify({'success': False, 'error': str(e)}), 500
finally:
db.close()
@bp.route('/api/categories/<category_id>/events_count') @bp.route('/api/categories/<category_id>/events_count')
@login_required @login_required
def api_category_events_count(category_id): def api_category_events_count(category_id):
+103 -1
View File
@@ -469,8 +469,11 @@
<button class="btn btn-primary" id="rescan-btn"> <button class="btn btn-primary" id="rescan-btn">
<i class="fas fa-search me-1"></i> Рескан ВК <i class="fas fa-search me-1"></i> Рескан ВК
</button> </button>
<button class="btn btn-warning me-2" id="mark-all-posts-pub-btn">
<i class="fas fa-check-double me-1"></i> Все - для публикации
</button>
<button class="btn btn-success" id="publish-btn"> <button class="btn btn-success" id="publish-btn">
<i class="fas fa-paper-plane me-1"></i> Опубликовать <i class="fas fa-paper-plane me-1"></i> Опубликовать все
</button> </button>
<button class="btn btn-info" id="generate-names-btn"> <button class="btn btn-info" id="generate-names-btn">
<i class="fas fa-font me-1"></i> Названия <i class="fas fa-font me-1"></i> Названия
@@ -578,6 +581,9 @@
<i class="fas fa-search me-1"></i> Рескан Зилант-сервера <i class="fas fa-search me-1"></i> Рескан Зилант-сервера
</button> </button>
{% endif %} {% endif %}
<button class="btn btn-warning me-2" id="mark-all-events-pub-btn">
<i class="fas fa-check-double me-1"></i> Все - для публикации
</button>
<button class="btn btn-success" id="publish-all-events-btn"> <button class="btn btn-success" id="publish-all-events-btn">
<i class="fas fa-paper-plane me-1"></i> Опубликовать все <i class="fas fa-paper-plane me-1"></i> Опубликовать все
</button> </button>
@@ -668,6 +674,9 @@
<!-- Вкладка площадок --> <!-- Вкладка площадок -->
<div class="tab-pane fade" id="categories-tab-pane" role="tabpanel" aria-labelledby="categories-tab" tabindex="0"> <div class="tab-pane fade" id="categories-tab-pane" role="tabpanel" aria-labelledby="categories-tab" tabindex="0">
<div class="top-action-buttons d-flex align-items-center"> <div class="top-action-buttons d-flex align-items-center">
<button class="btn btn-warning me-2" id="mark-all-categories-pub-btn">
<i class="fas fa-check-double me-1"></i> Все - для публикации
</button>
<button class="btn btn-success me-2" id="publish-all-categories-btn"> <button class="btn btn-success me-2" id="publish-all-categories-btn">
<i class="fas fa-paper-plane me-1"></i> Опубликовать все <i class="fas fa-paper-plane me-1"></i> Опубликовать все
</button> </button>
@@ -927,6 +936,7 @@
loadPosts(); loadPosts();
// Добавляем обработчики для кнопок запуска скриптов // Добавляем обработчики для кнопок запуска скриптов
document.getElementById('rescan-btn').addEventListener('click', runRescanScript); document.getElementById('rescan-btn').addEventListener('click', runRescanScript);
document.getElementById('mark-all-posts-pub-btn').addEventListener('click', markAllPostsForPublication);
document.getElementById('publish-btn').addEventListener('click', runPublishScript); document.getElementById('publish-btn').addEventListener('click', runPublishScript);
document.getElementById('generate-names-btn').addEventListener('click', generateAllShortnames); document.getElementById('generate-names-btn').addEventListener('click', generateAllShortnames);
document.getElementById('refresh-events-btn').addEventListener('click', loadEvents); document.getElementById('refresh-events-btn').addEventListener('click', loadEvents);
@@ -1008,8 +1018,13 @@
zkRescanBtn.addEventListener('click', runZkRescan); zkRescanBtn.addEventListener('click', runZkRescan);
} }
{% endif %} {% endif %}
document.getElementById('mark-all-events-pub-btn').addEventListener('click', markAllEventsForPublication);
document.getElementById('publish-all-events-btn').addEventListener('click', publishAllEvents); document.getElementById('publish-all-events-btn').addEventListener('click', publishAllEvents);
{% if g.workmode == 'VOLK' %} {% if g.workmode == 'VOLK' %}
const markAllCategoriesPubBtn = document.getElementById('mark-all-categories-pub-btn');
if (markAllCategoriesPubBtn) {
markAllCategoriesPubBtn.addEventListener('click', markAllCategoriesForPublication);
}
const publishAllCategoriesBtn = document.getElementById('publish-all-categories-btn'); const publishAllCategoriesBtn = document.getElementById('publish-all-categories-btn');
if (publishAllCategoriesBtn) { if (publishAllCategoriesBtn) {
publishAllCategoriesBtn.addEventListener('click', publishAllCategories); publishAllCategoriesBtn.addEventListener('click', publishAllCategories);
@@ -1164,6 +1179,64 @@
alert('Произошла ошибка при рескане ВОЛК'); alert('Произошла ошибка при рескане ВОЛК');
}); });
} }
// Отметить все посты для публикации
function markAllPostsForPublication() {
if (!confirm('Вы уверены, что хотите отметить все посты для публикации?')) {
return;
}
showProcessingMessage("Отметка всех постов для публикации...");
fetch(`${PREFIX}/api/posts/mark_all_for_publication`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.json())
.then(data => {
hideProcessingMessage();
if (data.success) {
alert(`Отмечено для публикации: ${data.count || 0} постов`);
loadPosts();
} else {
alert('Ошибка: ' + (data.error || 'неизвестная ошибка'));
}
})
.catch(error => {
hideProcessingMessage();
console.error('Ошибка:', error);
alert('Произошла ошибка при отметке постов');
});
}
// Отметить все события для публикации
function markAllEventsForPublication() {
if (!confirm('Вы уверены, что хотите отметить все события для публикации?')) {
return;
}
showProcessingMessage("Отметка всех событий для публикации...");
fetch(`${PREFIX}/api/events/mark_all_for_publication`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.json())
.then(data => {
hideProcessingMessage();
if (data.success) {
alert(`Отмечено для публикации: ${data.count || 0} событий`);
loadEvents();
} else {
alert('Ошибка: ' + (data.error || 'неизвестная ошибка'));
}
})
.catch(error => {
hideProcessingMessage();
console.error('Ошибка:', error);
alert('Произошла ошибка при отметке событий');
});
}
// Функция для публикации всех событий // Функция для публикации всех событий
function publishAllEvents() { function publishAllEvents() {
const currentEventId = selectedEventId; const currentEventId = selectedEventId;
@@ -2272,6 +2345,35 @@
alert('Произошла ошибка при публикации площадки'); alert('Произошла ошибка при публикации площадки');
} }
} }
// Отметить все категории для публикации
function markAllCategoriesForPublication() {
if (!confirm('Вы уверены, что хотите отметить все площадки для публикации?')) {
return;
}
showProcessingMessage("Отметка всех площадок для публикации...");
fetch(`${PREFIX}/api/categories/mark_all_for_publication`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.json())
.then(data => {
hideProcessingMessage();
if (data.success) {
alert(`Отмечено для публикации: ${data.count || 0} площадок`);
loadCategoriesList();
} else {
alert('Ошибка: ' + (data.error || 'неизвестная ошибка'));
}
})
.catch(error => {
hideProcessingMessage();
console.error('Ошибка:', error);
alert('Произошла ошибка при отметке площадок');
});
}
// Публикация всех категорий // Публикация всех категорий
function publishAllCategories() { function publishAllCategories() {
const currentCategoryId = selectedCategoryId; const currentCategoryId = selectedCategoryId;