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