From fe393b6cba032ebf9323af7acd13e2d33643e384 Mon Sep 17 00:00:00 2001 From: NguyenND Date: Thu, 5 Mar 2026 09:12:33 -0500 Subject: [PATCH] Mar 05 2026: implement Verification queue --- app/__init__.py | 16 +- app/routes/issues.py | 41 +++++ app/templates/base.html | 19 +++ app/templates/issues/verification_queue.html | 159 +++++++++++++++++++ 4 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 app/templates/issues/verification_queue.html diff --git a/app/__init__.py b/app/__init__.py index 0a07f02..35ff167 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -90,13 +90,23 @@ def create_app(config_name='default'): try: if current_user.is_authenticated: from app.models.notification import Notification - count = Notification.query.filter_by( + from app.models.issue import Issue + unread = Notification.query.filter_by( user_id=current_user.id, is_read=False ).count() - return {'unread_notification_count': count} + # Pending verification count — only computed for supervisor+ roles + pv_count = 0 + if current_user.role in ('admin', 'supervisor'): + pv_count = Issue.query.filter_by( + status='pending_verification' + ).count() + return { + 'unread_notification_count': unread, + 'pending_verification_count': pv_count, + } except Exception: pass - return {'unread_notification_count': 0} + return {'unread_notification_count': 0, 'pending_verification_count': 0} os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) diff --git a/app/routes/issues.py b/app/routes/issues.py index 5b916d2..d5a37f2 100644 --- a/app/routes/issues.py +++ b/app/routes/issues.py @@ -516,4 +516,45 @@ def request_verification(issue_id): flash('Issue marked as pending verification. Supervisors have been notified.', 'info') return redirect(url_for('issues.view', issue_id=issue_id)) +# ── Verification queue ──────────────────────────────────────────────────────── + +@bp.route('/verification-queue') +@login_required +@supervisor_required +def verification_queue(): + """Supervisor queue of all issues awaiting verification, grouped by facility.""" + from app.models.facility import Facility, Area + from app.utils.sla import sla_status, sla_hours_remaining + + pending = ( + Issue.query + .join(Area, Issue.area_id == Area.id) + .filter(Issue.status == 'pending_verification') + .order_by(Area.facility_id, Issue.reported_at.asc()) + .all() + ) + + # Group by facility for display + from collections import defaultdict + by_facility = defaultdict(list) + for issue in pending: + by_facility[issue.area.facility].append(issue) + + # Sort facilities alphabetically + grouped = sorted(by_facility.items(), key=lambda x: x[0].name) + + logger.info( + 'VERIFICATION QUEUE VIEWED | user=%s | pending_count=%s', + current_user.username, len(pending), + ) + + return render_template( + 'issues/verification_queue.html', + grouped = grouped, + total_pending = len(pending), + sla_status = sla_status, + sla_hours_remaining = sla_hours_remaining, + ) + + return render_template('issues/form.html', form=form, title='Log New Issue') \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 3709871..32f1217 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -84,9 +84,28 @@ Scheduled Reports {% endif %} + {% if current_user.role in ['admin','supervisor'] %} + + {% endif %} + {% if current_user.role in ['admin', 'supervisor'] %} + + {% endif %} {% if current_user.role == 'admin' %}