Add icons back to spots & alerts

This commit is contained in:
Ian Renton
2026-09-05 09:48:56 +01:00
parent d6e53c14e9
commit 3e4327ec0c
20 changed files with 167 additions and 73 deletions
+39 -10
View File
@@ -20,6 +20,9 @@ class Alert:
# Unique identifier for the alert
id: str | None = None
# DX (alerting) operator info
# Callsigns of the operators that has been alerted
dx_calls: list | None = None
# Names of the operators that has been alerted
@@ -36,6 +39,9 @@ class Alert:
dx_cq_zone: int | None = None
# ITU zone of the DX operator
dx_itu_zone: int | None = None
# General alert info
# Intended frequencies & modes of operation. Essentially just a different kind of comment field.
freqs_modes: str | None = None
# Start time of the activation, UTC seconds since UNIX epoch
@@ -46,27 +52,41 @@ class Alert:
end_time: float | None = None
# End time of the activation of the alert, ISO 8601
end_time_iso: str | None = None
# Comment made by the alerter, if any
comment: str | None = None
# The type of alert this is: xOTA, DXpedition, or Contest.
alert_type: AlertType | None = None
# A URL link to more information, if any
url: str | None = None
# Special Interest Group info
# Special Interest Group (SIG), e.g. outdoor activity programme such as POTA
sig: str | None = None
# SIG references. We allow multiple here for e.g. n-fer activations, unlike ADIF SIG_INFO
sig_refs: list | None = None
# Timing info
# Time that this software received the alert, UTC seconds since UNIX epoch. This is used with the "since_received"
# call to our API to receive all data that is new to us, even if by a quirk of the API it might be older than the
# list time the client polled the API.
received_time: float | None = None
# Time that this software received the alert, ISO 8601
received_time_iso: str | None = None
# Comment made by the alerter, if any
comment: str | None = None
# Special Interest Group (SIG), e.g. outdoor activity programme such as POTA
sig: str | None = None
# SIG references. We allow multiple here for e.g. n-fer activations, unlike ADIF SIG_INFO
sig_refs: list | None = None
# The type of alert this is: xOTA, DXpedition, or Contest.
alert_type: AlertType | None = None
# A URL link to more information, if any
url: str | None = None
# Source info
# Where we got the alert from, e.g. "POTA", "SOTA"...
source: str | None = None
# The ID the source gave it, if any.
source_id: str | None = None
# Display info
# Icon to use when displaying this alert in the web UI. Chosen from the Font Awesome set.
icon: str | None = None
def infer_missing(self, credentials=None):
"""Infer missing parameters where possible"""
@@ -132,6 +152,15 @@ class Alert:
if self.dx_calls and not self.dx_names:
self.dx_names = [get_call_info(c, credentials).name for c in self.dx_calls]
# Icon for the spot should be the icon of the first SIG ref if present, otherwise a radio tower
self.icon = "fa-tower-cell"
if self.alert_type == AlertType.DXPEDITION:
self.icon = "fa-globe-africa"
elif self.alert_type == AlertType.CONTEST:
self.icon = "fa-trophy"
elif self.sig_refs and len(self.sig_refs) > 0 and self.sig_refs[0].icon:
self.icon = self.sig_refs[0].icon
except Exception:
logger.exception("Exception while inferring missing data from spot")
+4 -1
View File
@@ -1,6 +1,6 @@
from dataclasses import dataclass, field
from core.enums import SIGType
from core.enums import SIGRefType, SIGType
@dataclass
@@ -27,6 +27,9 @@ class SIG:
refs_globally_unique: bool
# SIG names as they might appear in cluster spot comments, e.g. ["TOTA"]
comment_names: list[str] = field(default_factory=list)
# Reference type, what gets activated e.g. Park, Summit. May be None if the SIG is for multiple types of things, in
# which case the spot data will have to provide this instead.
ref_type: SIGRefType | None = None
# Regex matcher for references, e.g. for POTA r"[A-Z]{2}\-\d+".
ref_regex: str | None = None
# Icon to use in the UI when referencing this SIG. Chosen from the Font Awesome set.
+2
View File
@@ -18,6 +18,8 @@ class SIGRef:
ref_type: SIGRefType | None = None
# URL to look up more information about the reference, if known.
url: str | None = None
# Icon to use for the reference, derived from the SIG. Chosen from the Font Awesome set.
icon: str | None = None
# Latitude of the reference, in degrees, if known.
latitude: float | None = None
# Longitude of the reference, in degrees, if known.
+10
View File
@@ -146,6 +146,11 @@ class Spot:
# The ID the source gave it, if any.
source_id: str | None = None
# Display info
# Icon to use when displaying this spot in the web UI. Chosen from the Font Awesome set.
icon: str | None = None
def __post_init__(self):
"""Normalise fields that don't survive a plain dict to Spot conversion. This is used in the "add spot" API
endpoint where the client is submitting JSON, and we want to recreate a full Spot object, including nested
@@ -455,6 +460,11 @@ class Spot:
self.de_longitude = de_call_info.longitude
self.de_grid = de_call_info.grid
# Icon for the spot should be the icon of the first SIG ref if present, otherwise a radio tower
self.icon = "fa-tower-cell"
if self.sig_refs and len(self.sig_refs) > 0 and self.sig_refs[0].icon:
self.icon = self.sig_refs[0].icon
except Exception:
logger.exception("Exception while inferring missing data from spot")