Skip to content

Commit 8e49a74

Browse files
abhizipstackclaude
andcommitted
fix: address Greptile review — null env, stale cache, deps, DB filter
P1: list_deploy_candidates crashed with AttributeError when a task had no environment. Guard with `if env else ""` (same pattern used in list_recent_runs_for_model). P2: list_deploy_candidates loaded all project tasks and filtered in Python. Added model_configs__has_key=model_name to the queryset so the DB does the heavy lifting. P2: Recent-runs popup showed stale data after a Quick Deploy because fetchedFor wasn't cleared. Now reset to null after successful dispatch so the next dropdown open refetches. P2: getRunTriggerScope was defined inside the Runhistory component, triggering react-hooks/exhaustive-deps warnings and unnecessary re-creation. Moved to module scope — it has no dependency on component state. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent e40207d commit 8e49a74

3 files changed

Lines changed: 19 additions & 18 deletions

File tree

backend/backend/core/scheduler/views.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -766,28 +766,29 @@ def list_deploy_candidates(request, project_id, model_name):
766766
"""
767767
tasks = UserTaskDetails.objects.select_related("environment", "project").filter(
768768
project__project_uuid=project_id,
769+
model_configs__has_key=model_name,
769770
)
770771

771772
candidates = []
772773
for task in tasks:
773774
model_configs = task.model_configs or {}
774775
cfg = model_configs.get(model_name)
775-
if not cfg:
776-
continue
777-
if not cfg.get("enabled", True):
776+
if not cfg or not cfg.get("enabled", True):
778777
continue
779778
enabled_model_count = sum(
780779
1
781780
for m_cfg in model_configs.values()
782781
if m_cfg.get("enabled", True)
783782
)
783+
env = task.environment
784784
candidates.append({
785785
"user_task_id": task.id,
786786
"task_name": task.task_name,
787-
"environment_id": str(task.environment.environment_id),
788-
"environment_name": getattr(
789-
task.environment, "environment_name", ""
790-
) or getattr(task.environment, "name", ""),
787+
"environment_id": str(env.environment_id) if env else "",
788+
"environment_name": (
789+
getattr(env, "environment_name", "")
790+
or getattr(env, "name", "")
791+
) if env else "",
791792
"status": task.status,
792793
"prev_run_status": task.prev_run_status,
793794
"task_run_time": task.task_run_time.isoformat() if task.task_run_time else None,

frontend/src/ide/editor/no-code-model/no-code-model.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,6 +1803,7 @@ function NoCodeModel({ nodeData }) {
18031803
: `"${currentModelName}" is running on "${envName}" via job "${jobName}". Check Run History for progress.`,
18041804
});
18051805
setRefreshModels(true);
1806+
setRecentRunsState((prev) => ({ ...prev, fetchedFor: null }));
18061807
setQuickDeployModal((prev) => ({
18071808
...prev,
18081809
open: false,

frontend/src/ide/run-history/Runhistory.jsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ const STATUS_OPTIONS = [
6161
{ label: "Revoked", value: "REVOKED" },
6262
];
6363

64+
const getRunTriggerScope = (row) => {
65+
const kw = row?.kwargs || {};
66+
const legacyQuick = kw.source === "quick_deploy";
67+
const models = kw.models_override || [];
68+
const trigger = kw.trigger || (legacyQuick ? "manual" : "scheduled");
69+
const scope =
70+
kw.scope || (models.length > 0 || legacyQuick ? "model" : "job");
71+
return { trigger, scope, models };
72+
};
73+
6474
const Runhistory = () => {
6575
const axios = useAxiosPrivate();
6676
const {
@@ -83,17 +93,6 @@ const Runhistory = () => {
8393
scope: "",
8494
});
8595

86-
/* Derive trigger/scope from a run row with back-compat for legacy
87-
* rows that only carried kwargs.source === "quick_deploy". */
88-
const getRunTriggerScope = (row) => {
89-
const kw = row?.kwargs || {};
90-
const legacyQuick = kw.source === "quick_deploy";
91-
const models = kw.models_override || [];
92-
const trigger = kw.trigger || (legacyQuick ? "manual" : "scheduled");
93-
const scope =
94-
kw.scope || (models.length > 0 || legacyQuick ? "model" : "job");
95-
return { trigger, scope, models };
96-
};
9796
const [envInfo, setEnvInfo] = useState({
9897
env_type: "",
9998
job_name: "",

0 commit comments

Comments
 (0)