Jun 24 - Issue details page, add filter by Reporter

This commit is contained in:
2026-06-24 13:28:11 -04:00
parent c69fa3e75c
commit ed546418d2
2 changed files with 29 additions and 2 deletions
+18
View File
@@ -111,6 +111,7 @@ def export_list_pdf():
contract_filter = request.args.get('contract_id', '') contract_filter = request.args.get('contract_id', '')
date_from_filter = request.args.get('date_from', '') date_from_filter = request.args.get('date_from', '')
date_to_filter = request.args.get('date_to', '') date_to_filter = request.args.get('date_to', '')
reporter_filter = request.args.get('reporter_id', '')
if issue_id_filter.isdigit(): if issue_id_filter.isdigit():
q = q.filter(Issue.id == int(issue_id_filter)) q = q.filter(Issue.id == int(issue_id_filter))
@@ -140,6 +141,8 @@ def export_list_pdf():
if facility_filter: if facility_filter:
fid = int(facility_filter) fid = int(facility_filter)
q = q.filter(db.or_(Issue.facility_id == fid, Area.facility_id == fid)) q = q.filter(db.or_(Issue.facility_id == fid, Area.facility_id == fid))
if reporter_filter.isdigit():
q = q.filter(Issue.reported_by == int(reporter_filter))
all_issues = q.all() all_issues = q.all()
if sla_filter: if sla_filter:
@@ -168,6 +171,10 @@ def export_list_pdf():
f = db.session.get(Facility, int(facility_filter)) f = db.session.get(Facility, int(facility_filter))
if f: if f:
filter_parts.append(f'Facility: {f.name}') filter_parts.append(f'Facility: {f.name}')
if reporter_filter.isdigit():
r = db.session.get(User, int(reporter_filter))
if r:
filter_parts.append(f'Reporter: {r.display_name}')
filter_summary = ' | '.join(filter_parts) if filter_parts else 'All issues' filter_summary = ' | '.join(filter_parts) if filter_parts else 'All issues'
@@ -235,6 +242,7 @@ def index():
contract_filter = request.args.get('contract_id', '') contract_filter = request.args.get('contract_id', '')
date_from_filter = request.args.get('date_from', '') date_from_filter = request.args.get('date_from', '')
date_to_filter = request.args.get('date_to', '') date_to_filter = request.args.get('date_to', '')
reporter_filter = request.args.get('reporter_id', '')
if issue_id_filter.isdigit(): if issue_id_filter.isdigit():
q = q.filter(Issue.id == int(issue_id_filter)) q = q.filter(Issue.id == int(issue_id_filter))
@@ -261,6 +269,8 @@ def index():
Issue.facility_id.in_(_contract_fids), Issue.facility_id.in_(_contract_fids),
Area.facility_id.in_(_contract_fids), Area.facility_id.in_(_contract_fids),
)) if _contract_fids else q.filter(False) )) if _contract_fids else q.filter(False)
if reporter_filter.isdigit():
q = q.filter(Issue.reported_by == int(reporter_filter))
if facility_filter: if facility_filter:
fid = int(facility_filter) fid = int(facility_filter)
q = q.filter( q = q.filter(
@@ -325,6 +335,12 @@ def index():
User.role.in_(['admin', 'director', 'inspector']), User.active == True User.role.in_(['admin', 'director', 'inspector']), User.active == True
).order_by(User.username).all() ).order_by(User.username).all()
# Reporters dropdown — users who have actually filed at least one issue
reporter_ids = db.session.execute(
db.select(Issue.reported_by).where(Issue.reported_by.isnot(None)).distinct()
).scalars().all()
reporters = User.query.filter(User.id.in_(reporter_ids)).order_by(User.full_name, User.username).all()
return render_template('issues/list.html', return render_template('issues/list.html',
issues=issues_paged, issues=issues_paged,
issue_id_filter=issue_id_filter, issue_id_filter=issue_id_filter,
@@ -335,9 +351,11 @@ def index():
contract_filter=contract_filter, contract_filter=contract_filter,
date_from_filter=date_from_filter, date_from_filter=date_from_filter,
date_to_filter=date_to_filter, date_to_filter=date_to_filter,
reporter_filter=reporter_filter,
facilities=facilities, facilities=facilities,
projects=projects, projects=projects,
staff=staff, staff=staff,
reporters=reporters,
followed_ids=followed_ids) followed_ids=followed_ids)
+11 -2
View File
@@ -73,6 +73,15 @@
<input type="date" name="date_to" class="form-control form-control-sm" <input type="date" name="date_to" class="form-control form-control-sm"
value="{{ date_to_filter }}"> value="{{ date_to_filter }}">
</div> </div>
<div class="col-md-2">
<label class="form-label small mb-1">Reporter</label>
<select name="reporter_id" class="form-select form-select-sm">
<option value="">All Reporters</option>
{% for u in reporters %}
<option value="{{ u.id }}" {{ 'selected' if reporter_filter == u.id|string }}>{{ u.display_name }}</option>
{% endfor %}
</select>
</div>
<div class="col-auto d-flex align-items-end gap-2 flex-wrap"> <div class="col-auto d-flex align-items-end gap-2 flex-wrap">
<button type="submit" class="btn btn-sm btn-outline-primary">Filter</button> <button type="submit" class="btn btn-sm btn-outline-primary">Filter</button>
<a href="{{ url_for('issues.index') }}" class="btn btn-sm btn-outline-secondary">Clear</a> <a href="{{ url_for('issues.index') }}" class="btn btn-sm btn-outline-secondary">Clear</a>
@@ -175,7 +184,7 @@
class="d-inline" class="d-inline"
title="Unfollow this issue"> title="Unfollow this issue">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<input type="hidden" name="next" value="{{ url_for('issues.index', page=issues.page, issue_id=issue_id_filter, severity=severity_filter, status=status_filter, contract_id=contract_filter, facility_id=facility_filter, date_from=date_from_filter, date_to=date_to_filter) }}"> <input type="hidden" name="next" value="{{ url_for('issues.index', page=issues.page, issue_id=issue_id_filter, severity=severity_filter, status=status_filter, contract_id=contract_filter, facility_id=facility_filter, date_from=date_from_filter, date_to=date_to_filter, reporter_id=reporter_filter) }}">
<button type="submit" class="btn btn-sm btn-outline-primary p-0 px-1 me-1" <button type="submit" class="btn btn-sm btn-outline-primary p-0 px-1 me-1"
title="Unfollow"> title="Unfollow">
<i class="bi bi-bell-slash" style="font-size:.75rem;"></i> <i class="bi bi-bell-slash" style="font-size:.75rem;"></i>
@@ -216,7 +225,7 @@
{% if p %} {% if p %}
<li class="page-item {{ 'active' if p == issues.page }}"> <li class="page-item {{ 'active' if p == issues.page }}">
<a class="page-link" <a class="page-link"
href="{{ url_for('issues.index', page=p, issue_id=issue_id_filter, severity=severity_filter, status=status_filter, sla=sla_filter, contract_id=contract_filter, facility_id=facility_filter, date_from=date_from_filter, date_to=date_to_filter) }}">{{ p }}</a> href="{{ url_for('issues.index', page=p, issue_id=issue_id_filter, severity=severity_filter, status=status_filter, sla=sla_filter, contract_id=contract_filter, facility_id=facility_filter, date_from=date_from_filter, date_to=date_to_filter, reporter_id=reporter_filter) }}">{{ p }}</a>
</li> </li>
{% else %}<li class="page-item disabled"><span class="page-link"></span></li>{% endif %} {% else %}<li class="page-item disabled"><span class="page-link"></span></li>{% endif %}
{% endfor %} {% endfor %}