From 5b1c773e8c82e21dda8a5e42cb619078823af034 Mon Sep 17 00:00:00 2001 From: Daniel K Lyons <dlyons@nrao.edu> Date: Thu, 13 Jul 2023 10:44:31 -0600 Subject: [PATCH] Add hide_files parameter to CapabilityRequest.__json__ This greatly improves the performance of the active requests page, since it doesn't need to actually fetch all the files under each version to render. --- shared/workspaces/workspaces/capability/schema.py | 12 ++++++++---- .../capability/services/capability_info.py | 5 +++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/shared/workspaces/workspaces/capability/schema.py b/shared/workspaces/workspaces/capability/schema.py index dd466cc85..f11ed424c 100644 --- a/shared/workspaces/workspaces/capability/schema.py +++ b/shared/workspaces/workspaces/capability/schema.py @@ -1329,10 +1329,13 @@ class CapabilityRequest(JSONSerializable): ) # Pyramid support method: must accept a "request" argument that is unused by us - def __json__(self, request=None) -> dict: + def __json__(self, request=None, **kwargs) -> dict: # Calculate state to ensure it's up-to-date self.determine_state() + # are we loading files? + hide_files = 'hide_files' in kwargs and kwargs['hide_files'] + return { "type": self.__class__.__name__, "id": self.id, @@ -1344,7 +1347,7 @@ class CapabilityRequest(JSONSerializable): "ingested": self.ingested, "created_at": self.created_at.isoformat(), "updated_at": self.updated_at.isoformat(), - "versions": [v.__json__() for v in self.versions], + "versions": [v.__json__(hide_files=hide_files) for v in self.versions], "status_url": self.status_url, "system_messages": self.system_messages, } @@ -1400,7 +1403,8 @@ class CapabilityVersion(JSONSerializable): return self.executions[-1] if len(self.executions) else None # Pyramid support method: must accept a "request" argument that is unused by us - def __json__(self, request=None) -> dict: + def __json__(self, request=None, **kwargs) -> dict: + hide_files = 'hide_files' in kwargs and kwargs['hide_files'] return { "type": self.__class__.__name__, "capability_request_id": self.capability_request_id, @@ -1410,7 +1414,7 @@ class CapabilityVersion(JSONSerializable): "parameters": self.parameters, "workflow_metadata": self.workflow_metadata, "sealed": self.sealed, - "files": [file.__json__() for file in self.files], + "files": [file.__json__() for file in self.files] if not hide_files else [], "capability_name": self.capability.name if self.capability else None, "status_url": self.request.status_url, "internal_notes": self.internal_notes, diff --git a/shared/workspaces/workspaces/capability/services/capability_info.py b/shared/workspaces/workspaces/capability/services/capability_info.py index 04290e464..ada1ac983 100644 --- a/shared/workspaces/workspaces/capability/services/capability_info.py +++ b/shared/workspaces/workspaces/capability/services/capability_info.py @@ -28,7 +28,7 @@ from typing import Dict, List, Optional import transaction from sqlalchemy import desc, text from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, selectinload, defer from workspaces.capability.enums import CapabilityRequestState, QueueState from workspaces.capability.helpers_interfaces import ParameterIF @@ -378,6 +378,7 @@ class CapabilityInfo: """ default_query = ( self.session.query(CapabilityRequest) + .options(selectinload(CapabilityRequest.versions)) .filter_by(capability_name=capability_name) .filter(CapabilityRequest.state != "Complete") .filter(CapabilityRequest.sealed == False) @@ -400,7 +401,7 @@ class CapabilityInfo: json_list = [] for request in active_list: - json_list.append(request.__json__()) + json_list.append(request.__json__(hide_files=True)) return {"active_requests": json_list} -- GitLab