05/06 Modify Director menu

This commit is contained in:
2026-05-06 12:28:26 -04:00
parent c2d63b61a3
commit 63740656cc
3 changed files with 17 additions and 15 deletions
+5 -5
View File
@@ -111,7 +111,7 @@ def profile():
@bp.route('/users') @bp.route('/users')
@login_required @login_required
@supervisor_required @admin_required
def list_users(): def list_users():
# Exclude customer accounts — those are managed exclusively via /customers # Exclude customer accounts — those are managed exclusively via /customers
users = ( users = (
@@ -127,7 +127,7 @@ def list_users():
@bp.route('/users/new', methods=['GET', 'POST']) @bp.route('/users/new', methods=['GET', 'POST'])
@login_required @login_required
@supervisor_required @admin_required
def create_user(): def create_user():
form = UserForm() form = UserForm()
@@ -159,7 +159,7 @@ def create_user():
@bp.route('/users/<int:user_id>/edit', methods=['GET', 'POST']) @bp.route('/users/<int:user_id>/edit', methods=['GET', 'POST'])
@login_required @login_required
@supervisor_required @admin_required
def edit_user(user_id): def edit_user(user_id):
user = db.session.get(User, user_id) user = db.session.get(User, user_id)
if user is None: if user is None:
@@ -196,7 +196,7 @@ def edit_user(user_id):
@bp.route('/users/<int:user_id>/delete', methods=['POST']) @bp.route('/users/<int:user_id>/delete', methods=['POST'])
@login_required @login_required
@supervisor_required @admin_required
def delete_user(user_id): def delete_user(user_id):
user = db.session.get(User, user_id) user = db.session.get(User, user_id)
if user is None: if user is None:
@@ -256,7 +256,7 @@ def delete_user(user_id):
@bp.route('/users/<int:user_id>/toggle-active', methods=['POST']) @bp.route('/users/<int:user_id>/toggle-active', methods=['POST'])
@login_required @login_required
@supervisor_required @admin_required
def toggle_active(user_id): def toggle_active(user_id):
user = db.session.get(User, user_id) user = db.session.get(User, user_id)
if user is None: if user is None:
+8 -8
View File
@@ -38,7 +38,7 @@ from app.models.inspection import Inspection, InspectionTemplate
from app.models.facility import Facility, Area from app.models.facility import Facility, Area
from app.models.issue import Issue from app.models.issue import Issue
from app.models.user import User from app.models.user import User
from app.utils.decorators import supervisor_required from app.utils.decorators import supervisor_required, admin_required
from app.utils.audit import log_action, ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE from app.utils.audit import log_action, ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE
from app.utils.time_utils import now_eastern from app.utils.time_utils import now_eastern
@@ -276,7 +276,7 @@ def _send_report(report: ScheduledReport):
@bp.route('/') @bp.route('/')
@login_required @login_required
@supervisor_required @admin_required
def index(): def index():
reports = ScheduledReport.query.order_by(ScheduledReport.name).all() reports = ScheduledReport.query.order_by(ScheduledReport.name).all()
return render_template('scheduled_reports/index.html', reports=reports) return render_template('scheduled_reports/index.html', reports=reports)
@@ -284,7 +284,7 @@ def index():
@bp.route('/new', methods=['GET', 'POST']) @bp.route('/new', methods=['GET', 'POST'])
@login_required @login_required
@supervisor_required @admin_required
def create(): def create():
facilities = Facility.query.filter_by(active=True).order_by(Facility.name).all() facilities = Facility.query.filter_by(active=True).order_by(Facility.name).all()
@@ -332,7 +332,7 @@ def create():
@bp.route('/<int:report_id>/edit', methods=['GET', 'POST']) @bp.route('/<int:report_id>/edit', methods=['GET', 'POST'])
@login_required @login_required
@supervisor_required @admin_required
def edit(report_id): def edit(report_id):
report = db.session.get(ScheduledReport, report_id) report = db.session.get(ScheduledReport, report_id)
if report is None: if report is None:
@@ -362,7 +362,7 @@ def edit(report_id):
@bp.route('/<int:report_id>/delete', methods=['POST']) @bp.route('/<int:report_id>/delete', methods=['POST'])
@login_required @login_required
@supervisor_required @admin_required
def delete(report_id): def delete(report_id):
report = db.session.get(ScheduledReport, report_id) report = db.session.get(ScheduledReport, report_id)
if report is None: if report is None:
@@ -378,7 +378,7 @@ def delete(report_id):
@bp.route('/<int:report_id>/preview') @bp.route('/<int:report_id>/preview')
@login_required @login_required
@supervisor_required @admin_required
def preview(report_id): def preview(report_id):
"""Render the scheduled report email in-browser for review.""" """Render the scheduled report email in-browser for review."""
report = db.session.get(ScheduledReport, report_id) report = db.session.get(ScheduledReport, report_id)
@@ -399,7 +399,7 @@ def preview(report_id):
@bp.route('/<int:report_id>/preview-pdf') @bp.route('/<int:report_id>/preview-pdf')
@login_required @login_required
@supervisor_required @admin_required
def preview_pdf(report_id): def preview_pdf(report_id):
"""Generate and stream the PDF attachment for in-browser review.""" """Generate and stream the PDF attachment for in-browser review."""
from flask import Response from flask import Response
@@ -436,7 +436,7 @@ def preview_pdf(report_id):
@bp.route('/<int:report_id>/send-now', methods=['POST']) @bp.route('/<int:report_id>/send-now', methods=['POST'])
@login_required @login_required
@supervisor_required @admin_required
def send_now(report_id): def send_now(report_id):
"""Manually trigger a single report — useful for testing.""" """Manually trigger a single report — useful for testing."""
report = db.session.get(ScheduledReport, report_id) report = db.session.get(ScheduledReport, report_id)
+4 -2
View File
@@ -133,7 +133,7 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('reports.') }}" href="{{ url_for('reports.index') }}">Reports</a> <a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('reports.') }}" href="{{ url_for('reports.index') }}">Reports</a>
</li> </li>
{% if current_user.role in ['admin', 'director'] %} {% if current_user.role == 'admin' %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('scheduled_reports.') }}" href="{{ url_for('scheduled_reports.index') }}">Scheduled Reports</a> <a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('scheduled_reports.') }}" href="{{ url_for('scheduled_reports.index') }}">Scheduled Reports</a>
</li> </li>
@@ -155,10 +155,12 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if current_user.role in ['admin', 'director'] %} {% if current_user.role == 'admin' %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('auth.') and 'user' in request.endpoint }}" href="{{ url_for('auth.list_users') }}">Users</a> <a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('auth.') and 'user' in request.endpoint }}" href="{{ url_for('auth.list_users') }}">Users</a>
</li> </li>
{% endif %}
{% if current_user.role in ['admin', 'director'] %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('customers.') }}" href="{{ url_for('customers.index') }}">Customers</a> <a class="nav-link {{ 'active' if request.endpoint and request.endpoint.startswith('customers.') }}" href="{{ url_for('customers.index') }}">Customers</a>
</li> </li>