Overnight bug fixes

This commit is contained in:
Ian Renton
2026-08-18 17:56:31 +01:00
parent 38bc03a603
commit 7f1a5ae3be
12 changed files with 152 additions and 130 deletions
+7
View File
@@ -1,6 +1,7 @@
import logging import logging
from datetime import datetime from datetime import datetime
from typing import cast from typing import cast
from xml.parsers.expat import ExpatError
import pytz import pytz
from rss_parser import Parser as RSSParser from rss_parser import Parser as RSSParser
@@ -25,6 +26,8 @@ class WOTA(HTTPAlertProvider):
def _http_response_to_alerts(self, http_response): def _http_response_to_alerts(self, http_response):
new_alerts = [] new_alerts = []
try:
rss = cast(RSS, RSSParser.parse(http_response.content.decode("utf-8-sig"))) rss = cast(RSS, RSSParser.parse(http_response.content.decode("utf-8-sig")))
# Iterate through source data # Iterate through source data
for source_alert in rss.channel.items: for source_alert in rss.channel.items:
@@ -77,4 +80,8 @@ class WOTA(HTTPAlertProvider):
# Add to our list. # Add to our list.
new_alerts.append(alert) new_alerts.append(alert)
except ExpatError:
logger.warning("WOTA alert RSS feed was fetched but was invalid")
return new_alerts return new_alerts
+4 -4
View File
@@ -13,10 +13,10 @@ from providers.solarconditions.solar_conditions_provider import SolarConditionsP
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Each station gets polled roughly once every hour (3600 seconds). Note that to avoid a burst of requests to the server # Each station gets polled roughly once every two hours (7200 seconds). Note that to avoid a burst of requests to the
# every hour, the requests for data from each station are spaced out throughout the hour, leading to one request being # server every two hours, the requests for data from each station are spaced out throughout the period, leading to one
# sent every 1-2 minutes. # request being sent every 3-4 minutes.
POLL_INTERVAL = 3600 POLL_INTERVAL = 7200
# To avoid looking up all stations in the GIRO system and working out which ones are providing live data, this has been # To avoid looking up all stations in the GIRO system and working out which ones are providing live data, this has been
# manually determined and a CSV provided of all the stations that we can query for live data. # manually determined and a CSV provided of all the stations that we can query for live data.
STATIONS_INDEX = "datafiles/didbase-stations.csv" STATIONS_INDEX = "datafiles/didbase-stations.csv"
+10 -1
View File
@@ -1,3 +1,4 @@
import logging
from datetime import datetime from datetime import datetime
import requests import requests
@@ -7,6 +8,8 @@ from data.sig_ref import SIGRef
from data.spot import Spot from data.spot import Spot
from providers.spot.http_spot_provider import HTTPSpotProvider from providers.spot.http_spot_provider import HTTPSpotProvider
logger = logging.getLogger(__name__)
class Tiles(HTTPSpotProvider): class Tiles(HTTPSpotProvider):
"""Spot provider for Tiles on the Air""" """Spot provider for Tiles on the Air"""
@@ -39,13 +42,19 @@ class Tiles(HTTPSpotProvider):
# Iterate through source data # Iterate through source data
for source_spot in http_response.json()["spots"]: for source_spot in http_response.json()["spots"]:
# Convert to our spot format # Convert to our spot format
freq = None
try:
freq = float(strip_extra_decimal_points(source_spot["frequency"])) * 1000000
except ValueError:
logger.debug(f"Malformed frequency received from Tiles API: {source_spot['frequency']}")
spot = Spot( spot = Spot(
source=self.name, source=self.name,
source_id=source_spot["id"], source_id=source_spot["id"],
dx_call=source_spot["call_sign"].upper(), dx_call=source_spot["call_sign"].upper(),
# No separate spotter callsign, assume all spots are self-spots # No separate spotter callsign, assume all spots are self-spots
de_call=source_spot["call_sign"].upper(), de_call=source_spot["call_sign"].upper(),
freq=float(strip_extra_decimal_points(source_spot["frequency"])) * 1000000, freq=freq,
mode=source_spot["mode"].upper(), mode=source_spot["mode"].upper(),
comment=source_spot["notes"], comment=source_spot["notes"],
sig="Tiles", sig="Tiles",
+6
View File
@@ -2,6 +2,7 @@ import logging
import re import re
from datetime import datetime from datetime import datetime
from typing import cast from typing import cast
from xml.parsers.expat import ExpatError
import pytz import pytz
from rss_parser import Parser from rss_parser import Parser
@@ -26,6 +27,7 @@ class WOTA(HTTPSpotProvider):
def _http_response_to_spots(self, http_response): def _http_response_to_spots(self, http_response):
new_spots = [] new_spots = []
try:
rss = cast(RSS, Parser.parse(http_response.content.decode("utf-8-sig"))) rss = cast(RSS, Parser.parse(http_response.content.decode("utf-8-sig")))
# Iterate through source data # Iterate through source data
for source_spot in rss.channel.items: for source_spot in rss.channel.items:
@@ -93,6 +95,10 @@ class WOTA(HTTPSpotProvider):
new_spots.append(spot) new_spots.append(spot)
except Exception: except Exception:
logger.exception("Exception parsing WOTA spot") logger.exception("Exception parsing WOTA spot")
except ExpatError:
logger.warning("WOTA spot RSS feed was fetched but was invalid")
return new_spots return new_spots
def can_submit_spot(self, sig): def can_submit_spot(self, sig):
+1 -1
View File
@@ -76,7 +76,7 @@
</div> </div>
<script src="/static/js/add-spot.js?v=1786980624"></script> <script src="/static/js/add-spot.js?v=1787072191"></script>
<script>$(document).ready(function () { <script>$(document).ready(function () {
$("#nav-link-add-spot").addClass("active"); $("#nav-link-add-spot").addClass("active");
}); <!-- highlight active page in nav --></script> }); <!-- highlight active page in nav --></script>
+1 -1
View File
@@ -84,7 +84,7 @@
</div> </div>
<script src="/static/js/alerts.js?v=1786980625"></script> <script src="/static/js/alerts.js?v=1787072191"></script>
<script>$(document).ready(function () { <script>$(document).ready(function () {
$("#nav-link-alerts").addClass("active"); $("#nav-link-alerts").addClass("active");
}); <!-- highlight active page in nav --></script> }); <!-- highlight active page in nav --></script>
+2 -2
View File
@@ -76,8 +76,8 @@
</div> </div>
<script src="/static/js/spotsbandsandmap.js?v=1786980624"></script> <script src="/static/js/spotsbandsandmap.js?v=1787072191"></script>
<script src="/static/js/bands.js?v=1786980624"></script> <script src="/static/js/bands.js?v=1787072191"></script>
<script>$(document).ready(function () { <script>$(document).ready(function () {
$("#nav-link-bands").addClass("active"); $("#nav-link-bands").addClass("active");
}); <!-- highlight active page in nav --></script> }); <!-- highlight active page in nav --></script>
+5 -5
View File
@@ -1,6 +1,6 @@
{% extends "skeleton.html" %} {% extends "skeleton.html" %}
{% block head_extra %} {% block head_extra %}
<link rel="stylesheet" href="/static/css/style.css?v=1786980624" type="text/css"> <link rel="stylesheet" href="/static/css/style.css?v=1787072191" type="text/css">
<link href="/static/vendor/css/bootstrap-5.3.8.min.css" rel="stylesheet"> <link href="/static/vendor/css/bootstrap-5.3.8.min.css" rel="stylesheet">
<link href="/static/vendor/css/fontawesome-6.7.2.min.css" rel="stylesheet"> <link href="/static/vendor/css/fontawesome-6.7.2.min.css" rel="stylesheet">
<link href="/static/vendor/css/solid-6.7.2.min.css" rel="stylesheet"> <link href="/static/vendor/css/solid-6.7.2.min.css" rel="stylesheet">
@@ -15,10 +15,10 @@
window.fetchEventSource = fetchEventSource; window.fetchEventSource = fetchEventSource;
</script> </script>
<script src="/static/js/utils.js?v=1786980624"></script> <script src="/static/js/utils.js?v=1787072191"></script>
<script src="/static/js/ui-ham.js?v=1786980624"></script> <script src="/static/js/ui-ham.js?v=1787072191"></script>
<script src="/static/js/geo.js?v=1786980624"></script> <script src="/static/js/geo.js?v=1787072191"></script>
<script src="/static/js/common.js?v=1786980624"></script> <script src="/static/js/common.js?v=1787072191"></script>
{% end %} {% end %}
{% block body %} {% block body %}
<div class="container"> <div class="container">
+1 -1
View File
@@ -284,7 +284,7 @@
</div> </div>
<script src="/static/vendor/js/chart-4.4.9.umd.min.js"></script> <script src="/static/vendor/js/chart-4.4.9.umd.min.js"></script>
<script src="/static/js/conditions.js?v=1786980624"></script> <script src="/static/js/conditions.js?v=1787072191"></script>
<script>$(document).ready(function () { <script>$(document).ready(function () {
$("#nav-link-conditions").addClass("active"); $("#nav-link-conditions").addClass("active");
}); <!-- highlight active page in nav --></script> }); <!-- highlight active page in nav --></script>
+2 -2
View File
@@ -109,8 +109,8 @@
<script src="/static/vendor/js/leaflet-cqzones.js"></script> <script src="/static/vendor/js/leaflet-cqzones.js"></script>
<script src="/static/vendor/js/leaflet-workedallbritainireland.js" type="module"></script> <script src="/static/vendor/js/leaflet-workedallbritainireland.js" type="module"></script>
<script src="/static/js/spotsbandsandmap.js?v=1786980625"></script> <script src="/static/js/spotsbandsandmap.js?v=1787072191"></script>
<script src="/static/js/map.js?v=1786980625"></script> <script src="/static/js/map.js?v=1787072191"></script>
<script>$(document).ready(function () { <script>$(document).ready(function () {
$("#nav-link-map").addClass("active"); $("#nav-link-map").addClass("active");
}); <!-- highlight active page in nav --></script> }); <!-- highlight active page in nav --></script>
+2 -2
View File
@@ -113,8 +113,8 @@
</div> </div>
<script src="/static/js/spotsbandsandmap.js?v=1786980624"></script> <script src="/static/js/spotsbandsandmap.js?v=1787072191"></script>
<script src="/static/js/spots.js?v=1786980624"></script> <script src="/static/js/spots.js?v=1787072191"></script>
<script>$(document).ready(function () { <script>$(document).ready(function () {
$("#nav-link-spots").addClass("active"); $("#nav-link-spots").addClass("active");
}); <!-- highlight active page in nav --></script> }); <!-- highlight active page in nav --></script>
+1 -1
View File
@@ -86,7 +86,7 @@
</div> </div>
</div> </div>
<script src="/static/js/status.js?v=1786980624"></script> <script src="/static/js/status.js?v=1787072191"></script>
<script> <script>
$(document).ready(function () { $(document).ready(function () {
$("#nav-link-status").addClass("active"); $("#nav-link-status").addClass("active");