fix & feat: resolve user reports #1 through #8 (TTS voice & speed, modals, scrollbar, CEFR hint, SRS grammar exclusion, global word lookup)
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user