Загрузка данных
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"))