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


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(seed_demo)

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

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

    # Сотрудник центра
    center = User(username="center", full_name="Смирнова Ольга (Центр)", role="center")
    center.set_password("center123")
    db.session.add(center)

    # Наставники
    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)
    db.session.flush()

    # Стажёры
    interns_data = [
        ("Смирнов Алексей", "Backend", "offline", 0, 30),
        ("Кузнецова Анна", "Frontend", "online", 0, 45),
        ("Попов Дмитрий", "Data Science", "offline", 0, -5), # Просрочен (для теста)
        ("Соколова Екатерина", "QA", "online", 1, 60),
    ]
    interns = []
    for name, direction, itype, m_idx, days_left in interns_data:
        i = Intern(
            full_name=name, 
            direction=direction,
            internship_type=itype,
            mentor_id=users[m_idx].id,
            start_date=date.today() - timedelta(days=30),
            end_date=date.today() + timedelta(days=days_left),
            is_archived=False
        )
        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("  center / center123 — Сотрудник центра")
    click.echo("  ivanov / mentor123 — Наставник")