From c5fe0157b066ee2e7da1044c24d298fc885cf16f Mon Sep 17 00:00:00 2001
From: Kiara Grouwstra <kiara@procolix.eu>
Date: Wed, 19 Mar 2025 08:57:56 +0100
Subject: [PATCH] factor reading env vars out to settings.py

---
 panel/src/panel/settings.py |  8 ++++++++
 panel/src/panel/views.py    | 17 ++++++++---------
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/panel/src/panel/settings.py b/panel/src/panel/settings.py
index 4209f80a..f289b0fc 100644
--- a/panel/src/panel/settings.py
+++ b/panel/src/panel/settings.py
@@ -184,3 +184,11 @@ if user_settings_file is not None:
     spec.loader.exec_module(module)
     sys.modules["user_settings"] = module
     from user_settings import *  # noqa: F403 # pyright: ignore [reportMissingImports]
+
+# non-Django application settings
+
+# a dir of nix supporting experimental feature `configurable-impure-env`.
+nix_bin_dir=f"{env.get("NIX_DIR")}/bin/"
+# path of the root flake to trigger nixops from, see #94.
+# to deploy this should be specified, for dev just use a relative path.
+repo_dir = env.get("REPO_DIR") or f"{os.getcwd()}/.."
diff --git a/panel/src/panel/views.py b/panel/src/panel/views.py
index 85918e26..0bc869d3 100644
--- a/panel/src/panel/views.py
+++ b/panel/src/panel/views.py
@@ -1,5 +1,4 @@
 from enum import Enum
-import os
 import json
 import subprocess
 
@@ -9,7 +8,7 @@ from django.contrib.auth.models import User
 from django.views.generic import TemplateView, DetailView
 from django.views.generic.edit import FormView
 
-from panel import models
+from panel import models, settings
 from panel.configuration import forms
 
 
@@ -47,9 +46,6 @@ class ConfigurationForm(LoginRequiredMixin, FormView):
         # Check for deploy button
         if "deploy" in self.request.POST.keys():
             submission = obj.parsed_value.model_dump_json()
-            # in dev we can use a relative path, for deployed versions we must explicitly
-            # specify our root flake as the directory to trigger nixops from, see #94.
-            cwd = os.getenv("REPO_DIR") or f"{os.getcwd()}/.."
             # FIXME: let the user specify these from the form (#190)
             dummy_user = {
               "initialUser": {
@@ -62,9 +58,8 @@ class ConfigurationForm(LoginRequiredMixin, FormView):
             # serialize back and forth now we still need to manually inject the dummy user
             deployment = json.dumps(dummy_user | json.loads(submission))
             env = {
-                # use nix as implicit lix from a dev shell lacks configurable-impure-env
-                "PATH": f"{os.getenv("NIX_DIR")}/bin/",
-                # environment variable we use to pass in form info to our deployment
+                "PATH": settings.nix_bin_dir,
+                # pass in form info to our deployment
                 "DEPLOYMENT": deployment,
             }
             cmd = [
@@ -78,7 +73,11 @@ class ConfigurationForm(LoginRequiredMixin, FormView):
                 "apply",
                 "test",
             ]
-            subprocess.run(cmd, cwd=cwd, env=env)
+            subprocess.run(
+               cmd,
+               cwd=settings.repo_dir,
+               env=env,
+           )
         return obj
 
     # TODO(@fricklerhandwerk):