91 lines
3.8 KiB
Python
91 lines
3.8 KiB
Python
import sqlite3
|
||
import json
|
||
from pathlib import Path
|
||
|
||
DB_PATH = Path("/home/ai-projects/services/study.qpid.pro/data/notes.db")
|
||
TARGET_MD = Path("/home/ai-projects/services/study.qpid.pro/data/USER_REPORTS.md")
|
||
MEMORY_MD = Path("/home/ai-projects/memory/USER_REPORTS.md")
|
||
|
||
def sync():
|
||
if not DB_PATH.exists():
|
||
print("Database not found")
|
||
return
|
||
|
||
conn = sqlite3.connect(DB_PATH)
|
||
conn.row_factory = sqlite3.Row
|
||
|
||
rows = conn.execute("""
|
||
SELECT f.id, f.category, f.message, f.context_url, f.context_data_json, f.status, f.created_at, f.updated_at, u.username
|
||
FROM feedback_reports f
|
||
JOIN users u ON f.user_id = u.id
|
||
ORDER BY f.id DESC
|
||
""").fetchall()
|
||
|
||
lines = [
|
||
"# 📋 Пользовательские репорты & Запросы на доработку (study.qpid.pro)",
|
||
"",
|
||
"> 🔄 Данный файл автоматически синхронизируется с виджетом обратной связи на сайте.",
|
||
"> AI-ассистент (Antigravity) считывает этот файл для анализа найденных багов и планирования задач.",
|
||
"",
|
||
f"**Всего репортов:** {len(rows)} | **Последняя синхронизация:** сейчас",
|
||
"",
|
||
"## 🔴 Активные репорты (Требуют внимания / В работе)",
|
||
"",
|
||
]
|
||
|
||
active_rows = [r for r in rows if r["status"] in ("new", "in_progress")]
|
||
resolved_rows = [r for r in rows if r["status"] in ("resolved", "closed")]
|
||
|
||
if not active_rows:
|
||
lines.append("🎉 *Активных багов или задач нет! Все известные репорты закрыты.*")
|
||
lines.append("")
|
||
else:
|
||
for r in active_rows:
|
||
cat_emoji = "🐛 БАГ" if r["category"] == "bug" else ("💡 ФИЧА" if r["category"] == "feature" else "📝 ЗАМЕТКА")
|
||
status_icon = "🆕 Новый" if r["status"] == "new" else "⏳ В работе"
|
||
|
||
ctx_extra = ""
|
||
if r["context_data_json"]:
|
||
try:
|
||
c_dict = json.loads(r["context_data_json"])
|
||
parts = []
|
||
if "screen" in c_dict:
|
||
parts.append(f"Экран: {c_dict['screen']}")
|
||
if "device" in c_dict:
|
||
parts.append(f"Устройство: {c_dict['device']}")
|
||
if parts:
|
||
ctx_extra = f" ({', '.join(parts)})"
|
||
except Exception:
|
||
pass
|
||
|
||
lines.append(f"### #{r['id']} [{cat_emoji}] — {status_icon} (`{r['created_at']}`)")
|
||
lines.append(f"- **Пользователь**: `{r['username']}`")
|
||
if r["context_url"]:
|
||
lines.append(f"- **Раздел/Страница**: `{r['context_url']}`{ctx_extra}")
|
||
lines.append(f"- **Текст**:\n> {r['message'].strip()}")
|
||
lines.append("")
|
||
|
||
lines.extend([
|
||
"---",
|
||
"",
|
||
"## ✅ Решенные / Закрытые задачи",
|
||
"",
|
||
])
|
||
|
||
if not resolved_rows:
|
||
lines.append("*Пока нет закрытых репортов.*")
|
||
lines.append("")
|
||
else:
|
||
for r in resolved_rows:
|
||
cat_emoji = "🐛" if r["category"] == "bug" else ("💡" if r["category"] == "feature" else "📝")
|
||
lines.append(f"- [x] **#{r['id']} {cat_emoji} ({r['created_at']})**: {r['message'].strip()} *(Страница: {r['context_url'] or 'общая'})*")
|
||
lines.append("")
|
||
|
||
content = "\n".join(lines)
|
||
TARGET_MD.write_text(content, encoding="utf-8")
|
||
MEMORY_MD.write_text(content, encoding="utf-8")
|
||
print(f"Synced {len(rows)} reports successfully!")
|
||
|
||
if __name__ == "__main__":
|
||
sync()
|