Files
hotels/generate_csv_fixed.py

224 lines
8.8 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""
ИСПРАВЛЕННЫЙ CSV скрипт - работает напрямую с данными из БД
"""
import psycopg2
import json
import csv
from datetime import datetime
from urllib.parse import unquote
# Конфигурация БД
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():
"""Получить результаты аудита из БД"""
conn = psycopg2.connect(**DB_CONFIG)
cur = conn.cursor()
query = """
SELECT
hotel_id, region_name, hotel_name, website, has_website,
criteria_results, total_score, max_score, score_percentage,
audit_date, audit_version
FROM hotel_audit_results
WHERE audit_version = 'v1.0_with_rkn'
ORDER BY region_name, hotel_name
"""
cur.execute(query)
results = cur.fetchall()
# Преобразуем в словари
columns = [desc[0] for desc in cur.description]
results = [dict(zip(columns, row)) for row in results]
cur.close()
conn.close()
return results
def get_hotel_rkn_info(hotel_ids):
"""Получить РКН информацию для отелей"""
conn = psycopg2.connect(**DB_CONFIG)
cur = conn.cursor()
placeholders = ','.join(['%s'] * len(hotel_ids))
query = f"""
SELECT id, rkn_registry_status, rkn_registry_number, rkn_registry_date
FROM hotel_main
WHERE id IN ({placeholders})
"""
cur.execute(query, hotel_ids)
results = cur.fetchall()
# Преобразуем в словари
columns = [desc[0] for desc in cur.description]
rkn_data = {row[0]: dict(zip(columns, row)) for row in results}
cur.close()
conn.close()
return rkn_data
def create_csv_report(results):
"""Создать CSV отчёт из данных БД"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"audit_fixed_{timestamp}.csv"
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
# Получаем РКН данные для всех отелей
hotel_ids = [str(result['hotel_id']) for result in results]
rkn_data = get_hotel_rkn_info(hotel_ids)
# Заголовки
headers = ['Отель', 'Сайт', 'Есть сайт', 'Балл', 'Процент']
# Добавляем РКН колонки
headers.extend(['6. РКН Реестр', '6. РКН Номер/Дата', '6. РКН Ссылка'])
# Добавляем колонки для всех критериев
print(f"🔍 Отладка: results={len(results)}")
if results:
# Берём критерии из первого результата
first_result = results[0]
print(f"🔍 Отладка: first_result keys={list(first_result.keys())}")
criteria_results = first_result.get('criteria_results')
print(f"🔍 Отладка: criteria_results type={type(criteria_results)}")
print(f"🔍 Отладка: criteria_results bool={bool(criteria_results)}")
if criteria_results:
if isinstance(criteria_results, str):
criteria_results = json.loads(criteria_results)
print(f"🔍 Отладка: criteria_results length={len(criteria_results)}")
print(f"🔍 Отладка: criteria_results keys={list(criteria_results.keys())[:5]}")
for i in range(1, 19): # критерии 1-18
key = f'criterion_{i:02d}'
if key in criteria_results:
criterion_data = criteria_results[key]
criterion_name = criterion_data.get('name', f'Критерий {i}')
headers.extend([
f"{i}. {criterion_name}",
f"{i}. URL",
f"{i}. Комментарий"
])
print(f"🔍 Добавлен критерий {i}: {criterion_name}")
else:
print("🔍 criteria_results пустой или None")
# Добавляем заглушки для критериев
for i in range(1, 19):
headers.extend([
f"{i}. Критерий {i}",
f"{i}. URL",
f"{i}. Комментарий"
])
else:
print("🔍 results пустой")
writer.writerow(headers)
# Данные
for result in results:
row = [
result['hotel_name'],
result.get('website', 'НЕТ САЙТА'),
"Да" if result.get('has_website') else "Нет",
result['total_score'],
f"{result['score_percentage']:.1f}%"
]
# РКН данные
rkn_info = rkn_data.get(str(result['hotel_id']), {})
rkn_status = rkn_info.get('rkn_registry_status', '')
rkn_in_registry = "ДА" if rkn_status and rkn_status.lower() == 'found' else "НЕТ"
rkn_number = rkn_info.get('rkn_registry_number', '')
rkn_date = rkn_info.get('rkn_registry_date', '')
rkn_info_text = f"{rkn_number} {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)
for i in range(1, 19): # критерии 1-18
key = f'criterion_{i:02d}'
if key in criteria_results:
criterion_data = criteria_results[key]
# Статус
status = "ДА" if criterion_data.get('found') else "НЕТ"
# URL
url = '-'
if criterion_data.get('approval_urls'):
url = criterion_data['approval_urls'][0]
# Комментарий
comment = "Не найдено"
if criterion_data.get('found'):
if criterion_data.get('quote'):
comment = criterion_data['quote']
elif criterion_data.get('approval_quotes'):
first_quote = criterion_data['approval_quotes'][0]
if isinstance(first_quote, dict):
comment = first_quote.get('quote', 'Найдено')
else:
comment = str(first_quote)
elif criterion_data.get('keywords_found'):
comment = f"Ключевые слова: {', '.join(criterion_data['keywords_found'])}"
else:
comment = "Найдено"
comment = comment[:100] + "..." if len(comment) > 100 else comment
row.extend([status, url, comment])
writer.writerow(row)
return filename
def main():
"""Основная функция"""
print("🚀 ИСПРАВЛЕННЫЙ CSV СКРИПТ")
print("=" * 40)
# Получаем данные из БД
results = get_audit_results_from_db()
if not results:
print("❌ Нет данных аудита в БД")
return
print(f"📊 Найдено результатов аудита: {len(results)}")
# Создаём CSV отчёт
filename = create_csv_report(results)
print(f"✅ 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}%")
print(f"\n🔍 Для просмотра: head -2 {filename}")
if __name__ == "__main__":
main()