From 2bdd6c1a2691ecf85036e94a47031df498c92997 Mon Sep 17 00:00:00 2001 From: NguyenND Date: Mon, 4 May 2026 13:25:21 -0400 Subject: [PATCH] 05/04 Replace issue Area with Facility --- app/routes/issues.py | 25 ++++++++++++++++++------- app/templates/issues/form.html | 4 ++-- app/utils/forms.py | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/routes/issues.py b/app/routes/issues.py index 384bfbf..18cdf30 100644 --- a/app/routes/issues.py +++ b/app/routes/issues.py @@ -409,17 +409,28 @@ def unfollow(issue_id): @supervisor_required def create(): form = IssueForm() - areas = Area.query.join(Facility).filter(Facility.active == True).order_by(Facility.name, Area.name).all() + facilities = Facility.query.filter_by(active=True).order_by(Facility.name).all() staff = User.query.filter(User.role.in_(['admin', '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] + form.facility_id.choices = [(f.id, f.name) for f in facilities] + form.assigned_to.choices = [(0, '— Unassigned —')] + [(u.id, u.username) for u in staff] if form.validate_on_submit(): from app.routes.inspections import _save_photo photo_path = _save_photo(form.photo.data, subfolder='issue_photos') + + # Derive area_id from the selected facility — use its first active area. + # area_id is required on the Issue model so we must resolve it here. + area = (Area.query + .filter_by(facility_id=form.facility_id.data) + .order_by(Area.name) + .first()) + if area is None: + form.facility_id.errors.append('Selected facility has no areas. Please add an area first.') + return render_template('issues/form.html', form=form, title='Log New Issue') + issue = Issue( - area_id = form.area_id.data, + area_id = area.id, severity = form.severity.data, description = form.description.data, photo_path = photo_path, @@ -430,11 +441,11 @@ def create(): db.session.add(issue) db.session.commit() current_app.logger.info( - 'ISSUE CREATED | id=%s | severity=%s | area_id=%s | assigned_to=%s | created_by=%s', - issue.id, issue.severity, issue.area_id, issue.assigned_to, current_user.username + 'ISSUE CREATED | id=%s | severity=%s | facility_id=%s | area_id=%s | assigned_to=%s | created_by=%s', + issue.id, issue.severity, form.facility_id.data, issue.area_id, issue.assigned_to, current_user.username ) log_action(ACTION_CREATE, 'Issue', issue.id, - f'#{issue.id} {issue.severity} in {issue.area.name}', + f'#{issue.id} {issue.severity} in {issue.area.facility.name}', f'severity={issue.severity}; assigned_to={issue.assigned_to}') if issue.assigned_to: diff --git a/app/templates/issues/form.html b/app/templates/issues/form.html index d5dbe8f..83bfbce 100644 --- a/app/templates/issues/form.html +++ b/app/templates/issues/form.html @@ -10,7 +10,7 @@
- {% for field in [form.area_id, form.severity, form.description, form.photo, form.assigned_to] %} + {% for field in [form.facility_id, form.severity, form.description, form.photo, form.assigned_to] %}
{{ field.label(class="form-label fw-semibold") }} {{ field(class="form-select" if field.type == 'SelectField' else "form-control", rows=4 if field.type == 'TextAreaField' else none) }} @@ -26,4 +26,4 @@
-{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/app/utils/forms.py b/app/utils/forms.py index 78f61b2..8b804bc 100644 --- a/app/utils/forms.py +++ b/app/utils/forms.py @@ -154,7 +154,7 @@ class ChecklistResultForm(FlaskForm): # ── Issues ─────────────────────────────────────────────────────────────────── class IssueForm(FlaskForm): - area_id = SelectField('Area', coerce=int, validators=[DataRequired()]) + facility_id = SelectField('Facility', coerce=int, validators=[DataRequired()]) severity = SelectField('Severity', choices=[ ('low','Low'), ('medium','Medium'), ('high','High'), ('critical','Critical'), ], validators=[DataRequired()])