Start converting some enum-like strings to proper enums

This commit is contained in:
Ian Renton
2026-09-02 07:26:02 +01:00
parent 55eaa871e9
commit fa2e4b929a
21 changed files with 132 additions and 111 deletions
+3 -2
View File
@@ -7,6 +7,7 @@ from datetime import datetime, timedelta
import pytz
from core.call_lookup_helper import get_call_info
from core.enums import Continent
from core.sig_lookup_helper import populate_missing_sig_ref_info
from core.utils import get_flag_for_dxcc
@@ -28,7 +29,7 @@ class Alert:
# Country flag of the DX operator
dx_flag: str | None = None
# Continent of the DX operator
dx_continent: str | None = None
dx_continent: Continent | None = None
# DXCC ID of the DX operator
dx_dxcc_id: int | None = None
# CQ zone of the DX operator
@@ -92,7 +93,7 @@ class Alert:
if self.dx_calls and self.dx_calls[0] and not self.dx_country:
self.dx_country = call_info.country
if self.dx_calls and self.dx_calls[0] and not self.dx_continent:
self.dx_continent = call_info.continent
self.dx_continent = Continent(call_info.continent)
if self.dx_calls and self.dx_calls[0] and not self.dx_cq_zone:
self.dx_cq_zone = call_info.cq_zone
if self.dx_calls and self.dx_calls[0] and not self.dx_itu_zone:
+3 -1
View File
@@ -1,5 +1,7 @@
from dataclasses import dataclass
from core.enums import LocationSourceForCallsign
@dataclass
class Callsign:
@@ -36,7 +38,7 @@ class Callsign:
# ITU zone in which the callsign indicates they are operating
itu_zone: int | None = None
# Location source. This can be "HOME QTH" or "DXCC" depending on which provider gave us a location
location_source: str | None = None
location_source: LocationSourceForCallsign = LocationSourceForCallsign.NONE
def fully_populated(self):
"""Utility method to indicate that the callsign data is fully populated. Multiple providers can return data for
+20 -20
View File
@@ -12,6 +12,7 @@ from pyhamtools.locator import latlong_to_locator, locator_to_latlong
from core.call_lookup_helper import get_call_info
from core.config import MAX_SPOT_AGE
from core.constants import MODE_ALIASES, PROPAGATION_MODES, SIGS
from core.enums import Continent, LocationSourceForSpot, ModeSource
from core.geo_utils import lat_lon_to_cq_zone, lat_lon_to_itu_zone
from core.sig_lookup_helper import populate_missing_sig_ref_info
from core.sig_utils import (
@@ -52,7 +53,7 @@ class Spot:
# Country flag of the DX operator
dx_flag: str | None = None
# Continent of the DX operator
dx_continent: str | None = None
dx_continent: Continent | None = None
# DXCC ID of the DX operator
dx_dxcc_id: int | None = None
# CQ zone of the DX operator
@@ -68,9 +69,8 @@ class Spot:
# lookup
dx_latitude: float | None = None
dx_longitude: float | None = None
# DX Location source. Indicates how accurate the location might be. Values: "SPOT", "GRID", "SIG REF LOOKUP",
# "HOME QTH", "DXCC", "NONE"
dx_location_source: str = "NONE"
# DX Location source. Indicates how accurate the location might be.
dx_location_source: LocationSourceForSpot = LocationSourceForSpot.NONE
# DX Location good. Indicates that the software thinks the location data is good enough to plot on a map. This is
# true if the location source is "SPOT", "SIG REF LOOKUP" or "GRID", or if the location source is "HOME QTH" and the
# DX callsign doesn't have a suffix like /P.
@@ -85,7 +85,7 @@ class Spot:
# Country flag of the spotter
de_flag: str | None = None
# Continent of the spotter
de_continent: str | None = None
de_continent: Continent | None = None
# DXCC ID of the spotter
de_dxcc_id: int | None = None
# If this is an APRS/Packet/etc spot, what SSID was the spotter/receiver using?
@@ -107,7 +107,7 @@ class Spot:
# Inferred mode "family". One of "CW", "PHONE" or "DIGI".
mode_type: str | None = None
# Source of the mode information. "SPOT", "COMMENT", "BANDPLAN" or "NONE"
mode_source: str = "NONE"
mode_source: ModeSource = ModeSource.NONE
# Frequency, in Hz
freq: float | None = None
# Band, defined by the frequency, e.g. "40m" or "70cm"
@@ -185,7 +185,7 @@ class Spot:
if self.dx_call and not self.dx_country:
self.dx_country = dx_call_info.country
if self.dx_call and not self.dx_continent:
self.dx_continent = dx_call_info.continent
self.dx_continent = Continent(dx_call_info.continent)
if self.dx_call and not self.dx_dxcc_id:
self.dx_dxcc_id = dx_call_info.dxcc_id
if self.dx_dxcc_id and not self.dx_flag:
@@ -223,7 +223,7 @@ class Spot:
if not self.de_country:
self.de_country = de_call_info.country
if not self.de_continent:
self.de_continent = de_call_info.continent
self.de_continent = Continent(de_call_info.continent)
if not self.de_dxcc_id:
self.de_dxcc_id = de_call_info.dxcc_id
if self.de_dxcc_id and not self.de_flag:
@@ -240,13 +240,13 @@ class Spot:
# Mode from comments or bandplan
if self.mode:
self.mode_source = "SPOT"
self.mode_source = ModeSource.SPOT
if self.comment and not self.mode:
self.mode = infer_mode_from_comment(self.comment)
self.mode_source = "COMMENT"
self.mode_source = ModeSource.COMMENT
if self.freq and not self.mode:
self.mode = infer_mode_from_frequency(self.freq)
self.mode_source = "BANDPLAN"
self.mode_source = ModeSource.BANDPLAN
# Normalise mode if necessary.
if self.mode in MODE_ALIASES:
@@ -258,7 +258,7 @@ class Spot:
# If we have a latitude or grid at this point, it can only have been provided by the spot itself
if self.dx_latitude or self.dx_grid:
self.dx_location_source = "SPOT"
self.dx_location_source = LocationSourceForSpot.SPOT
# Set the top-level "SIG" if it is missing but we have at least one SIG ref.
if not self.sig and self.sig_refs and len(self.sig_refs) > 0:
@@ -324,9 +324,9 @@ class Spot:
self.dx_latitude = sig_ref.latitude
self.dx_longitude = sig_ref.longitude
if self.sig == "WAB" or self.sig == "WAI" or self.sig == "Tiles":
self.dx_location_source = "GRID"
self.dx_location_source = LocationSourceForSpot.GRID
else:
self.dx_location_source = "SIG REF LOOKUP"
self.dx_location_source = LocationSourceForSpot.SIG_REF_LOOKUP
# If the spot itself doesn't have a SIG yet, but we have at least one SIG reference, take that reference's SIG
# and apply it to the whole spot.
@@ -347,7 +347,7 @@ class Spot:
self.de_grid = grid_mode_grid_match.group(1).upper()
if not self.dx_grid:
self.dx_grid = grid_mode_grid_match.group(4).upper()
self.dx_location_source = "GRID"
self.dx_location_source = LocationSourceForSpot.GRID
# And extract propagation mode (group 2 for <...>, group 3 for (...)):
mode_tag = (grid_mode_grid_match.group(2) or grid_mode_grid_match.group(3) or "").upper()
@@ -368,7 +368,7 @@ class Spot:
# regex matches, so extract grids:
if not self.dx_grid:
self.dx_grid = grid_mode_grid_match.group(1).upper()
self.dx_location_source = "GRID"
self.dx_location_source = LocationSourceForSpot.GRID
if not self.de_grid:
self.de_grid = grid_mode_grid_match.group(2).upper()
@@ -440,10 +440,10 @@ class Spot:
self.dx_latitude
and self.dx_longitude
and (
self.dx_location_source == "SPOT"
or self.dx_location_source == "SIG REF LOOKUP"
or self.dx_location_source == "GRID"
or (self.dx_location_source == "HOME QTH" and "/" not in (self.dx_call or ""))
self.dx_location_source == LocationSourceForSpot.SPOT
or self.dx_location_source == LocationSourceForSpot.SIG_REF_LOOKUP
or self.dx_location_source == LocationSourceForSpot.GRID
or (self.dx_location_source == LocationSourceForSpot.HOME_QTH and "/" not in (self.dx_call or ""))
)
)