initial commit (backend)

This commit is contained in:
2026-09-20 11:45:58 +00:00
commit 033adf023e
65 changed files with 28292 additions and 0 deletions
+113
View File
@@ -0,0 +1,113 @@
import re
with open('routers/review.py', 'r') as f:
content = f.read()
# Полный SKILL_TAG_DESCRIPTION (как в learning.py)
full_skill_tags = '''# Понятные названия навыков
SKILL_TAG_DESCRIPTION = """
Понятные названия навыков (используй ИХ в ответе, а не технические ID):
- family_vocabulary → "слова по теме «Семья»"
- family_possessive → "мой/моя (mój/moja)"
- family_accusative → "винительный падеж (mam brata, mam siostrę)"
- family_questions → "вопросы о семье (Masz brata?)"
- family_description → "рассказ о семье"
- family_babcia_dziadek → "бабушка и дедушка"
- family_brat_siostra → "брат и сестра"
- family_masz_mam → "у меня есть / у тебя есть"
- family_duza_mala → "большая/маленькая семья"
- family_mama_tata → "мама и папа"
- family_maz_zona → "муж и жена"
- family_dzieci → "дети"
- family_wujek_ciocia → "дядя и тётя"
- family_kto_to_jest → "вопрос «Кто это?»"
- asking_name → "вопрос «Как тебя зовут?»"
- answering_name → "ответ на вопрос об имени"
- formal_address_pan_pani → "вежливое обращение Pan/Pani"
- greeting_formal → "формальные приветствия"
- greeting_informal → "неформальные приветствия"
- asking_origin → "вопрос «Откуда ты?»"
- answering_origin → "ответ о происхождении"
- asking_residence → "вопрос «Где ты живёшь?»"
- answering_residence → "ответ о месте жительства"
- self_description → "рассказ о себе"
- self_intro → "представление себя"
- how_are_you → "вопрос «Как дела?»"
- responding_how_are_you → "ответ на «Как дела?»"
- farewell_formal → "формальные прощания"
- farewell_informal → "неформальные прощания"
- mieszkac_conjugation → "спряжение глагола mieszkać"
- skad_vs_gdzie → "разница между Skąd и Gdzie"
- country_vocabulary → "названия стран"
- nationality_forms → "национальности"
- city_vocabulary → "названия городов"
- food_vocabulary → "слова по теме «Еда»"
- food_fruits_vegetables → "фрукты и овощи"
- food_drinks → "напитки"
- food_meals → "приёмы пищи"
- food_lubie → "глагол lubić (любить)"
- home_vocabulary → "слова по теме «Дом»"
- home_furniture → "мебель"
- home_location → "предлоги места (w, na)"
- home_ownership → "mam dom, mam mieszkanie"
- home_description → "описание дома/квартиры"
НИКОГДА не пиши технические ID навыков в ответе. Всегда заменяй их на понятные названия из списка выше.
"""'''
# Заменяем короткий SKILL_TAG_DESCRIPTION на полный
content = re.sub(
r'# Понятные названия навыков\nSKILL_TAG_DESCRIPTION = """.*?"""',
full_skill_tags,
content,
flags=re.DOTALL
)
# Добавляем attempts_count >= 2 в SQL
content = content.replace(
''' WHERE user_id = $1
AND (
mastery_score < 75
OR retention_status IN ('needs_review', 'overdue')
OR repeated_error_count > 0
)''',
''' WHERE user_id = $1
AND attempts_count >= 2
AND (
mastery_score < 75
OR retention_status IN ('needs_review', 'overdue')
OR repeated_error_count > 0
)'''
)
# Добавляем regex для удаления технических ID
content = content.replace(
''' data = response.json()
review_text = data["choices"][0]["message"]["content"].strip()
review_text = review_text.replace("**", "").replace("*", "").replace("#", "")''',
''' data = response.json()
review_text = data["choices"][0]["message"]["content"].strip()
review_text = review_text.replace("**", "").replace("*", "").replace("#", "")
# Убираем технические ID в скобках
import re
review_text = re.sub(r'\\s*\\([a-z_]+_[a-z_]+\\), '', review_text)'''
)
# Добавляем правила в промпт
content = content.replace(
'''5. Каждый мини-урок: правило + 2 примера + 1 задание
6. Не пиши технические ID навыков — используй понятные названия
7. Будь дружелюбным и мотивирующим"""''',
'''5. Каждый мини-урок: правило + 2 примера + 1 задание
6. Не пиши технические ID навыков — используй понятные названия
7. Будь дружелюбным и мотивирующим
8. ВАЖНО: Никогда не давай готовый ответ на задание в том же сообщении. Задание должно оставаться открытым.
9. ВАЖНО: В списках слов-подсказок используй только польские слова, без смешения языков.
10. ВАЖНО: Если mastery >= 75 и навык включён из-за retention_status (needs_review/overdue) — формулируй как "быстрое освежение", а не "давай разберём с нуля"."""'''
)
with open('routers/review.py', 'w') as f:
f.write(content)
print("review.py fixed!")