from flask import Blueprint, render_template, jsonify from flask_login import login_required, current_user from app.models.reservation import Reservation from app.models.classroom import Classroom from app.models.subject import Subject from datetime import datetime, timedelta from sqlalchemy import func main_bp = Blueprint('main', __name__) @main_bp.route('/') @login_required def dashboard(): """Main dashboard page""" # Get statistics total_classrooms = Classroom.query.filter_by(is_active=True).count() total_subjects = Subject.query.filter_by(is_active=True).count() # Get today's reservations today = datetime.utcnow().date() today_reservations = Reservation.query.filter( func.date(Reservation.start_time) == today ).count() # Get this week's reservations week_start = today - timedelta(days=today.weekday()) week_end = week_start + timedelta(days=6) week_reservations = Reservation.query.filter( func.date(Reservation.start_time) >= week_start, func.date(Reservation.start_time) <= week_end ).count() # Get upcoming reservations (next 7 days) upcoming_reservations = Reservation.query.filter( Reservation.start_time >= datetime.utcnow(), Reservation.start_time <= datetime.utcnow() + timedelta(days=7), Reservation.status.in_(['CONFIRMED', 'PENDING']) ).join(Classroom).join(Subject).limit(10).all() stats = { 'total_classrooms': total_classrooms, 'total_subjects': total_subjects, 'today_reservations': today_reservations, 'week_reservations': week_reservations } return render_template('dashboard.html', stats=stats, upcoming_reservations=upcoming_reservations) @main_bp.route('/api/dashboard-stats') @login_required def dashboard_stats_api(): """API endpoint for dashboard statistics""" # Get today's data today = datetime.utcnow().date() today_reservations = Reservation.query.filter( func.date(Reservation.start_time) == today ).count() # Get this week's data week_start = today - timedelta(days=today.weekday()) week_end = week_start + timedelta(days=6) week_reservations = Reservation.query.filter( func.date(Reservation.start_time) >= week_start, func.date(Reservation.start_time) <= week_end ).count() # Get monthly data for chart current_date = datetime.utcnow() monthly_data = [] for i in range(12): month_date = current_date - timedelta(days=30 * i) month_start = month_date.replace(day=1) month_end = (month_start + timedelta(days=32)).replace(day=1) - timedelta(days=1) monthly_reservations = Reservation.query.filter( func.date(Reservation.start_time) >= month_start.date(), func.date(Reservation.start_time) <= month_end.date() ).count() monthly_data.append({ 'month': month_start.strftime('%Y-%m'), 'reservations': monthly_reservations }) return jsonify({ 'today_reservations': today_reservations, 'week_reservations': week_reservations, 'monthly_data': list(reversed(monthly_data)) })