From 302f4b2df27caadd7ebc2cc6abb68d6f636a63e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mark=20Lis=C3=A9?= Date: Sun, 10 Nov 2024 16:46:21 -0800 Subject: [PATCH] =?UTF-8?q?255:=20Visual=20high=20priority=20notes=20for?= =?UTF-8?q?=20UI.=20Quality=20changes=20for=20debugging=E2=80=A6=20(#2428)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …. Only deals with UI and not PDF generation - that is to come. --- epictrack-api/setup.cfg | 2 +- .../reports/anticipated_schedule_report.py | 34 ++++++++++++++++++- .../src/api/reports/report_factory.py | 20 +++++++++-- .../eaReferral/AnticipatedEAOSchedule.tsx | 22 ++++++++++-- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/epictrack-api/setup.cfg b/epictrack-api/setup.cfg index 69a3d0279..4668b3eb4 100644 --- a/epictrack-api/setup.cfg +++ b/epictrack-api/setup.cfg @@ -71,7 +71,7 @@ notes=FIXME,XXX,TODO ignored-modules=flask_sqlalchemy,sqlalchemy,SQLAlchemy,alembic,scoped_session ignored-classes=scoped_session min-similarity-lines=15 -disable=C0301,W0511, R0917, C0411, R1710, E1101, W4904 +disable=C0301,W0511, R0917, C0411, R1710, E1101, W4904, R0914 good-names=f,id,k,v [isort] diff --git a/epictrack-api/src/api/reports/anticipated_schedule_report.py b/epictrack-api/src/api/reports/anticipated_schedule_report.py index 15866dcf5..eeb33f725 100644 --- a/epictrack-api/src/api/reports/anticipated_schedule_report.py +++ b/epictrack-api/src/api/reports/anticipated_schedule_report.py @@ -12,6 +12,8 @@ from api.models.event import Event from api.models.event_category import EventCategoryEnum from api.models.event_configuration import EventConfiguration +from api.models.work_issues import WorkIssues +from api.models.work_issue_updates import WorkIssueUpdates from api.models.event_type import EventTypeEnum from api.models.ministry import Ministry from api.models.phase_code import PhaseCode @@ -40,6 +42,8 @@ def __init__(self, filters, color_intensity): """Initialize the ReportFactory""" data_keys = [ "work_id", + "event_id", + "work_issues", "phase_name", "date_updated", "project_name", @@ -191,6 +195,7 @@ def _fetch_data(self, report_date): ~WorkPhase.name.in_(exclude_phase_names) ) .add_columns( + Event.id.label("event_id"), Work.id.label("work_id"), PhaseCode.name.label("phase_name"), latest_status_updates.c.posted_date.label("date_updated"), @@ -234,7 +239,34 @@ def generate_report(self, report_date, return_type): """Generates a report and returns it""" current_app.logger.info(f"Generating {self.report_title} report for {report_date}") data = self._fetch_data(report_date) - data = self._format_data(data) + + works_list = [] + for item in data: + current_app.logger.debug(f"Work ID: {item[0]}") + work_issues = db.session.query(WorkIssues).filter_by(work_id=item.work_id).all() + current_app.logger.debug(f"Work Issues: {work_issues}") + item_dict = item._asdict() + item_dict['work_issues'] = work_issues + works_list.append(item_dict) + + # go through all the work issues, find the update and add the description to the issue + for issue in work_issues: + work_issue_updates = ( + db.session.query(WorkIssueUpdates) + .filter_by( + work_issue_id=issue.id, + is_active=True, + is_approved=True + ) + .order_by(WorkIssueUpdates.updated_at.desc()) + .first() + ) + if work_issue_updates: + for work_issue in item_dict['work_issues']: + if work_issue.id == issue.id: + work_issue.description = work_issue_updates.description + + data = self._format_data(works_list) data = self._update_staleness(data, report_date) if return_type == "json" or not data: diff --git a/epictrack-api/src/api/reports/report_factory.py b/epictrack-api/src/api/reports/report_factory.py index 8a70ee2e9..5dc80bbbf 100644 --- a/epictrack-api/src/api/reports/report_factory.py +++ b/epictrack-api/src/api/reports/report_factory.py @@ -5,7 +5,7 @@ from io import BytesIO from pathlib import Path from sqlalchemy import and_, func - +from flask import current_app from api.models import WorkStatus, db @@ -36,7 +36,8 @@ def _format_data(self, data): excluded_items = self.filters["exclude"] for item in data: obj = { - k: getattr(item, k) for k in self.data_keys if k not in excluded_items + k: (item[k] if k != "work_issues" else self._deserialize_work_issues(item[k])) + for k in self.data_keys if k not in excluded_items } if self.group_by: obj["sl_no"] = len(formatted_data[obj.get(self.group_by)]) + 1 @@ -45,6 +46,21 @@ def _format_data(self, data): formatted_data.append(obj) return formatted_data + def _deserialize_work_issues(self, work_issues): + """Deserialize work issues from the database format to a report-friendly format.""" + current_app.logger.debug(f"Deserializing work issues: {work_issues}") + deserialized_issues = [] + for issue in work_issues: + deserialized_issues.append({ + "id": issue.id, + "title": issue.title, + "description": issue.description if hasattr(issue, 'description') else None, + "is_high_priority": issue.is_high_priority, + "created_at": issue.created_at.strftime("%Y-%m-%d %H:%M:%S") if issue.created_at else None, + "updated_at": issue.updated_at.strftime("%Y-%m-%d %H:%M:%S") if issue.updated_at else None, + }) + return deserialized_issues + @abstractmethod def generate_report(self, report_date, return_type): """Generates a report and returns it""" diff --git a/epictrack-web/src/components/reports/eaReferral/AnticipatedEAOSchedule.tsx b/epictrack-web/src/components/reports/eaReferral/AnticipatedEAOSchedule.tsx index c043def8b..343ff766a 100644 --- a/epictrack-web/src/components/reports/eaReferral/AnticipatedEAOSchedule.tsx +++ b/epictrack-web/src/components/reports/eaReferral/AnticipatedEAOSchedule.tsx @@ -29,10 +29,8 @@ import { MILESTONE_TYPES, } from "../../../constants/application-constant"; import { dateUtils } from "../../../utils"; -import moment from "moment"; import ReportHeader from "../shared/report-header/ReportHeader"; import { ETPageContainer } from "../../shared"; -import { Palette } from "styles/theme"; import { staleLevel } from "utils/uiUtils"; export default function AnticipatedEAOSchedule() { @@ -231,6 +229,7 @@ export default function AnticipatedEAOSchedule() { {((reports as any)[key] as []).map((item, itemIndex) => { + console.log(item); return ( + {item["work_issues"] && + (item["work_issues"] as any[]).map( + (issue, issueIndex) => { + if (issue.is_high_priority) { + return ( + + + High Priority Issue + + + {issue.title}: + {issue.description} + + + ); + } + return null; + } + )}