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 — наставник")