Jun 24 - Issue details page, add filter by Reporter
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user