alabuga/scripts/seed_data.py
danilgryaznev e050bd46ef 1 vers
2025-09-21 19:30:55 +02:00

261 lines
9.3 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.security import get_password_hash
from app.db.session import SessionLocal, engine
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.store import StoreItem
from app.models.user import Competency, CompetencyCategory, User, UserCompetency, UserRole
DATA_SENTINEL = Path("/data/.seeded")
def ensure_database() -> None:
"""Создаём таблицы, если их ещё нет."""
from app.models.base import Base
Base.metadata.create_all(bind=engine)
def seed() -> None:
if DATA_SENTINEL.exists():
print("Database already seeded, skipping")
return
ensure_database()
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,
)
hr = User(
email="hr@alabuga.space",
full_name="Мария HR",
role=UserRole.HR,
hashed_password=get_password_hash("orbita123"),
current_rank_id=ranks[2].id,
)
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.commit()
DATA_SENTINEL.write_text("seeded")
print("Seed data created")
finally:
session.close()
if __name__ == "__main__":
seed()