#!/usr/bin/env python3 """ CSV генератор для проверки сырых данных """ import psycopg2 import json import csv from urllib.parse import unquote from datetime import datetime # Конфигурация БД DB_CONFIG = { 'host': '147.45.189.234', 'port': 5432, 'database': 'default_db', 'user': 'gen_user', 'password': unquote('2~~9_%5EkVsU%3F2%5CS') } def get_audit_results_from_db(): """Получить результаты аудита из БД""" try: conn = psycopg2.connect(**DB_CONFIG) cursor = conn.cursor() cursor.execute(""" SELECT ar.hotel_id, hm.full_name, hm.website_address, hm.rkn_registry_status, hm.rkn_registry_number, hm.rkn_registry_date, ar.score_percentage, ar.criteria_results, hm.created_at FROM hotel_audit_results ar JOIN hotel_main hm ON ar.hotel_id = hm.id WHERE hm.region_name = 'Чукотский автономный округ' ORDER BY hm.created_at DESC """) results = [] for row in cursor.fetchall(): # Конвертируем в словарь result = { 'hotel_id': row[0], 'full_name': row[1], 'website_address': row[2], 'rkn_registry_status': row[3], 'rkn_registry_number': row[4], 'rkn_registry_date': row[5], 'score_percentage': row[6], 'criteria_results': row[7], 'created_at': row[8] } results.append(result) cursor.close() conn.close() return results except Exception as e: print(f"❌ Ошибка получения данных: {e}") return [] def create_csv_report(results): """Создать CSV отчёт""" timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"audit_debug_{timestamp}.csv" with open(filename, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) # Заголовки headers = [ 'ID отеля', 'Название отеля', 'Сайт', 'Балл (%)', 'Дата аудита', 'РКН статус', 'РКН номер', 'РКН дата' ] # Добавляем заголовки критериев if results and results[0]['criteria_results']: criteria_results = results[0]['criteria_results'] if isinstance(criteria_results, str): criteria_results = json.loads(criteria_results) if isinstance(criteria_results, list): for criterion_idx, criterion in enumerate(criteria_results): # Пропускаем критерий 6 (РКН) - он будет отдельно if criterion_idx == 5: # индекс 5 = критерий 6 continue criterion_name = f"Критерий_{criterion_idx+1}" headers.extend([ f"{criterion_name}_Статус", f"{criterion_name}_URL", f"{criterion_name}_Комментарий" ]) # Добавляем РКН колонки headers.extend(['РКН_Реестр', 'РКН_Номер_Дата', 'РКН_Ссылка']) writer.writerow(headers) # Данные for result in results: row = [ result['hotel_id'], result['full_name'], result['website_address'] or '-', result['score_percentage'], str(result['created_at'])[:10] ] # РКН данные из hotel_main rkn_status = result.get('rkn_registry_status', '') rkn_in_registry = "ДА" if rkn_status and rkn_status.lower() == 'found' else "НЕТ" rkn_number = result.get('rkn_registry_number', '') rkn_date = result.get('rkn_registry_date', '') rkn_info_text = f"{rkn_number}\n{rkn_date}" if rkn_number or rkn_date else "-" rkn_url = f"https://rkn.gov.ru/mass-communications/reestr/search/?q={rkn_number}" if rkn_number else "-" row.extend([rkn_in_registry, rkn_info_text, rkn_url]) # Данные критериев criteria_results = result['criteria_results'] if isinstance(criteria_results, str): criteria_results = json.loads(criteria_results) if isinstance(criteria_results, list): for criterion_idx, criterion in enumerate(criteria_results): # Пропускаем критерий 6 (РКН) - он будет отдельно if criterion_idx == 5: continue # Статус status = "ДА" if criterion.get('found') else "НЕТ" # URL url = '-' if criterion.get('ai_agent', {}).get('url'): url = criterion['ai_agent']['url'] # Комментарий comment = "Не найдено" if criterion.get('found'): if criterion.get('ai_agent', {}).get('details'): comment = criterion['ai_agent']['details'] elif criterion.get('ai_agent', {}).get('quote'): comment = criterion['ai_agent']['quote'] elif criterion.get('regex', {}).get('extracted'): comment = criterion['regex']['extracted'] row.extend([status, url, comment]) writer.writerow(row) return filename def main(): """Основная функция""" print("🚀 ГЕНЕРАЦИЯ CSV ДЛЯ ДЕБАГА") print("=" * 40) try: # Получаем данные print("📡 Подключаюсь к БД...") results = get_audit_results_from_db() if not results: print("❌ Нет данных для отчёта") return print(f"✅ Получено результатов: {len(results)}") # Выводим сырые данные первого отеля if results: print("\n🔍 СЫРЫЕ ДАННЫЕ ПЕРВОГО ОТЕЛЯ:") print(f"ID: {results[0]['hotel_id']}") print(f"Название: {results[0]['full_name']}") print(f"Сайт: {results[0]['website_address']}") print(f"РКН статус: {results[0]['rkn_registry_status']}") print(f"РКН номер: {results[0]['rkn_registry_number']}") print(f"РКН дата: {results[0]['rkn_registry_date']}") print(f"Балл: {results[0]['score_percentage']}") criteria_results = results[0]['criteria_results'] if isinstance(criteria_results, str): criteria_results = json.loads(criteria_results) print(f"\n📊 КРИТЕРИИ ({len(criteria_results)} шт.):") for i, criterion in enumerate(criteria_results): if isinstance(criterion, dict): print(f" {i+1}. {criterion.get('criterion_name', f'Критерий {i+1}')}: {criterion.get('found', False)}") else: print(f" {i+1}. {criterion} (тип: {type(criterion)})") # Создаём CSV filename = create_csv_report(results) print(f"\n✅ CSV файл сохранён: {filename}") print(f"📊 Обработано отелей: {len(results)}") if results: avg_score = sum(r['score_percentage'] for r in results) / len(results) print(f"📈 Средний % соответствия: {avg_score:.1f}%") except Exception as e: print(f"❌ Ошибка: {e}") import traceback traceback.print_exc() if __name__ == "__main__": main()