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


from datetime import datetime

from flask import Blueprint, request, redirect, url_for, flash
from flask_login import login_required, current_user

from app.models import db, Intern, Attendance

attendance_bp = Blueprint("attendance", __name__, url_prefix="/attendance")

VALID_STATUSES = {"present", "absent", "late", "excused"}


def _check_intern(intern_id: int):
    intern = Intern.query.get_or_404(intern_id)
    if not current_user.is_admin and intern.mentor_id != current_user.id:
        flash("Нет доступа к этому стажёру", "danger")
        return None
    return intern


@attendance_bp.route("/mark", methods=["POST"])
@login_required
def mark():
    intern_id = request.form.get("intern_id", type=int)
    date_str = request.form.get("date")
    status = request.form.get("status")
    note = (request.form.get("note") or "").strip() or None

    if not intern_id or not date_str or status not in VALID_STATUSES:
        flash("Некорректные данные", "danger")
        return redirect(request.referrer or url_for("main.dashboard"))

    intern = _check_intern(intern_id)
    if intern is None:
        return redirect(url_for("main.dashboard"))

    try:
        d = datetime.strptime(date_str, "%Y-%m-%d").date()
    except ValueError:
        flash("Неверный формат даты", "danger")
        return redirect(request.referrer or url_for("main.dashboard"))

    record = Attendance.query.filter_by(intern_id=intern_id, date=d).first()
    if record:
        record.status = status
        record.note = note
        record.marked_by = current_user.id
    else:
        record = Attendance(
            intern_id=intern_id, date=d, status=status,
            note=note, marked_by=current_user.id,
        )
        db.session.add(record)

    db.session.commit()
    flash("Отметка сохранена", "success")
    return redirect(request.referrer or url_for("interns.detail", intern_id=intern_id))


@attendance_bp.route("/clear", methods=["POST"])
@login_required
def clear():
    intern_id = request.form.get("intern_id", type=int)
    date_str = request.form.get("date")
    intern = _check_intern(intern_id)
    if intern is None:
        return redirect(url_for("main.dashboard"))

    try:
        d = datetime.strptime(date_str, "%Y-%m-%d").date()
    except (ValueError, TypeError):
        flash("Неверный формат даты", "danger")
        return redirect(request.referrer or url_for("main.dashboard"))

    Attendance.query.filter_by(intern_id=intern_id, date=d).delete()
    db.session.commit()
    flash("Отметка удалена", "info")
    return redirect(request.referrer or url_for("interns.detail", intern_id=intern_id))


@attendance_bp.route("/bulk", methods=["POST"])
@login_required
def bulk():
    """Массовая отметка всех стажёров наставника на дату.
    Формат: date=YYYY-MM-DD, status=present|absent|late|excused
    """
    date_str = request.form.get("date")
    status = request.form.get("status")
    if status not in VALID_STATUSES or not date_str:
        flash("Некорректные данные", "danger")
        return redirect(request.referrer or url_for("main.dashboard"))

    try:
        d = datetime.strptime(date_str, "%Y-%m-%d").date()
    except ValueError:
        flash("Неверный формат даты", "danger")
        return redirect(request.referrer or url_for("main.dashboard"))

    q = Intern.query if current_user.is_admin else Intern.query.filter_by(mentor_id=current_user.id)
    interns = q.all()

    for intern in interns:
        record = Attendance.query.filter_by(intern_id=intern.id, date=d).first()
        if record:
            record.status = status
            record.marked_by = current_user.id
        else:
            db.session.add(Attendance(
                intern_id=intern.id, date=d, status=status,
                marked_by=current_user.id,
            ))

    db.session.commit()
    flash(f"Отмечено стажёров: {len(interns)}", "success")
    return redirect(request.referrer or url_for("main.dashboard"))