From dba4cc8b96a608258bbe88474a924d550f5525af Mon Sep 17 00:00:00 2001 From: NguyenND Date: Thu, 9 Apr 2026 17:36:32 -0400 Subject: [PATCH] 04/09 update: redesign user's roles --- app/__init__.py | 4 +- app/models/notification_matrix.py | 48 +++++++------- app/models/user.py | 5 +- app/routes/auth.py | 12 ++-- app/routes/customers.py | 24 +++---- app/routes/dashboard.py | 4 +- app/routes/inspections.py | 2 +- app/routes/issues.py | 14 ++-- app/routes/reports.py | 8 +-- app/templates/audit/index.html | 2 +- app/templates/audit/view.html | 2 +- app/templates/auth/profile.html | 4 +- app/templates/auth/users.html | 9 ++- app/templates/base.html | 12 ++-- app/templates/dashboard.html | 10 +-- app/templates/facilities/list.html | 2 +- app/templates/facilities/view.html | 6 +- app/templates/inspections/list.html | 6 +- app/templates/inspections/view.html | 2 +- app/templates/issues/list.html | 6 +- app/templates/issues/view.html | 14 ++-- app/templates/projects/list.html | 4 +- app/templates/projects/view.html | 2 +- app/templates/templates/list.html | 8 +-- app/templates/templates/view.html | 4 +- app/utils/decorators.py | 17 +++-- app/utils/forms.py | 7 +- app/utils/notifications.py | 2 +- migrations/versions/phase11_director_role.py | 68 ++++++++++++++++++++ 29 files changed, 194 insertions(+), 114 deletions(-) create mode 100644 migrations/versions/phase11_director_role.py diff --git a/app/__init__.py b/app/__init__.py index 6677b06..3e9c65d 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -99,9 +99,9 @@ def create_app(config_name='default'): unread = Notification.query.filter_by( user_id=current_user.id, is_read=False ).count() - # Pending verification count — only computed for supervisor+ roles + # Pending verification count — only computed for director+ roles pv_count = 0 - if current_user.role in ('admin', 'supervisor'): + if current_user.role in ('admin', 'director'): pv_count = Issue.query.filter_by( status='pending_verification' ).count() diff --git a/app/models/notification_matrix.py b/app/models/notification_matrix.py index 4431a3c..8c55906 100644 --- a/app/models/notification_matrix.py +++ b/app/models/notification_matrix.py @@ -8,7 +8,7 @@ One row per (event_type, role_key) pair. role_key values --------------- admin — all users with role='admin' -supervisor — all users with role='supervisor' +director — all users with role='director' inspector — all users with role='inspector' project_manager — all users with role='project_manager' customer — all customer-portal users assigned to the relevant facility @@ -18,16 +18,16 @@ custom — free-form extra email addresses stored in custom_emails JSO Default matrix (mirrors current hardcoded behaviour) ----------------------------------------------------- -inspection_completed : admin ✓ supervisor ✓ inspector ✗ pm ✗ customer ✓ -issue_assigned : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✗ (assignee implicit) -issue_status : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✗ (assignee implicit) -issue_comment : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✗ (assignee implicit) -issue_follow_update : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✗ (followers implicit) -issue_flagged : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✓ (assignee implicit) -issue_created : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✓ (assignee implicit) -issue_updated_customer : admin ✗ supervisor ✗ inspector ✗ pm ✗ customer ✓ -verification_requested : admin ✓ supervisor ✓ inspector ✗ pm ✗ customer ✗ -sla_alert : admin ✓ supervisor ✗ inspector ✗ pm ✗ customer ✗ (assignee + followers implicit) +inspection_completed : admin ✓ director ✓ inspector ✗ pm ✗ customer ✓ +issue_assigned : admin ✗ director ✗ inspector ✗ pm ✗ customer ✗ (assignee implicit) +issue_status : admin ✗ director ✗ inspector ✗ pm ✗ customer ✗ (assignee implicit) +issue_comment : admin ✗ director ✗ inspector ✗ pm ✗ customer ✗ (assignee implicit) +issue_follow_update : admin ✗ director ✗ inspector ✗ pm ✗ customer ✗ (followers implicit) +issue_flagged : admin ✗ director ✗ inspector ✗ pm ✗ customer ✓ (assignee implicit) +issue_created : admin ✗ director ✗ inspector ✗ pm ✗ customer ✓ (assignee implicit) +issue_updated_customer : admin ✗ director ✗ inspector ✗ pm ✗ customer ✓ +verification_requested : admin ✓ director ✓ inspector ✗ pm ✗ customer ✗ +sla_alert : admin ✓ director ✗ inspector ✗ pm ✗ customer ✗ (assignee + followers implicit) """ import json @@ -36,7 +36,7 @@ from app import db # Role keys available in the matrix UI MATRIX_ROLES = [ ('admin', 'Admin'), - ('supervisor', 'Supervisor'), + ('director', 'Director'), ('inspector', 'Inspector'), ('project_manager', 'Project Manager'), ('customer', 'Customer'), @@ -65,84 +65,84 @@ MATRIX_EVENTS = { MATRIX_DEFAULTS = { # inspection_completed ('inspection_completed', 'admin'): True, - ('inspection_completed', 'supervisor'): True, + ('inspection_completed', 'director'): True, ('inspection_completed', 'inspector'): False, ('inspection_completed', 'project_manager'): False, ('inspection_completed', 'customer'): True, ('inspection_completed', 'custom'): False, # issue_assigned (assignee is always notified implicitly) ('issue_assigned', 'admin'): False, - ('issue_assigned', 'supervisor'): False, + ('issue_assigned', 'director'): False, ('issue_assigned', 'inspector'): False, ('issue_assigned', 'project_manager'): False, ('issue_assigned', 'customer'): False, ('issue_assigned', 'custom'): False, # issue_reassigned ('issue_reassigned', 'admin'): False, - ('issue_reassigned', 'supervisor'): False, + ('issue_reassigned', 'director'): False, ('issue_reassigned', 'inspector'): False, ('issue_reassigned', 'project_manager'): False, ('issue_reassigned', 'customer'): False, ('issue_reassigned', 'custom'): False, # issue_unassigned ('issue_unassigned', 'admin'): False, - ('issue_unassigned', 'supervisor'): False, + ('issue_unassigned', 'director'): False, ('issue_unassigned', 'inspector'): False, ('issue_unassigned', 'project_manager'): False, ('issue_unassigned', 'customer'): False, ('issue_unassigned', 'custom'): False, # issue_status ('issue_status', 'admin'): False, - ('issue_status', 'supervisor'): False, + ('issue_status', 'director'): False, ('issue_status', 'inspector'): False, ('issue_status', 'project_manager'): False, ('issue_status', 'customer'): False, ('issue_status', 'custom'): False, # issue_comment ('issue_comment', 'admin'): False, - ('issue_comment', 'supervisor'): False, + ('issue_comment', 'director'): False, ('issue_comment', 'inspector'): False, ('issue_comment', 'project_manager'): False, ('issue_comment', 'customer'): False, ('issue_comment', 'custom'): False, # issue_follow_update (followers always notified implicitly) ('issue_follow_update', 'admin'): False, - ('issue_follow_update', 'supervisor'): False, + ('issue_follow_update', 'director'): False, ('issue_follow_update', 'inspector'): False, ('issue_follow_update', 'project_manager'): False, ('issue_follow_update', 'customer'): False, ('issue_follow_update', 'custom'): False, # issue_flagged (from inspection) ('issue_flagged', 'admin'): False, - ('issue_flagged', 'supervisor'): False, + ('issue_flagged', 'director'): False, ('issue_flagged', 'inspector'): False, ('issue_flagged', 'project_manager'): False, ('issue_flagged', 'customer'): True, ('issue_flagged', 'custom'): False, # issue_created (standalone) ('issue_created', 'admin'): False, - ('issue_created', 'supervisor'): False, + ('issue_created', 'director'): False, ('issue_created', 'inspector'): False, ('issue_created', 'project_manager'): False, ('issue_created', 'customer'): True, ('issue_created', 'custom'): False, # issue_updated_customer ('issue_updated_customer', 'admin'): False, - ('issue_updated_customer', 'supervisor'): False, + ('issue_updated_customer', 'director'): False, ('issue_updated_customer', 'inspector'): False, ('issue_updated_customer', 'project_manager'): False, ('issue_updated_customer', 'customer'): True, ('issue_updated_customer', 'custom'): False, # verification_requested ('verification_requested', 'admin'): True, - ('verification_requested', 'supervisor'): True, + ('verification_requested', 'director'): True, ('verification_requested', 'inspector'): False, ('verification_requested', 'project_manager'): False, ('verification_requested', 'customer'): False, ('verification_requested', 'custom'): False, # sla_alert (assignee + followers always notified implicitly) ('sla_alert', 'admin'): True, - ('sla_alert', 'supervisor'): False, + ('sla_alert', 'director'): False, ('sla_alert', 'inspector'): False, ('sla_alert', 'project_manager'): False, ('sla_alert', 'customer'): False, diff --git a/app/models/user.py b/app/models/user.py index ba4da91..725c29b 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -16,7 +16,10 @@ class User(UserMixin, db.Model): email = db.Column(db.String(255), unique=True, nullable=False, index=True) password_hash = db.Column(db.String(255), nullable=False) role = db.Column( - db.Enum('admin', 'supervisor', 'inspector', 'project_manager', 'customer'), + # 'supervisor' retained temporarily so the Enum is valid before the + # migration UPDATE runs. The migration removes it after all rows are + # updated to 'director'. + db.Enum('admin', 'supervisor', 'director', 'inspector', 'project_manager', 'customer'), nullable=False ) created_at = db.Column(db.DateTime, default=now_eastern) diff --git a/app/routes/auth.py b/app/routes/auth.py index cbc8ec6..dd9fb2b 100644 --- a/app/routes/auth.py +++ b/app/routes/auth.py @@ -4,7 +4,7 @@ from urllib.parse import urlparse from app import db from app.models.user import User from app.utils.forms import LoginForm, UserForm, ProfileForm -from app.utils.decorators import admin_required +from app.utils.decorators import admin_required, supervisor_required import logging from app.utils.audit import log_action, ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE, ACTION_LOGIN, ACTION_LOGOUT @@ -127,7 +127,7 @@ def profile(): @bp.route('/users') @login_required -@admin_required +@supervisor_required def list_users(): # Exclude customer accounts — those are managed exclusively via /customers users = ( @@ -143,7 +143,7 @@ def list_users(): @bp.route('/users/new', methods=['GET', 'POST']) @login_required -@admin_required +@supervisor_required def create_user(): form = UserForm() @@ -169,7 +169,7 @@ def create_user(): @bp.route('/users//edit', methods=['GET', 'POST']) @login_required -@admin_required +@supervisor_required def edit_user(user_id): user = User.query.get_or_404(user_id) form = UserForm(user=user, obj=user) @@ -196,7 +196,7 @@ def edit_user(user_id): @bp.route('/users//delete', methods=['POST']) @login_required -@admin_required +@supervisor_required def delete_user(user_id): user = User.query.get_or_404(user_id) @@ -227,7 +227,7 @@ def delete_user(user_id): @bp.route('/users//toggle-active', methods=['POST']) @login_required -@admin_required +@supervisor_required def toggle_active(user_id): user = User.query.get_or_404(user_id) diff --git a/app/routes/customers.py b/app/routes/customers.py index e24b164..291fe7c 100644 --- a/app/routes/customers.py +++ b/app/routes/customers.py @@ -20,7 +20,7 @@ from app.models.user import User from app.models.project import Project, CustomerAssignment from app.models.facility import Facility from app.utils.forms import CustomerUserForm, CustomerAssignmentForm, CustomerInviteForm, SetPasswordForm -from app.utils.decorators import admin_required +from app.utils.decorators import admin_required, supervisor_required from app.utils.audit import log_action, ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE from app.utils.scope import get_customer_scope @@ -33,7 +33,7 @@ bp = Blueprint('customers', __name__, url_prefix='/customers') @bp.route('/') @login_required -@admin_required +@supervisor_required def index(): """Consolidated customer management dashboard.""" customers = ( @@ -101,7 +101,7 @@ def index(): @bp.route('/new', methods=['GET', 'POST']) @login_required -@admin_required +@supervisor_required def create(): """Create a customer account via email invitation. @@ -235,7 +235,7 @@ def _send_invite_email(user, token): @bp.route('//resend-invite', methods=['POST']) @login_required -@admin_required +@supervisor_required def resend_invite(customer_id): """Generate a fresh token and resend the set-password invitation email.""" customer = User.query.get_or_404(customer_id) @@ -295,7 +295,7 @@ def set_password(token): @bp.route('//edit', methods=['GET', 'POST']) @login_required -@admin_required +@supervisor_required def edit(customer_id): customer = User.query.get_or_404(customer_id) if customer.role != 'customer': @@ -326,7 +326,7 @@ def edit(customer_id): @bp.route('/') @login_required -@admin_required +@supervisor_required def manage(customer_id): """Single-customer detail page: profile + all assignments.""" customer = User.query.get_or_404(customer_id) @@ -363,7 +363,7 @@ def manage(customer_id): @bp.route('//assignments/add', methods=['POST']) @login_required -@admin_required +@supervisor_required def add_assignment(customer_id): customer = User.query.get_or_404(customer_id) if customer.role != 'customer': @@ -412,7 +412,7 @@ def add_assignment(customer_id): @bp.route('/assignments//remove', methods=['POST']) @login_required -@admin_required +@supervisor_required def remove_assignment(assignment_id): assignment = CustomerAssignment.query.get_or_404(assignment_id) customer_id = assignment.user_id @@ -437,7 +437,7 @@ def remove_assignment(assignment_id): @bp.route('//toggle-active', methods=['POST']) @login_required -@admin_required +@supervisor_required def toggle_active(customer_id): customer = User.query.get_or_404(customer_id) if customer.role != 'customer': @@ -463,7 +463,7 @@ def toggle_active(customer_id): @bp.route('/import/template') @login_required -@admin_required +@supervisor_required def import_template(): """Download a blank CSV template showing the expected import format.""" import csv, io @@ -495,7 +495,7 @@ def import_template(): @bp.route('/import', methods=['GET', 'POST']) @login_required -@admin_required +@supervisor_required def bulk_import(): """Two-phase CSV import for customer accounts. @@ -744,7 +744,7 @@ def bulk_import(): @bp.route('/facilities-for-project/') @login_required -@admin_required +@supervisor_required def facilities_for_project(project_id): from flask import jsonify project = Project.query.get_or_404(project_id) diff --git a/app/routes/dashboard.py b/app/routes/dashboard.py index 772d54d..b4c539b 100644 --- a/app/routes/dashboard.py +++ b/app/routes/dashboard.py @@ -24,7 +24,7 @@ def index(): thirty_days_ago = now - timedelta(days=30) is_inspector = current_user.role == 'inspector' - is_privileged = current_user.role in ['admin', 'supervisor'] + is_privileged = current_user.role in ['admin', 'director'] is_customer = current_user.role == 'customer' is_project_manager = current_user.role == 'project_manager' @@ -107,7 +107,7 @@ def index(): followup_q = followup_q.filter(False) pending_followups = followup_q.count() - # ── System stats (admin/supervisor) ─────────────────────────────────── + # ── System stats (admin/director) ──────────────────────────────────────── total_facilities = Facility.query.filter_by(active=True).count() if is_privileged else 0 total_templates = InspectionTemplate.query.count() if is_privileged else 0 total_users = User.query.count() if current_user.role == 'admin' else 0 diff --git a/app/routes/inspections.py b/app/routes/inspections.py index 1e76ac3..6e5a9c3 100644 --- a/app/routes/inspections.py +++ b/app/routes/inspections.py @@ -673,7 +673,7 @@ def flag_issue(inspection_id): form = IssueForm() areas = Area.query.filter_by(facility_id=inspection.facility_id).order_by(Area.name).all() - staff = User.query.filter(User.role.in_(['supervisor', 'inspector'])).order_by(User.username).all() + staff = User.query.filter(User.role.in_(['director', 'inspector'])).order_by(User.username).all() form.area_id.choices = [(a.id, a.name) for a in areas] form.assigned_to.choices = [(0, '— Unassigned —')] + [(u.id, u.username) for u in staff] diff --git a/app/routes/issues.py b/app/routes/issues.py index 2b07a12..b3222aa 100644 --- a/app/routes/issues.py +++ b/app/routes/issues.py @@ -114,7 +114,7 @@ def view(issue_id): return redirect(url_for('issues.index')) form = IssueUpdateForm(obj=issue) - staff = User.query.filter(User.role.in_(['supervisor','inspector'])).order_by(User.username).all() + staff = User.query.filter(User.role.in_(['director','inspector'])).order_by(User.username).all() form.assigned_to.choices = [(0, '— Unassigned —')] + [(u.id, u.username) for u in staff] form.status.data = form.status.data or issue.status @@ -124,7 +124,7 @@ def view(issue_id): issue.status = form.status.data - if current_user.role in ['admin', 'supervisor']: + if current_user.role in ['admin', 'director']: issue.assigned_to = form.assigned_to.data or None if form.status.data == 'resolved' and not issue.resolved_at: @@ -353,7 +353,7 @@ def unfollow(issue_id): def create(): form = IssueForm() areas = Area.query.join(Facility).filter(Facility.active == True).order_by(Facility.name, Area.name).all() - staff = User.query.filter(User.role.in_(['supervisor','inspector'])).order_by(User.username).all() + staff = User.query.filter(User.role.in_(['director','inspector'])).order_by(User.username).all() form.area_id.choices = [(a.id, f"{a.facility.name} — {a.name}") for a in areas] form.assigned_to.choices = [(0, '— Unassigned —')] + [(u.id, u.username) for u in staff] @@ -460,16 +460,16 @@ def verify(issue_id): @bp.route('//request-verification', methods=['POST']) @login_required def request_verification(issue_id): - """Inspector/assignee marks the issue as pending supervisor verification.""" + """Inspector/assignee marks the issue as pending director verification.""" issue = Issue.query.get_or_404(issue_id) if current_user.role == 'customer': flash('Access denied.', 'danger') return redirect(url_for('issues.index')) - # Only the assignee, supervisor, or admin can request verification + # Only the assignee, director, or admin can request verification can_act = ( - current_user.role in ['admin', 'supervisor'] + current_user.role in ['admin', 'director'] or issue.assigned_to == current_user.id ) if not can_act: @@ -556,7 +556,7 @@ def verification_queue(): def delete(issue_id): """Permanently delete an issue and its associated photos. - Restricted to admin and supervisor roles. The deletion is recorded in + Restricted to admin and director roles. The deletion is recorded in the audit log before the record is removed so there is always a trace. """ issue = Issue.query.get_or_404(issue_id) diff --git a/app/routes/reports.py b/app/routes/reports.py index 8faeecf..6ebc75f 100644 --- a/app/routes/reports.py +++ b/app/routes/reports.py @@ -38,8 +38,8 @@ def _date_range(): @bp.route('/') @login_required def index(): - # Customers get a scoped view; internal staff need supervisor+ access - if current_user.role not in ['admin', 'supervisor', 'project_manager', 'customer']: + # Customers get a scoped view; internal staff need director+ access + if current_user.role not in ['admin', 'director', 'project_manager', 'customer']: from flask import flash, redirect, url_for flash('Access denied.', 'danger') return redirect(url_for('dashboard.index')) @@ -179,7 +179,7 @@ def index(): @bp.route('/facility/') @login_required def facility_report(facility_id): - if current_user.role not in ['admin', 'supervisor', 'project_manager', 'customer']: + if current_user.role not in ['admin', 'director', 'project_manager', 'customer']: from flask import flash, redirect, url_for flash('Access denied.', 'danger') return redirect(url_for('dashboard.index')) @@ -228,7 +228,7 @@ def facility_report(facility_id): def facility_scorecard(facility_id): """Comprehensive per-facility scorecard: score trend, SLA compliance, issue breakdown by severity, inspection frequency.""" - if current_user.role not in ['admin', 'supervisor', 'project_manager', 'customer']: + if current_user.role not in ['admin', 'director', 'project_manager', 'customer']: from flask import flash, redirect, url_for flash('Access denied.', 'danger') return redirect(url_for('dashboard.index')) diff --git a/app/templates/audit/index.html b/app/templates/audit/index.html index 97070ca..c11a5e0 100644 --- a/app/templates/audit/index.html +++ b/app/templates/audit/index.html @@ -109,7 +109,7 @@ {{ entry.username }} - + {{ entry.user_role | title }} diff --git a/app/templates/audit/view.html b/app/templates/audit/view.html index 5553a33..65800b3 100644 --- a/app/templates/audit/view.html +++ b/app/templates/audit/view.html @@ -86,7 +86,7 @@
Role at Time
- + {{ entry.user_role | title }}
diff --git a/app/templates/auth/profile.html b/app/templates/auth/profile.html index c921aaf..ae96513 100644 --- a/app/templates/auth/profile.html +++ b/app/templates/auth/profile.html @@ -28,8 +28,8 @@

