alabuga/scripts/seed_data.py
2025-09-27 22:38:59 +03:00

290 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Наполнение демонстрационными данными."""
from __future__ import annotations
from pathlib import Path
import sys
from sqlalchemy.orm import Session
ROOT = Path(__file__).resolve().parents[1]
sys.path.append(str(ROOT / 'backend'))
from app.core.config import settings
from app.core.security import get_password_hash
from app.db.session import SessionLocal
from app.models.artifact import Artifact, ArtifactRarity
from app.models.branch import Branch, BranchMission
from app.models.mission import Mission, MissionCompetencyReward, MissionDifficulty
from app.models.rank import Rank, RankCompetencyRequirement, RankMissionRequirement
from app.models.onboarding import OnboardingSlide
from app.models.store import StoreItem
from app.models.user import Competency, CompetencyCategory, User, UserCompetency, UserRole
from app.main import run_migrations
DATA_SENTINEL = settings.sqlite_path.parent / ".seeded"
def seed() -> None:
if DATA_SENTINEL.exists():
print("Database already seeded, skipping")
return
# Перед наполнением БД убеждаемся, что применены все миграции.
run_migrations()
session: Session = SessionLocal()
try:
# Компетенции
competencies = [
Competency(
name="Навигация",
description="Умение ориентироваться в процессах Алабуги",
category=CompetencyCategory.ANALYTICS,
),
Competency(
name="Коммуникация",
description="Чётко объяснять свои идеи",
category=CompetencyCategory.COMMUNICATION,
),
Competency(
name="Инженерия",
description="Работа с технологиями и оборудованием",
category=CompetencyCategory.TECH,
),
Competency(
name="Командная работа",
description="Поддержка экипажа",
category=CompetencyCategory.TEAMWORK,
),
Competency(
name="Лидерство",
description="Вести за собой",
category=CompetencyCategory.LEADERSHIP,
),
Competency(
name="Культура",
description="Следование лору Алабуги",
category=CompetencyCategory.CULTURE,
),
]
session.add_all(competencies)
session.flush()
# Ранги
ranks = [
Rank(title="Искатель", description="Первое знакомство с космофлотом", required_xp=0),
Rank(title="Пилот-кандидат", description="Готовится к старту", required_xp=200),
Rank(title="Член экипажа", description="Активно выполняет миссии", required_xp=500),
]
session.add_all(ranks)
session.flush()
# Артефакты
artifacts = [
Artifact(
name="Значок Буран",
description="Памятный знак о легендарном корабле",
rarity=ArtifactRarity.RARE,
),
Artifact(
name="Патч экипажа",
description="Показывает принадлежность к команде",
rarity=ArtifactRarity.COMMON,
),
]
session.add_all(artifacts)
session.flush()
# Ветка миссий
branch = Branch(
title="Получение оффера",
description="Путь кандидата от знакомства до выхода на орбиту",
category="quest",
)
session.add(branch)
session.flush()
# Миссии
mission_documents = Mission(
title="Загрузка документов",
description="Соберите полный пакет документов для HR",
xp_reward=100,
mana_reward=50,
difficulty=MissionDifficulty.EASY,
minimum_rank_id=ranks[0].id,
artifact_id=artifacts[1].id,
)
mission_resume = Mission(
title="Резюме астронавта",
description="Обновите резюме с акцентом на космический опыт",
xp_reward=120,
mana_reward=60,
difficulty=MissionDifficulty.MEDIUM,
minimum_rank_id=ranks[0].id,
)
mission_interview = Mission(
title="Собеседование с капитаном",
description="Пройдите собеседование и докажите готовность",
xp_reward=180,
mana_reward=80,
difficulty=MissionDifficulty.MEDIUM,
minimum_rank_id=ranks[1].id,
artifact_id=artifacts[0].id,
)
mission_onboarding = Mission(
title="Онбординг экипажа",
description="Познакомьтесь с кораблём и командой",
xp_reward=200,
mana_reward=100,
difficulty=MissionDifficulty.HARD,
minimum_rank_id=ranks[1].id,
)
session.add_all([mission_documents, mission_resume, mission_interview, mission_onboarding])
session.flush()
session.add_all(
[
MissionCompetencyReward(
mission_id=mission_documents.id,
competency_id=competencies[1].id,
level_delta=1,
),
MissionCompetencyReward(
mission_id=mission_resume.id,
competency_id=competencies[0].id,
level_delta=1,
),
MissionCompetencyReward(
mission_id=mission_interview.id,
competency_id=competencies[1].id,
level_delta=1,
),
MissionCompetencyReward(
mission_id=mission_onboarding.id,
competency_id=competencies[3].id,
level_delta=1,
),
]
)
session.add_all(
[
BranchMission(branch_id=branch.id, mission_id=mission_documents.id, order=1),
BranchMission(branch_id=branch.id, mission_id=mission_resume.id, order=2),
BranchMission(branch_id=branch.id, mission_id=mission_interview.id, order=3),
BranchMission(branch_id=branch.id, mission_id=mission_onboarding.id, order=4),
]
)
session.add_all(
[
RankMissionRequirement(rank_id=ranks[1].id, mission_id=mission_documents.id),
RankMissionRequirement(rank_id=ranks[1].id, mission_id=mission_resume.id),
RankMissionRequirement(rank_id=ranks[2].id, mission_id=mission_interview.id),
RankMissionRequirement(rank_id=ranks[2].id, mission_id=mission_onboarding.id),
]
)
session.add_all(
[
RankCompetencyRequirement(
rank_id=ranks[1].id,
competency_id=competencies[1].id,
required_level=1,
),
RankCompetencyRequirement(
rank_id=ranks[2].id,
competency_id=competencies[3].id,
required_level=1,
),
]
)
# Магазин
session.add_all(
[
StoreItem(
name="Экскурсия по космодрому",
description="Личный тур по цехам Алабуги",
cost_mana=200,
stock=5,
),
StoreItem(
name="Мерч экипажа",
description="Футболка с эмблемой миссии",
cost_mana=150,
stock=10,
),
]
)
# Пользователи
pilot = User(
email="candidate@alabuga.space",
full_name="Алексей Пилотов",
role=UserRole.PILOT,
hashed_password=get_password_hash("orbita123"),
current_rank_id=ranks[0].id,
is_email_confirmed=True,
# Эти два поля демонстрируют, как HR видит пожелания кандидата.
preferred_branch="Получение оффера",
motivation="Хочу пройти все миссии и закрепиться в экипаже.",
)
hr = User(
email="hr@alabuga.space",
full_name="Мария HR",
role=UserRole.HR,
hashed_password=get_password_hash("orbita123"),
current_rank_id=ranks[2].id,
is_email_confirmed=True,
# Для HR поле также используем — служит подсказкой в профиле.
preferred_branch="Куратор миссий",
)
session.add_all([pilot, hr])
session.flush()
session.add_all(
[
UserCompetency(user_id=pilot.id, competency_id=competencies[1].id, level=1),
UserCompetency(user_id=pilot.id, competency_id=competencies[0].id, level=1),
]
)
session.add_all(
[
OnboardingSlide(
order=1,
title="Добро пожаловать в орбитальный флот",
body="Узнайте, как миссии помогают связать карьерные шаги в единую траекторию.",
media_url="https://images.nasa.gov/details-PIA12235",
cta_text="Перейти к миссиям",
cta_link="/missions",
),
OnboardingSlide(
order=2,
title="Получайте опыт и ману",
body="Выполняя задания, вы накапливаете опыт для повышения ранга и ману для магазина.",
media_url="https://images.nasa.gov/details-PIA23499",
),
OnboardingSlide(
order=3,
title="Повышайте ранг до члена экипажа",
body="Закройте ключевые миссии ветки «Получение оффера» и прокачайте компетенции.",
cta_text="Открыть ветку",
cta_link="/missions",
),
]
)
session.commit()
DATA_SENTINEL.write_text("seeded")
print("Seed data created")
finally:
session.close()
if __name__ == "__main__":
seed()