from calendar import Calendar
from collections import Counter
MONTH_NAMES = [
"", "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь",
]
STATUS_LABELS = {
"present": "Присутствовал",
"absent": "Отсутствовал",
"late": "Опоздал",
"excused": "Уважительная",
}
STATUS_COLORS = {
"present": "success",
"absent": "danger",
"late": "warning",
"excused": "info",
}
def intern_stats(intern_id: int, date_from=None, date_to=None) -> dict:
from app.models import Attendance
q = Attendance.query.filter_by(intern_id=intern_id)
if date_from:
q = q.filter(Attendance.date >= date_from)
if date_to:
q = q.filter(Attendance.date <= date_to)
records = q.all()
total = len(records)
counts = Counter(r.status for r in records)
present_like = counts.get("present", 0) + counts.get("late", 0)
rate = round(present_like / total * 100, 1) if total else 0.0
return {
"total": total,
"present": counts.get("present", 0),
"absent": counts.get("absent", 0),
"late": counts.get("late", 0),
"excused": counts.get("excused", 0),
"rate": rate,
}
def center_stats(date_from=None, date_to=None, mentor_id: int | None = None) -> dict:
from app.models import Attendance, Intern
q = Intern.query
if mentor_id:
q = q.filter(Intern.mentor_id == mentor_id)
interns = q.all()
intern_ids = [i.id for i in interns]
if not intern_ids:
return {
"interns_count": 0,
"records": 0,
"rate": 0.0,
"by_status": {},
}
aq = Attendance.query.filter(Attendance.intern_id.in_(intern_ids))
if date_from:
aq = aq.filter(Attendance.date >= date_from)
if date_to:
aq = aq.filter(Attendance.date <= date_to)
records = aq.all()
total = len(records)
counts = Counter(r.status for r in records)
present_like = counts.get("present", 0) + counts.get("late", 0)
rate = round(present_like / total * 100, 1) if total else 0.0
return {
"interns_count": len(intern_ids),
"records": total,
"rate": rate,
"by_status": dict(counts),
}
def monthly_calendar(year: int, month: int):
"""Список недель (по 7 datetime.date), неделя начинается с понедельника."""
return Calendar(firstweekday=0).monthdatescalendar(year, month)