@{{ current_user.username }}

{% endif %}

{{ current_user.email }}

- - + + {{ current_user.role | title }}
diff --git a/app/templates/auth/users.html b/app/templates/auth/users.html index 3406e67..436833c 100644 --- a/app/templates/auth/users.html +++ b/app/templates/auth/users.html @@ -3,12 +3,11 @@ {% block title %}User Management{% endblock %} {% block content %} -
-
+
+

Internal User Management

-

Manage staff accounts (Admin, Supervisor, Inspector, Project Manager). For customer accounts, visit Customer Management.

-
+
Add User @@ -37,7 +36,7 @@ {{ user.full_name or '—' }} {{ user.email }} - + {{ user.role.replace('_',' ')|title }} diff --git a/app/templates/base.html b/app/templates/base.html index 6efee46..c5d6886 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -101,7 +101,7 @@ - {% if current_user.role in ['admin', 'supervisor', 'project_manager'] %} + {% if current_user.role in ['admin', 'director', 'project_manager'] %} @@ -109,7 +109,7 @@ - {% if current_user.role != 'customer' %} + {% if current_user.role in ['admin', 'director'] %} @@ -120,7 +120,7 @@ - {% if current_user.role in ['admin', 'supervisor'] %} + {% if current_user.role in ['admin', 'director'] %} @@ -128,7 +128,7 @@ - {% if current_user.role in ['admin', 'supervisor'] %} + {% if current_user.role in ['admin', 'director'] %} {% endif %} - {% if current_user.role == 'admin' %} + {% if current_user.role in ['admin', 'director'] %} + {% endif %} + {% if current_user.role == 'admin' %} diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index 4685d47..19f9770 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -5,7 +5,7 @@

