diff --git a/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc b/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc index 7e6c6a8..f6d0058 100644 Binary files a/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc and b/webui/backend/app/services/__pycache__/file_ops_service.cpython-313.pyc differ diff --git a/webui/backend/app/services/file_ops_service.py b/webui/backend/app/services/file_ops_service.py index 10bceef..b211e2a 100644 --- a/webui/backend/app/services/file_ops_service.py +++ b/webui/backend/app/services/file_ops_service.py @@ -18,6 +18,7 @@ TEXT_CONTENT_TYPES = { ".yaml": "text/yaml", ".json": "application/json", ".js": "text/javascript", + ".py": "text/x-python", ".css": "text/css", ".html": "text/html", } diff --git a/webui/backend/data/tasks.db b/webui/backend/data/tasks.db index 497436b..5a841db 100644 Binary files a/webui/backend/data/tasks.db and b/webui/backend/data/tasks.db differ diff --git a/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc b/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc index 8f449a7..614cd71 100644 Binary files a/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc and b/webui/backend/tests/golden/__pycache__/test_api_edit_golden.cpython-313.pyc differ diff --git a/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc b/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc index 42bd940..f76844d 100644 Binary files a/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc and b/webui/backend/tests/golden/__pycache__/test_ui_smoke_golden.cpython-313.pyc differ diff --git a/webui/backend/tests/golden/test_api_edit_golden.py b/webui/backend/tests/golden/test_api_edit_golden.py index 529e6fa..4e734e0 100644 --- a/webui/backend/tests/golden/test_api_edit_golden.py +++ b/webui/backend/tests/golden/test_api_edit_golden.py @@ -67,6 +67,19 @@ class EditApiGoldenTest(unittest.TestCase): self.assertFalse(body["truncated"]) self.assertIn("modified", body) + def test_edit_view_python_success(self) -> None: + file_path = self.root / "script.py" + file_path.write_text("print('hello')\n", encoding="utf-8") + + response = self._request("GET", "/api/files/view", params={"path": "storage1/script.py", "for_edit": "true"}) + + self.assertEqual(response.status_code, 200) + body = response.json() + self.assertEqual(body["path"], "storage1/script.py") + self.assertEqual(body["name"], "script.py") + self.assertEqual(body["content_type"], "text/x-python") + self.assertEqual(body["content"], "print('hello')\n") + def test_save_success(self) -> None: file_path = self.root / "notes.txt" file_path.write_text("hello", encoding="utf-8") diff --git a/webui/backend/tests/golden/test_ui_smoke_golden.py b/webui/backend/tests/golden/test_ui_smoke_golden.py index f1f4144..a4777d3 100644 --- a/webui/backend/tests/golden/test_ui_smoke_golden.py +++ b/webui/backend/tests/golden/test_ui_smoke_golden.py @@ -156,6 +156,7 @@ class UiSmokeGoldenTest(unittest.TestCase): self.assertIn('function openRenamePopup()', app_js) self.assertIn('document.getElementById("rename-btn").onclick = openRenamePopup;', app_js) self.assertIn('return triggerActionButton("rename-btn");', app_js) + self.assertIn('".py"', app_js) self.assertIn('function openVideoViewer()', app_js) self.assertIn('function openPdfViewer()', app_js) self.assertIn('async function loadMonacoModule()', app_js) diff --git a/webui/html/app.js b/webui/html/app.js index 4674aa3..4156e31 100644 --- a/webui/html/app.js +++ b/webui/html/app.js @@ -562,7 +562,7 @@ function isEditableSelection(item) { if (lower === "dockerfile" || lower === "containerfile") { return true; } - return [".txt", ".log", ".md", ".yml", ".yaml", ".json", ".js", ".css", ".html"].some((suffix) => lower.endsWith(suffix)); + return [".txt", ".log", ".md", ".yml", ".yaml", ".json", ".js", ".py", ".css", ".html"].some((suffix) => lower.endsWith(suffix)); } function monacoLanguageForName(name) {