Загрузка данных


import click
from datetime import date, timedelta
from flask import Flask
from flask.cli import with_appcontext

from app.models import db, User, Intern, Attendance


def register_cli(app: Flask) -> None:
    app.cli.add_command(init_db)
    app.cli.add_command(create_admin)
    app.cli.add_command(seed_demo)


@click.command("init-db")
@with_appcontext
def init_db():
    """Создать все таблицы."""
    db.create_all()
    click.echo("✓ База данных инициализирована")


@click.command("create-admin")
@click.option("--username", prompt=True)
@click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True)
@click.option("--full-name", prompt="ФИО")
@with_appcontext
def create_admin(username, password, full_name):
    """Создать администратора центра."""
    if User.query.filter_by(username=username).first():
        click.echo("! Пользователь с таким логином уже существует")
        return
    user = User(username=username, full_name=full_name, role="admin")
    user.set_password(password)
    db.session.add(user)
    db.session.commit()
    click.echo(f"✓ Администратор {username} создан")


@click.command("seed-demo")
@with_appcontext
def seed_demo():
    """Наполнить БД демо-данными (наставники, стажёры, отметки)."""
    if User.query.count() > 0:
        click.echo("! Данные уже есть, пропускаем")
        return

    mentors = [
        ("ivanov", "Иванов Иван Иванович"),
        ("petrova", "Петрова Мария Сергеевна"),
    ]
    users = []
    for username, full_name in mentors:
        u = User(username=username, full_name=full_name, role="mentor")
        u.set_password("mentor123")
        db.session.add(u)
        users.append(u)

    admin = User(username="admin", full_name="Администратор Центра", role="admin")
    admin.set_password("admin123")
    db.session.add(admin)
    db.session.flush()

    interns_data = [
        ("Смирнов Алексей", "Backend-разработка", 0),
        ("Кузнецова Анна", "Frontend-разработка", 0),
        ("Попов Дмитрий", "Data Science", 0),
        ("Соколова Екатерина", "QA-инженерия", 1),
        ("Новиков Павел", "DevOps", 1),
    ]
    interns = []
    for name, direction, m_idx in interns_data:
        i = Intern(
            full_name=name, direction=direction,
            mentor_id=users[m_idx].id,
            start_date=date.today() - timedelta(days=45),
        )
        db.session.add(i)
        interns.append(i)
    db.session.flush()

    import random
    random.seed(42)
    statuses = ["present", "present", "present", "late", "absent", "excused"]
    for i in interns:
        for delta in range(30):
            d = date.today() - timedelta(days=delta)
            if d.weekday() >= 5:
                continue
            status = random.choice(statuses)
            db.session.add(Attendance(intern_id=i.id, date=d, status=status))

    db.session.commit()
    click.echo("✓ Демо-данные добавлены")
    click.echo("  admin / admin123 — администратор")
    click.echo("  ivanov / mentor123 — наставник")
    click.echo("  petrova / mentor123 — наставник")