Welcome, {{ current_user.username }}!

- + {{ current_user.role.replace('_',' ')|title }}
@@ -171,8 +171,8 @@
{% endif %} -{# ── System quick stats (admin/supervisor) ──────────────────────────────── #} -{% if current_user.role in ['admin', 'supervisor'] %} +{# ── System quick stats (admin/director) ─────────────────────────────────── #} +{% if current_user.role in ['admin', 'director'] %}
@@ -208,7 +208,7 @@ {# ── Score trend chart + Facility performance ───────────────────────────── #}
-
+
Inspection Score Trend (Last 30 Days) @@ -226,7 +226,7 @@
- {% if current_user.role in ['admin', 'supervisor'] and facility_perf %} + {% if current_user.role in ['admin', 'director'] and facility_perf %}
diff --git a/app/templates/facilities/list.html b/app/templates/facilities/list.html index dc6081f..418af8d 100644 --- a/app/templates/facilities/list.html +++ b/app/templates/facilities/list.html @@ -8,7 +8,7 @@

Facilities

- {% if current_user.role in ['admin', 'supervisor'] %} + {% if current_user.role in ['admin', 'director'] %} Add Facility diff --git a/app/templates/facilities/view.html b/app/templates/facilities/view.html index cd15d0a..f500736 100644 --- a/app/templates/facilities/view.html +++ b/app/templates/facilities/view.html @@ -8,13 +8,13 @@

{{ facility.name }}

- {% if current_user.role in ['admin', 'supervisor', 'project_manager', 'customer'] %} + {% if current_user.role in ['admin', 'director', 'project_manager', 'customer'] %} Scorecard {% endif %} - {% if current_user.role in ['admin', 'supervisor'] %} + {% if current_user.role in ['admin', 'director'] %} Edit @@ -126,7 +126,7 @@ {{ area.inspections.count() }} - {% if current_user.role in ['admin', 'supervisor'] %} + {% if current_user.role in ['admin', 'director'] %} diff --git a/app/templates/inspections/list.html b/app/templates/inspections/list.html index 6262e24..6724308 100644 --- a/app/templates/inspections/list.html +++ b/app/templates/inspections/list.html @@ -83,7 +83,7 @@ {% else %} View {% endif %} - {% if current_user.role in ['admin', 'supervisor'] %} + {% if current_user.role in ['admin', 'director'] %}
-{% if current_user.role in ['admin', 'supervisor'] %} +{% if current_user.role in ['admin', 'director'] %}