2 Commits

Author SHA1 Message Date
Ian Renton
14c4e6f221 Compatibility with Python 3.8 2026-03-31 21:13:18 +01:00
Ian Renton
041216c5bb Trap NaN frequencies and return None instead 2026-03-31 20:30:40 +01:00
16 changed files with 43 additions and 39 deletions

2
.idea/spothole.iml generated
View File

@@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.13 virtualenv at ~/code/spothole/.venv" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.13 (spothole)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

View File

@@ -2,7 +2,7 @@ import re
from datetime import datetime from datetime import datetime
import pytz import pytz
from rss_parser import RSSParser from rss_parser import Parser
from alertproviders.http_alert_provider import HTTPAlertProvider from alertproviders.http_alert_provider import HTTPAlertProvider
from data.alert import Alert from data.alert import Alert
@@ -20,7 +20,7 @@ class NG3K(HTTPAlertProvider):
def _http_response_to_alerts(self, http_response): def _http_response_to_alerts(self, http_response):
new_alerts = [] new_alerts = []
rss = RSSParser.parse(http_response.content.decode()) rss = Parser.parse(http_response.content.decode())
# Iterate through source data # Iterate through source data
for source_alert in rss.channel.items: for source_alert in rss.channel.items:
# Deal with "the format"... # Deal with "the format"...

View File

@@ -1,7 +1,7 @@
from datetime import datetime from datetime import datetime
import pytz import pytz
from rss_parser import RSSParser from rss_parser import Parser as RSSParser
from alertproviders.http_alert_provider import HTTPAlertProvider from alertproviders.http_alert_provider import HTTPAlertProvider
from data.alert import Alert from data.alert import Alert

View File

@@ -1,3 +1,4 @@
import json
import logging import logging
import re import re
from math import floor from math import floor
@@ -11,8 +12,10 @@ TRANSFORMER_OS_GRID_TO_WGS84 = Transformer.from_crs("EPSG:27700", "EPSG:4326")
TRANSFORMER_IRISH_GRID_TO_WGS84 = Transformer.from_crs("EPSG:29903", "EPSG:4326") TRANSFORMER_IRISH_GRID_TO_WGS84 = Transformer.from_crs("EPSG:29903", "EPSG:4326")
TRANSFORMER_CI_UTM_GRID_TO_WGS84 = Transformer.from_crs("+proj=utm +zone=30 +ellps=WGS84", "EPSG:4326") TRANSFORMER_CI_UTM_GRID_TO_WGS84 = Transformer.from_crs("+proj=utm +zone=30 +ellps=WGS84", "EPSG:4326")
cq_zone_data = geopandas.GeoDataFrame.from_features(geopandas.read_file("datafiles/cqzones.geojson")) with open("datafiles/cqzones.geojson") as f:
itu_zone_data = geopandas.GeoDataFrame.from_features(geopandas.read_file("datafiles/ituzones.geojson")) cq_zone_data = geopandas.GeoDataFrame.from_features(json.load(f)["features"])
with open("datafiles/ituzones.geojson") as f:
itu_zone_data = geopandas.GeoDataFrame.from_features(json.load(f)["features"])
for idx in cq_zone_data.index: for idx in cq_zone_data.index:
prepare(cq_zone_data.at[idx, 'geometry']) prepare(cq_zone_data.at[idx, 'geometry'])
for idx in itu_zone_data.index: for idx in itu_zone_data.index:

View File

@@ -201,8 +201,8 @@ class Spot:
self.de_flag = lookup_helper.get_flag_for_dxcc(self.de_dxcc_id) self.de_flag = lookup_helper.get_flag_for_dxcc(self.de_dxcc_id)
# Remove NaNs in frequency # Remove NaNs in frequency
if freq and freq == float("nan"): if self.freq and self.freq == float("nan"):
freq = None self.freq = None
# Band from frequency # Band from frequency
if self.freq and not self.band: if self.freq and not self.band:

View File

@@ -3,16 +3,17 @@ requests-cache~=1.2.1
pyhamtools~=0.12.0 pyhamtools~=0.12.0
telnetlib3~=2.0.8 telnetlib3~=2.0.8
pytz~=2025.2 pytz~=2025.2
requests~=2.32.5 requests~=2.32.4
aprslib~=0.7.2 aprslib~=0.7.2
diskcache~=5.6.3 diskcache~=5.6.3
psutil~=7.1.0 psutil~=7.1.0
requests-sse~=0.5.2 requests-sse~=0.5.2
rss-parser~=2.1.1 rss-parser~=1.1.1
pyproj~=3.7.2 pyproj~=3.5.0;python_version<="3.8"
prometheus_client~=0.23.1 pyproj~=3.7.2;python_version>"3.8"
prometheus_client~=0.21.1
beautifulsoup4~=4.14.2 beautifulsoup4~=4.14.2
websocket-client~=1.9.0 websocket-client~=1.8.0
tornado~=6.5.4 tornado~=6.4.2
tornado_eventsource~=3.0.0 tornado_eventsource~=3.0.0
geopandas~=1.1.2 geopandas~=0.13.2

