Skip to content

Commit 9ae15d3

Browse files
authored
Merge pull request #63 from PlanExeOrg/flask-admin-slow-taskitem
flask-admin less load when browsing the Taskitem table
2 parents e121fea + 7423523 commit 9ae15d3

2 files changed

Lines changed: 21 additions & 7 deletions

File tree

database_api/model_taskitem.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from database_api.planexe_db_singleton import db
55
from sqlalchemy_utils import UUIDType
66
from sqlalchemy import JSON
7+
from sqlalchemy.orm import column_property
78

89
class TaskState(enum.Enum):
910
pending = 1
@@ -70,6 +71,11 @@ class TaskItem(db.Model):
7071
# Artifact schema/version marker (legacy snapshots are NULL/1, split-storage snapshots are 2+).
7172
run_artifact_layout_version = db.Column(db.Integer, nullable=True, default=None)
7273

74+
# Lightweight admin/UI helpers; avoids loading large payload columns just to render links.
75+
has_generated_report_html = column_property(generated_report_html.isnot(None))
76+
has_run_zip_snapshot = column_property(run_zip_snapshot.isnot(None))
77+
has_run_track_activity_jsonl = column_property(run_track_activity_jsonl.isnot(None))
78+
7379
def __repr__(self):
7480
return f"{self.id}: {self.timestamp_created}, {self.state}, {self.prompt!r}, parameters: {self.parameters!r}"
7581

frontend_multi_user/src/planexe_modelviews.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from markupsafe import Markup
1414
from flask import url_for, abort, redirect, Response
1515
from flask_login import current_user
16+
from sqlalchemy.orm import defer
1617

1718
class AdminOnlyModelView(ModelView):
1819
"""Restrict admin views to authenticated admin users only."""
@@ -135,23 +136,30 @@ class TaskItemView(AdminOnlyModelView):
135136
'prompt': lambda v, c, m, p: m.prompt[:100] + '...' if m.prompt and len(m.prompt) > 100 else m.prompt,
136137
'view_plan': lambda v, c, m, p: Markup(
137138
f'<a href="/viewplan?run_id={m.id}" target="_blank">View</a>'
138-
) if m.generated_report_html else '—',
139+
) if m.has_generated_report_html else '—',
139140
'generated_report_html': lambda v, c, m, p: Markup(
140-
f'<a href="{url_for("download_task_report", task_id=str(m.id))}">Download ({len(m.generated_report_html.encode("utf-8")) / 1024:.1f} KB)</a>'
141-
) if m.generated_report_html else '—',
141+
f'<a href="{url_for("download_task_report", task_id=str(m.id))}">Download</a>'
142+
) if m.has_generated_report_html else '—',
142143
'run_zip_snapshot': lambda v, c, m, p: Markup(
143-
f'<a href="{url_for("download_task_run_zip", task_id=str(m.id))}">Download ({len(m.run_zip_snapshot) / 1024:.1f} KB)</a>'
144-
) if m.run_zip_snapshot else '—',
144+
f'<a href="{url_for("download_task_run_zip", task_id=str(m.id))}">Download</a>'
145+
) if m.has_run_zip_snapshot else '—',
145146
'run_activity_overview_json': lambda v, c, m, p: (
146147
json.dumps(m.run_activity_overview_json, ensure_ascii=False)[:120] + '...'
147148
if m.run_activity_overview_json and len(json.dumps(m.run_activity_overview_json, ensure_ascii=False)) > 120
148149
else (json.dumps(m.run_activity_overview_json, ensure_ascii=False) if m.run_activity_overview_json else '—')
149150
),
150151
'run_track_activity': lambda v, c, m, p: Markup(
151-
f'<a href="{url_for("download_task_track_activity", task_id=str(m.id))}">Download ({((m.run_track_activity_bytes if m.run_track_activity_bytes is not None else len(m.run_track_activity_jsonl.encode("utf-8"))) / 1024):.1f} KB)</a>'
152-
) if m.run_track_activity_jsonl else '—',
152+
f'<a href="{url_for("download_task_track_activity", task_id=str(m.id))}">Download</a>'
153+
) if m.has_run_track_activity_jsonl else '—',
153154
}
154155

156+
def get_query(self):
157+
return super().get_query().options(
158+
defer(self.model.generated_report_html),
159+
defer(self.model.run_zip_snapshot),
160+
defer(self.model.run_track_activity_jsonl),
161+
)
162+
155163
class NonceItemView(AdminOnlyModelView):
156164
"""Custom ModelView for NonceItem"""
157165
def __init__(self, model, *args, **kwargs):

0 commit comments

Comments
 (0)