Files
LT_Janitorial_Quality_Control/app/routes/dashboard.py
T

96 lines
3.8 KiB
Python

from flask import Blueprint, render_template
from flask_login import login_required, current_user
from app import db # ADD THIS LINE
from app.models.inspection import Inspection, InspectionTemplate
from app.models.facility import Facility
from app.models.issue import Issue
from app.models.user import User
from sqlalchemy import func
from datetime import datetime, timedelta
from app.utils.time_utils import now_eastern
bp = Blueprint('dashboard', __name__)
@bp.route('/')
@bp.route('/dashboard')
@login_required
def index():
# Get today's date range
today_start = now_eastern().replace(hour=0, minute=0, second=0, microsecond=0)
today_end = today_start + timedelta(days=1)
# Statistics for today
if current_user.role == 'inspector':
today_inspections = Inspection.query.filter(
Inspection.inspector_id == current_user.id,
Inspection.inspection_date >= today_start,
Inspection.inspection_date < today_end
).count()
completed_today = Inspection.query.filter(
Inspection.inspector_id == current_user.id,
Inspection.status == 'completed',
Inspection.inspection_date >= today_start,
Inspection.inspection_date < today_end
).count()
open_issues = Issue.query.join(Inspection).filter(
Inspection.inspector_id == current_user.id,
Issue.status.in_(['open', 'in_progress'])
).count()
else:
today_inspections = Inspection.query.filter(
Inspection.inspection_date >= today_start,
Inspection.inspection_date < today_end
).count()
completed_today = Inspection.query.filter(
Inspection.status == 'completed',
Inspection.inspection_date >= today_start,
Inspection.inspection_date < today_end
).count()
open_issues = Issue.query.filter(
Issue.status.in_(['open', 'in_progress'])
).count()
# Calculate average score (last 30 days)
thirty_days_ago = now_eastern() - timedelta(days=30)
avg_score_query = Inspection.query.filter(
Inspection.status == 'completed',
Inspection.overall_score.isnot(None),
Inspection.inspection_date >= thirty_days_ago
)
if current_user.role == 'inspector':
avg_score_query = avg_score_query.filter(Inspection.inspector_id == current_user.id)
avg_score = db.session.query(func.avg(Inspection.overall_score)).filter(
Inspection.status == 'completed',
Inspection.overall_score.isnot(None),
Inspection.inspection_date >= thirty_days_ago,
*([Inspection.inspector_id == current_user.id] if current_user.role == 'inspector' else [])
).scalar()
# Recent inspections
recent_inspections_query = Inspection.query.order_by(Inspection.inspection_date.desc())
if current_user.role == 'inspector':
recent_inspections_query = recent_inspections_query.filter(Inspection.inspector_id == current_user.id)
recent_inspections = recent_inspections_query.limit(5).all()
# System statistics (admin/supervisor only)
total_facilities = Facility.query.filter_by(active=True).count() if current_user.role in ['admin', 'supervisor'] else 0
total_templates = InspectionTemplate.query.count() if current_user.role in ['admin', 'supervisor'] else 0
total_users = User.query.count() if current_user.role == 'admin' else 0
return render_template('dashboard.html',
today_inspections=today_inspections,
completed_today=completed_today,
open_issues=open_issues,
avg_score=round(avg_score, 2) if avg_score else None,
recent_inspections=recent_inspections,
total_facilities=total_facilities,
total_templates=total_templates,
total_users=total_users
)