261 lines
9.3 KiB
Python
261 lines
9.3 KiB
Python
"""Наполнение демонстрационными данными."""
|
||
|
||
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()
|