From 7860b60f47c4cc7253baa87b48036d457ee2224c Mon Sep 17 00:00:00 2001 From: Ian Renton Date: Mon, 10 Aug 2026 06:06:33 +0100 Subject: [PATCH] Fix an issue where "spot providers enabled by default" was still being fetched through WEB_UI_OPTIONS on a path that required spot providers to have a "name" field in *config* rather than at runtime. Closes #124 --- alertproviders/alert_provider.py | 2 +- core/config.py | 9 --------- core/status_reporter.py | 3 ++- server/handlers/api/options.py | 10 ++++++++-- solarconditionsproviders/solar_conditions_provider.py | 2 +- spotproviders/spot_provider.py | 3 ++- static/js/bands.js | 2 +- static/js/map.js | 2 +- static/js/spots.js | 2 +- templates/add_spot.html | 2 +- templates/alerts.html | 2 +- templates/bands.html | 7 ++----- templates/base.html | 10 +++++----- templates/conditions.html | 2 +- templates/map.html | 7 ++----- templates/spots.html | 7 ++----- templates/status.html | 2 +- 17 files changed, 32 insertions(+), 42 deletions(-) diff --git a/alertproviders/alert_provider.py b/alertproviders/alert_provider.py index 9645e97..58246dd 100644 --- a/alertproviders/alert_provider.py +++ b/alertproviders/alert_provider.py @@ -12,7 +12,7 @@ class AlertProvider: """Constructor""" self.name = name - self.enabled = provider_config["enabled"] + self.enabled = provider_config.get("enabled", True) self.last_update_time = datetime.min.replace(tzinfo=pytz.UTC) self.status = "Not Started" if self.enabled else "Disabled" self._alerts = None diff --git a/core/config.py b/core/config.py index 4cb43c8..d04c957 100644 --- a/core/config.py +++ b/core/config.py @@ -24,12 +24,3 @@ WEB_UI_OPTIONS = config["web-ui-options"] API_ONLY_MODE = config.get("api-only-mode", False) LOG_LEVEL = config.get("log-level", "INFO") LOG_WEB_REQUESTS = config.get("log-web-requests", False) - -# For ease of config, each spot provider owns its own config about whether it should be enabled by default in the web UI -# but for consistency we provide this to the front-end in web-ui-options because it has no impact outside of the web UI. -WEB_UI_OPTIONS["spot-providers-enabled-by-default"] = [p["name"] for p in config["spot-providers"] if p["enabled"] and ( - "enabled-by-default-in-web-ui" not in p or p["enabled-by-default-in-web-ui"])] -# If spotting to this server is enabled, "API" is another valid spot source even though it does not come from -# one of our proviers. We set that to also be enabled by default. -if ALLOW_SPOTTING: - WEB_UI_OPTIONS["spot-providers-enabled-by-default"].append("API") diff --git a/core/status_reporter.py b/core/status_reporter.py index ff6e39a..0c76c9e 100644 --- a/core/status_reporter.py +++ b/core/status_reporter.py @@ -60,7 +60,8 @@ class StatusReporter: self._status_data["num_spots"] = len(self._spots) self._status_data["num_alerts"] = len(self._alerts) self._status_data["spot_providers"] = list( - map(lambda p: {"name": p.name, "enabled": p.enabled, "status": p.status, + map(lambda p: {"name": p.name, "enabled": p.enabled, + "enabled_by_default_in_web_ui": p.enabled_by_default_in_web_ui, "status": p.status, "last_updated": p.last_update_time.replace( tzinfo=pytz.UTC).timestamp() if p.last_update_time.year > 2000 else 0, "last_spot": p.last_spot_time.replace( diff --git a/server/handlers/api/options.py b/server/handlers/api/options.py index 1ec6c00..bcfff75 100644 --- a/server/handlers/api/options.py +++ b/server/handlers/api/options.py @@ -39,9 +39,14 @@ class APIOptionsHandler(tornado.web.RequestHandler): "sigs": SIGS, # Spot/alert sources are filtered for only ones that are enabled in config, no point letting the user toggle things that aren't even available. "spot_sources": list( - map(lambda p: p["name"], filter(lambda p: p["enabled"], self._status_data["spot_providers"]))), + map(lambda p: p["name"], + filter(lambda p: p["enabled"], self._status_data["spot_providers"]))), + "spot-providers-enabled-by-default": list( + map(lambda p: p["name"], filter(lambda p: p["enabled"] and p["enabled_by_default_in_web_ui"], + self._status_data["spot_providers"]))), "alert_sources": list( - map(lambda p: p["name"], filter(lambda p: p["enabled"], self._status_data["alert_providers"]))), + map(lambda p: p["name"], + filter(lambda p: p["enabled"], self._status_data["alert_providers"]))), "continents": CONTINENTS, "propagation_modes": list(PROPAGATION_MODES.values()), "max_spot_age": MAX_SPOT_AGE, @@ -50,6 +55,7 @@ class APIOptionsHandler(tornado.web.RequestHandler): # one of our proviers. if ALLOW_SPOTTING: options["spot_sources"].append("API") + options["spot-providers-enabled-by-default"].append("API") self.write(safe_json_dumps(options)) self.set_status(200) diff --git a/solarconditionsproviders/solar_conditions_provider.py b/solarconditionsproviders/solar_conditions_provider.py index bc939f7..32b65e3 100644 --- a/solarconditionsproviders/solar_conditions_provider.py +++ b/solarconditionsproviders/solar_conditions_provider.py @@ -12,7 +12,7 @@ class SolarConditionsProvider: self._solar_conditions_cache = None self.name = name - self.enabled = provider_config["enabled"] + self.enabled = provider_config.get("enabled", True) self.last_update_time = datetime.min.replace(tzinfo=pytz.UTC) self.status = "Not Started" if self.enabled else "Disabled" self._solar_conditions = None diff --git a/spotproviders/spot_provider.py b/spotproviders/spot_provider.py index 6b19a2c..d581ca5 100644 --- a/spotproviders/spot_provider.py +++ b/spotproviders/spot_provider.py @@ -12,7 +12,8 @@ class SpotProvider: """Constructor""" self.name = name - self.enabled = provider_config["enabled"] + self.enabled = provider_config.get("enabled", True) + self.enabled_by_default_in_web_ui = provider_config.get("enabled-by-default-in-web-ui", True) self.last_update_time = datetime.min.replace(tzinfo=pytz.UTC) self.last_spot_time = datetime.min.replace(tzinfo=pytz.UTC) self.status = "Not Started" if self.enabled else "Disabled" diff --git a/static/js/bands.js b/static/js/bands.js index 9166ce5..d468058 100644 --- a/static/js/bands.js +++ b/static/js/bands.js @@ -291,7 +291,7 @@ function loadOptions() { generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]); generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]); generateModesMultiToggleFilterCard(options["modes"]); - generateSourcesMultiToggleFilterCard(options["spot_sources"], spotProvidersEnabledByDefault); + generateSourcesMultiToggleFilterCard(options["spot_sources"], options["spot-providers-enabled-by-default"]); // Load URL params. These may select things from the various filter & display options, so the function needs // to be called after these are set up, but if the URL params ask for "embedded mode", this will suppress diff --git a/static/js/map.js b/static/js/map.js index c6b0f1e..92a1621 100644 --- a/static/js/map.js +++ b/static/js/map.js @@ -322,7 +322,7 @@ function loadOptions() { generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]); generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]); generateModesMultiToggleFilterCard(options["modes"]); - generateSourcesMultiToggleFilterCard(options["spot_sources"], spotProvidersEnabledByDefault); + generateSourcesMultiToggleFilterCard(options["spot_sources"], options["spot-providers-enabled-by-default"]); // Load URL params. These may select things from the various filter & display options, so the function needs // to be called after these are set up, but if the URL params ask for "embedded mode", this will suppress diff --git a/static/js/spots.js b/static/js/spots.js index c0d4375..063c728 100644 --- a/static/js/spots.js +++ b/static/js/spots.js @@ -436,7 +436,7 @@ function loadOptions() { generateMultiToggleFilterCard("#dx-continent-options", "dx_continent", options["continents"]); generateMultiToggleFilterCard("#de-continent-options", "de_continent", options["continents"]); generateModesMultiToggleFilterCard(options["modes"]); - generateSourcesMultiToggleFilterCard(options["spot_sources"], spotProvidersEnabledByDefault); + generateSourcesMultiToggleFilterCard(options["spot_sources"], options["spot-providers-enabled-by-default"]); // Load URL params. These may select things from the various filter & display options, so the function needs // to be called after these are set up, but if the URL params ask for "embedded mode", this will suppress diff --git a/templates/add_spot.html b/templates/add_spot.html index 14603ae..afa57ca 100644 --- a/templates/add_spot.html +++ b/templates/add_spot.html @@ -76,7 +76,7 @@ - + diff --git a/templates/alerts.html b/templates/alerts.html index 16436af..19a5963 100644 --- a/templates/alerts.html +++ b/templates/alerts.html @@ -75,7 +75,7 @@ - + diff --git a/templates/bands.html b/templates/bands.html index 0355efa..98b91bb 100644 --- a/templates/bands.html +++ b/templates/bands.html @@ -72,11 +72,8 @@ - - - + + diff --git a/templates/base.html b/templates/base.html index ac97800..80062e9 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,6 +1,6 @@ {% extends "skeleton.html" %} {% block head_extra %} - + @@ -10,10 +10,10 @@ - - - - + + + + {% end %} {% block body %}
diff --git a/templates/conditions.html b/templates/conditions.html index 46db23c..4a19c4d 100644 --- a/templates/conditions.html +++ b/templates/conditions.html @@ -284,7 +284,7 @@
- + diff --git a/templates/map.html b/templates/map.html index 998aea9..4926c83 100644 --- a/templates/map.html +++ b/templates/map.html @@ -105,11 +105,8 @@ - - - + + diff --git a/templates/spots.html b/templates/spots.html index f0e5f56..e10f4fd 100644 --- a/templates/spots.html +++ b/templates/spots.html @@ -113,11 +113,8 @@ - - - + + diff --git a/templates/status.html b/templates/status.html index 76eacb1..2dd6217 100644 --- a/templates/status.html +++ b/templates/status.html @@ -59,7 +59,7 @@ - +