групповая привязка по тэгам
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2025-09-29 19:51:02 +03:00
parent f40dbbf41d
commit 7602c60bd6
2 changed files with 291 additions and 0 deletions
+83
View File
@@ -1283,6 +1283,89 @@ def api_venue_events(venue_name):
finally:
db.close()
# API endpoints для работы с тэгами
@bp.route('/api/tags')
@login_required
def api_tags():
"""Получает список всех уникальных тэгов с количеством событий"""
db = get_db()
try:
with db.conn.cursor() as cursor:
# Получаем все тэги и разбиваем их по пробелам
cursor.execute("""
SELECT tags
FROM events
WHERE tags IS NOT NULL AND tags != ''
""")
events = cursor.fetchall()
# Собираем все уникальные тэги
tag_counts = {}
for event in events:
tags = event['tags'].split()
for tag in tags:
tag = tag.strip()
if tag:
tag_counts[tag] = tag_counts.get(tag, 0) + 1
# Сортируем по количеству событий (убывание), затем по названию
sorted_tags = sorted(tag_counts.items(), key=lambda x: (-x[1], x[0]))
tags_list = []
for tag, count in sorted_tags:
tags_list.append({
'name': tag,
'event_count': count
})
return jsonify(tags_list)
except Exception as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
@bp.route('/api/tags/<tag_name>/events')
@login_required
def api_tag_events(tag_name):
"""Получает список событий для указанного тэга с информацией о привязке к посту"""
post_id = request.args.get('post_id')
if not post_id:
return jsonify({'error': 'post_id parameter is required'}), 400
db = get_db()
try:
with db.conn.cursor() as cursor:
# Получаем события с указанным тэгом с информацией о привязке к посту
cursor.execute("""
SELECT e.id, e.name, e.number, e.unit_name, e.tags,
CASE WHEN i.post_id IS NOT NULL THEN 1 ELSE 0 END as linked
FROM events e
LEFT JOIN interlinks i ON e.id = i.event_id AND i.post_id = %s
WHERE e.tags LIKE %s
ORDER BY e.name
""", (post_id, f'%{tag_name}%'))
events = cursor.fetchall()
events_list = []
for event in events:
# Проверяем, что тэг действительно присутствует (не подстрока другого тэга)
tags = event['tags'].split() if event['tags'] else []
if tag_name in tags:
events_list.append({
'id': event['id'],
'name': event['name'],
'number': event['number'],
'unit_name': event['unit_name'],
'tags': event['tags'],
'linked': bool(event['linked'])
})
return jsonify(events_list)
except Exception as e:
return jsonify({'error': str(e)}), 500
finally:
db.close()
@bp.route('/image_proxy')
@login_required
def image_proxy():