View File

@@ -3,7 +3,7 @@ import re
from datetime import datetime from datetime import datetime
import pytz import pytz
from rss_parser import RSSParser from rss_parser import Parser
from data.sig_ref import SIGRef from data.sig_ref import SIGRef
from data.spot import Spot from data.spot import Spot
@@ -23,7 +23,7 @@ class WOTA(HTTPSpotProvider):
def _http_response_to_spots(self, http_response): def _http_response_to_spots(self, http_response):
new_spots = [] new_spots = []
rss = RSSParser.parse(http_response.content.decode()) rss = Parser.parse(http_response.content.decode())
# Iterate through source data # Iterate through source data
for source_spot in rss.channel.items: for source_spot in rss.channel.items:

View File

@@ -67,7 +67,7 @@
<p>This software is dedicated to the memory of Tom G1PJB, SK, a friend and colleague who sadly passed away around the time I started writing it in Autumn 2025. I was looking forward to showing it to you when it was done.</p> <p>This software is dedicated to the memory of Tom G1PJB, SK, a friend and colleague who sadly passed away around the time I started writing it in Autumn 2025. I was looking forward to showing it to you when it was done.</p>
</div> </div>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-about").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-about").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -69,8 +69,8 @@
</div> </div>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/add-spot.js?v=1774894144"></script> <script src="/js/add-spot.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-add-spot").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-add-spot").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -56,8 +56,8 @@
</div> </div>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/alerts.js?v=1774894144"></script> <script src="/js/alerts.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-alerts").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-alerts").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -62,9 +62,9 @@
<script> <script>
let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %}; let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %};
</script> </script>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/spotsbandsandmap.js?v=1774894144"></script> <script src="/js/spotsbandsandmap.js?v=1774987999"></script>
<script src="/js/bands.js?v=1774894144"></script> <script src="/js/bands.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-bands").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-bands").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -46,10 +46,10 @@
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/tinycolor2@1.6.0/cjs/tinycolor.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/tinycolor2@1.6.0/cjs/tinycolor.min.js"></script>
<script src="https://misc.ianrenton.com/jsutils/utils.js?v=1774894144"></script> <script src="https://misc.ianrenton.com/jsutils/utils.js?v=1774987999"></script>
<script src="https://misc.ianrenton.com/jsutils/storage.js?v=1774894144"></script> <script src="https://misc.ianrenton.com/jsutils/storage.js?v=1774987999"></script>
<script src="https://misc.ianrenton.com/jsutils/ui-ham.js?v=1774894144"></script> <script src="https://misc.ianrenton.com/jsutils/ui-ham.js?v=1774987999"></script>
<script src="https://misc.ianrenton.com/jsutils/geo.js?v=1774894144"></script> <script src="https://misc.ianrenton.com/jsutils/geo.js?v=1774987999"></script>
</head> </head>
<body> <body>

View File

@@ -189,8 +189,8 @@
</div> </div>
</div> </div>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/conditions.js?v=1774894144"></script> <script src="/js/conditions.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-conditions").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-conditions").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -70,9 +70,9 @@
<script> <script>
let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %}; let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %};
</script> </script>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/spotsbandsandmap.js?v=1774894144"></script> <script src="/js/spotsbandsandmap.js?v=1774987999"></script>
<script src="/js/map.js?v=1774894144"></script> <script src="/js/map.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-map").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-map").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -87,9 +87,9 @@
<script> <script>
let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %}; let spotProvidersEnabledByDefault = {% raw json_encode(web_ui_options["spot-providers-enabled-by-default"]) %};
</script> </script>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/spotsbandsandmap.js?v=1774894144"></script> <script src="/js/spotsbandsandmap.js?v=1774987999"></script>
<script src="/js/spots.js?v=1774894144"></script> <script src="/js/spots.js?v=1774987999"></script>
<script>$(document).ready(function() { $("#nav-link-spots").addClass("active"); }); <!-- highlight active page in nav --></script> <script>$(document).ready(function() { $("#nav-link-spots").addClass("active"); }); <!-- highlight active page in nav --></script>
{% end %} {% end %}

View File

@@ -59,8 +59,8 @@
</div> </div>
</div> </div>
<script src="/js/common.js?v=1774894144"></script> <script src="/js/common.js?v=1774987999"></script>
<script src="/js/status.js?v=1774894144"></script> <script src="/js/status.js?v=1774987999"></script>
<script> <script>
$(document).ready(function() { $("#nav-link-status").addClass("active"); }); <!-- highlight active page in nav --> $(document).ready(function() { $("#nav-link-status").addClass("active"); }); <!-- highlight active page in nav -->
</script> </script>