mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2026-09-20 22:37:44 +00:00
Add a has_refs field to activities #147
This commit is contained in:
+135
-93
@@ -1,444 +1,486 @@
|
||||
from core.enums import ActivityName, ActivityType, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, ActivityType
|
||||
from data.activity import Activity
|
||||
|
||||
|
||||
ACTIVITIES: dict[ActivityName, Activity] = {
|
||||
ActivityName.CONTEST: Activity(
|
||||
name=ActivityName.CONTEST,
|
||||
description="Contest",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
# No sensible way to determine *which* contest, but if we set comment_names=["CONTEST"] then at least
|
||||
# any spots with "contest" in the comment will get allocated to this activity.
|
||||
comment_names=["CONTEST"],
|
||||
description="Contest",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-trophy",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.DXPEDITION: Activity(
|
||||
name=ActivityName.DXPEDITION,
|
||||
description="Radio expedition to a remote location",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
# DXpedition stations are never really spotted with "DXpedition" in the comments, but we can assign
|
||||
# this activity to a spot other ways.
|
||||
comment_names=[],
|
||||
description="Radio expedition to a remote location",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-book-atlas",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.SATELLITE: Activity(
|
||||
name=ActivityName.SATELLITE,
|
||||
comment_names=[],
|
||||
description="Amateur Radio Satellite",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-satellite",
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
comment_names=[],
|
||||
icon="fa-satellite",
|
||||
),
|
||||
ActivityName.EME: Activity(
|
||||
name=ActivityName.EME,
|
||||
comment_names=[],
|
||||
description="Earth-Moon-Earth (Moonbounce)",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-moon",
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
comment_names=[],
|
||||
icon="fa-moon",
|
||||
),
|
||||
ActivityName.AERONAUTICAL_MOBILE: Activity(
|
||||
name=ActivityName.AERONAUTICAL_MOBILE,
|
||||
# Don't pick /AM out of comments, spot.py will handle picking it out of the callsign
|
||||
comment_names=[],
|
||||
description="Aeronautical Mobile",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-plane",
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
# Don't pick /AM out of comments, spot.py will handle picking it out of the callsign
|
||||
comment_names=[],
|
||||
icon="fa-plane",
|
||||
),
|
||||
ActivityName.MARITIME_MOBILE: Activity(
|
||||
name=ActivityName.MARITIME_MOBILE,
|
||||
# Don't pick /MM out of comments, spot.py will handle picking it out of the callsign
|
||||
comment_names=[],
|
||||
description="Maritime Mobile",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-sailboat",
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
# Don't pick /MM out of comments, spot.py will handle picking it out of the callsign
|
||||
comment_names=[],
|
||||
icon="fa-sailboat",
|
||||
),
|
||||
ActivityName.QRP: Activity(
|
||||
name=ActivityName.QRP,
|
||||
comment_names=["QRP"],
|
||||
description="Low power",
|
||||
sig_type=ActivityType.TRADITIONAL,
|
||||
icon="fa-volume-low",
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
comment_names=["QRP"],
|
||||
icon="fa-volume-low",
|
||||
),
|
||||
ActivityName.POTA: Activity(
|
||||
name=ActivityName.POTA,
|
||||
comment_names=["POTA"],
|
||||
description="Parks on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.PARK,
|
||||
ref_regex=r"[A-Z]{2}\-\d{4,5}|K\-TEST",
|
||||
comment_names=["POTA"],
|
||||
icon="fa-tree",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.SOTA: Activity(
|
||||
name=ActivityName.SOTA,
|
||||
comment_names=["SOTA"],
|
||||
description="Summits on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.SUMMIT,
|
||||
ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}",
|
||||
comment_names=["SOTA"],
|
||||
icon="fa-mountain-sun",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.WWFF: Activity(
|
||||
name=ActivityName.WWFF,
|
||||
comment_names=["WWFF"],
|
||||
description="World Wide Flora & Fauna",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.PARK,
|
||||
ref_regex=r"[A-Z0-9]{1,3}FF\-\d{4}",
|
||||
comment_names=["WWFF"],
|
||||
icon="fa-seedling",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.GMA: Activity(
|
||||
name=ActivityName.GMA,
|
||||
comment_names=["GMA"],
|
||||
description="Global Mountain Activity",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.SUMMIT,
|
||||
ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}",
|
||||
comment_names=["GMA"],
|
||||
icon="fa-person-hiking",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.WWBOTA: Activity(
|
||||
name=ActivityName.WWBOTA,
|
||||
comment_names=["WWBOTA", "BOTA"],
|
||||
description="Worldwide Bunkers on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.BUNKER,
|
||||
ref_regex=r"B\/[A-Z0-9]{1,3}\-\d{3,4}",
|
||||
comment_names=["WWBOTA", "BOTA"],
|
||||
icon="fa-radiation",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.HEMA: Activity(
|
||||
name=ActivityName.HEMA,
|
||||
comment_names=["HEMA"],
|
||||
description="HuMPs Excluding Marilyns Award",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.SUMMIT,
|
||||
ref_regex=r"[A-Z0-9]{1,3}\/[A-Z]{3}\-\d{3}",
|
||||
comment_names=["HEMA"],
|
||||
icon="fa-mound",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.IOTA: Activity(
|
||||
name=ActivityName.IOTA,
|
||||
comment_names=["IOTA"],
|
||||
description="Islands on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.ISLAND,
|
||||
ref_regex=r"[A-Z]{2}\-\d{3}",
|
||||
comment_names=["IOTA"],
|
||||
icon="fa-book-atlas",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.GMA_ISLANDS: Activity(
|
||||
name=ActivityName.GMA_ISLANDS,
|
||||
comment_names=[],
|
||||
description="Global Mountain Activity - Islands",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.ISLAND,
|
||||
ref_regex=r"(([A-Z]{2}\-\d{3})|([A-Z0-9]{1,3}\/[A-Z]{2}\-\d{3}))",
|
||||
comment_names=[],
|
||||
icon="fa-person-hiking",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.ARLHS: Activity(
|
||||
name=ActivityName.ARLHS,
|
||||
comment_names=["ARLHS"],
|
||||
description="Amateur Radio Lighthouse Society",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.LIGHTHOUSE,
|
||||
ref_regex=r"[A-Z]{3}[\- ]\d{3,4}",
|
||||
comment_names=["ARLHS"],
|
||||
icon="fa-house-flood-water",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.ILLW: Activity(
|
||||
name=ActivityName.ILLW,
|
||||
comment_names=["ILLW"],
|
||||
description="International Lighthouse & Lightship Weekend",
|
||||
sig_type=ActivityType.EVENT,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.LIGHTHOUSE,
|
||||
ref_regex=r"[A-Z]{2}\d{4}",
|
||||
comment_names=["ILLW"],
|
||||
icon="fa-house-flood-water",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.MOTA: Activity(
|
||||
name=ActivityName.MOTA,
|
||||
comment_names=["MOTA"],
|
||||
description="Mills on the Air",
|
||||
sig_type=ActivityType.EVENT,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.MILL,
|
||||
ref_regex=r"X\d{4,6}",
|
||||
comment_names=["MOTA"],
|
||||
icon="fa-fan",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.SIOTA: Activity(
|
||||
name=ActivityName.SIOTA,
|
||||
comment_names=["SIOTA"],
|
||||
description="Silos on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.SILO,
|
||||
ref_regex=r"[A-Z]{2}\-[A-Z]{3}\d",
|
||||
comment_names=["SIOTA"],
|
||||
icon="fa-wheat-awn",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.WCA: Activity(
|
||||
name=ActivityName.WCA,
|
||||
comment_names=["WCA"],
|
||||
description="World Castles Award",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.CASTLE,
|
||||
ref_regex=r"[A-Z0-9]{1,3}\-\d{5}",
|
||||
comment_names=["WCA"],
|
||||
icon="fa-chess-rook",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.ZLOTA: Activity(
|
||||
name=ActivityName.ZLOTA,
|
||||
comment_names=["ZLOTA"],
|
||||
description="New Zealand on the Air",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=None,
|
||||
ref_regex=r"ZL[A-Z]/[A-Z]{2}\-\d{3,4}",
|
||||
comment_names=["ZLOTA"],
|
||||
icon="fa-kiwi-bird",
|
||||
region_flag="🇳🇿",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.WOTA: Activity(
|
||||
name=ActivityName.WOTA,
|
||||
comment_names=["WOTA"],
|
||||
description="Wainwrights on the Air",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.SUMMIT,
|
||||
ref_regex=r"[A-Z]{3}-[0-9]{2}",
|
||||
comment_names=["WOTA"],
|
||||
icon="fa-w",
|
||||
region_flag="🇬🇧",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.BOTA: Activity(
|
||||
name=ActivityName.BOTA,
|
||||
comment_names=[],
|
||||
description="Beaches on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
ref_type=ActivityRefType.BEACH,
|
||||
icon="fa-umbrella-beach",
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.BEACH,
|
||||
comment_names=[],
|
||||
icon="fa-umbrella-beach",
|
||||
),
|
||||
ActivityName.KRMNPA: Activity(
|
||||
name=ActivityName.KRMNPA,
|
||||
comment_names=["KRMNPA"],
|
||||
description="Keith Roget Memorial National Parks Award",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.PARK,
|
||||
ref_regex=r"VKFF\-\d{4}",
|
||||
comment_names=["KRMNPA"],
|
||||
icon="fa-earth-oceania",
|
||||
region_flag="🇦🇺",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.SANPCPA: Activity(
|
||||
name=ActivityName.SANPCPA,
|
||||
comment_names=["SANPCPA"],
|
||||
description="South Australian National Parks and Conservation Parks Award",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.PARK,
|
||||
ref_regex=r"VKFF\-\d{4}",
|
||||
comment_names=["SANPCPA"],
|
||||
icon="fa-earth-oceania",
|
||||
region_flag="🇦🇺",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.LLOTA: Activity(
|
||||
name=ActivityName.LLOTA,
|
||||
comment_names=["LLOTA"],
|
||||
description="Lagos y Lagunas on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.LAKE,
|
||||
ref_regex=r"LL[A-Z]{2}\-\d{4}",
|
||||
comment_names=["LLOTA"],
|
||||
icon="fa-water",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.TOWERS: Activity(
|
||||
name=ActivityName.TOWERS,
|
||||
comment_names=["TOTA"],
|
||||
description="Towers on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.TOWER,
|
||||
ref_regex=r"[A-Z]{2,3}R\-\d{4}",
|
||||
comment_names=["TOTA"],
|
||||
icon="fa-tower-observation",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.TILES: Activity(
|
||||
name=ActivityName.TILES,
|
||||
comment_names=[],
|
||||
description="Tiles on the Air",
|
||||
sig_type=ActivityType.ADVENTURE,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.GRID,
|
||||
ref_regex=r"[A-Za-z]{2}[0-9]{2}[A-Za-z]{2}",
|
||||
comment_names=[],
|
||||
icon="fa-square",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.RADAR_RALLY: Activity(
|
||||
name=ActivityName.RADAR_RALLY,
|
||||
comment_names=["RaDAR"],
|
||||
description="RaDAR Rally",
|
||||
sig_type=ActivityType.EVENT,
|
||||
icon="fa-headset",
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
comment_names=["RaDAR"],
|
||||
icon="fa-headset",
|
||||
),
|
||||
ActivityName.WAB: Activity(
|
||||
name=ActivityName.WAB,
|
||||
comment_names=["WAB"],
|
||||
description="Worked All Britain",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.GRID,
|
||||
ref_regex=r"[A-Z]{1,2}[0-9]{2}",
|
||||
comment_names=["WAB"],
|
||||
icon="fa-table-cells-large",
|
||||
region_flag="🇬🇧",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.WAI: Activity(
|
||||
name=ActivityName.WAI,
|
||||
comment_names=["WAI"],
|
||||
description="Worked All Ireland",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.GRID,
|
||||
ref_regex=r"[A-Z][0-9]{2}",
|
||||
comment_names=["WAI"],
|
||||
icon="fa-table-cells-large",
|
||||
region_flag="🇮🇪",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.DMF: Activity(
|
||||
name=ActivityName.DMF,
|
||||
comment_names=["DMF"],
|
||||
description="Diplôme des Moulins de France",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.MILL,
|
||||
comment_names=["DMF"],
|
||||
icon="fa-fan",
|
||||
region_flag="🇫🇷",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.DME: Activity(
|
||||
name=ActivityName.DME,
|
||||
comment_names=["DME"],
|
||||
description="Diploma Municipios de España",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.TOWN,
|
||||
ref_regex=r"DME[\- ]\d{3,5}",
|
||||
comment_names=["DME"],
|
||||
icon="fa-building",
|
||||
region_flag="🇪🇸",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.FEA: Activity(
|
||||
name=ActivityName.FEA,
|
||||
comment_names=["FEA"],
|
||||
description="Diploma Faros de España",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.LIGHTHOUSE,
|
||||
# FEA references are technically [DE]\-\d{4}(\.\d)? but spotters always seem to miss out the D- or E-
|
||||
# prefix and just use FEA-1234 or FEA 1234, so allow for that. The FEA activity ref data provider adds both
|
||||
# forms to the database.
|
||||
ref_regex=r"([DE]|FEA)[\- ]\d{4}(\.\d)?",
|
||||
comment_names=["FEA"],
|
||||
icon="fa-house-flood-water",
|
||||
region_flag="🇪🇸",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.DMUE: Activity(
|
||||
name=ActivityName.DMUE,
|
||||
comment_names=["DMUE"],
|
||||
description="Diploma Museos de España",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.BUILDING,
|
||||
ref_regex=r"MUE[A-Z]{2}-\d{3}",
|
||||
comment_names=["DMUE"],
|
||||
icon="fa-landmark",
|
||||
region_flag="🇪🇸",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.DMVE: Activity(
|
||||
name=ActivityName.DMVE,
|
||||
comment_names=["DMVE"],
|
||||
description="Diploma Monumentos y Vestigios de España",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.BUILDING,
|
||||
ref_regex=r"MV[A-Z]{1,2}-\d{4}",
|
||||
comment_names=["DMVE"],
|
||||
icon="fa-monument",
|
||||
region_flag="🇪🇸",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.DCE: Activity(
|
||||
name=ActivityName.DCE,
|
||||
comment_names=["DCE"],
|
||||
description="Diploma Castillos de España",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.CASTLE,
|
||||
ref_regex=r"C[A-Z]{1,2}-\d{3}",
|
||||
comment_names=["DCE"],
|
||||
icon="fa-chess-rook",
|
||||
region_flag="🇪🇸",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.DEFE: Activity(
|
||||
name=ActivityName.DEFE,
|
||||
comment_names=["DEFE"],
|
||||
description="Diploma Estaciones de Ferrocarril de España",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.BUILDING,
|
||||
ref_regex=r"EF[A-Z]{1,2}-\d{3}",
|
||||
comment_names=["DEFE"],
|
||||
icon="fa-train",
|
||||
region_flag="🇪🇸",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.DTMBA: Activity(
|
||||
name=ActivityName.DTMBA,
|
||||
comment_names=["DTMBA"],
|
||||
description="Diploma Teatri Musei e Belle Arti",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.BUILDING,
|
||||
ref_regex=r"I-?[0-9]{3,4}\s?[A-Z]{2}",
|
||||
comment_names=["DTMBA"],
|
||||
icon="fa-landmark",
|
||||
region_flag="🇮🇹",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
ActivityName.BIWOTA: Activity(
|
||||
name=ActivityName.BIWOTA,
|
||||
comment_names=["BIWOTA"],
|
||||
description="British Inland Waterways on the Air",
|
||||
sig_type=ActivityType.EVENT,
|
||||
has_refs=False,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.WATERWAY,
|
||||
comment_names=["BIWOTA"],
|
||||
icon="fa-ship",
|
||||
region_flag="🇬🇧",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.COTA: Activity(
|
||||
name=ActivityName.COTA,
|
||||
comment_names=["COTA"],
|
||||
description="Castles on the Air",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.CASTLE,
|
||||
ref_regex=r"[A-Z]{3}\-[0-9]{3,5}",
|
||||
comment_names=["COTA"],
|
||||
icon="fa-chess-rook",
|
||||
region_flag="🇩🇪",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.PGA: Activity(
|
||||
name=ActivityName.PGA,
|
||||
comment_names=["PGA"],
|
||||
description="Polish Gmina Award",
|
||||
sig_type=ActivityType.REGIONAL,
|
||||
has_refs=True,
|
||||
refs_globally_unique=False,
|
||||
ref_type=ActivityRefType.REGION,
|
||||
ref_regex=r"[A-Z]{2}[0-9]{2}",
|
||||
comment_names=["PGA"],
|
||||
icon="fa-g",
|
||||
region_flag="🇵🇱",
|
||||
refs_globally_unique=False,
|
||||
),
|
||||
ActivityName.TOILETS: Activity(
|
||||
name=ActivityName.TOILETS,
|
||||
comment_names=[],
|
||||
description="Toilets on the Air",
|
||||
sig_type=ActivityType.EVENT,
|
||||
has_refs=True,
|
||||
refs_globally_unique=True,
|
||||
ref_type=ActivityRefType.TOILET,
|
||||
ref_regex=r"T\-[0-9]{2}",
|
||||
comment_names=[],
|
||||
icon="fa-toilet",
|
||||
region_flag="🏴☠️",
|
||||
refs_globally_unique=True,
|
||||
),
|
||||
}
|
||||
|
||||
+6
-3
@@ -21,6 +21,8 @@ class Activity:
|
||||
# Type, either Worldwide, Regional or Event. Used for sorting in the web UI.
|
||||
# Note: this field is still named "sig_type" in the API for backwards compatibility.
|
||||
sig_type: ActivityType
|
||||
# Whether this activity has a fixed set of references (e.g. parks) with some sort of ID to "activate"
|
||||
has_refs: bool
|
||||
# Identifies that the activity's reference ID structure defined by its regex is unique across all programmes and
|
||||
# anything else we expect a user to put in a spot comment, and therefore we can pull references out of
|
||||
# spot comments without also needing to see the activity name first. For example, "OHFF-1234" or "B/G-1234" are
|
||||
@@ -28,13 +30,14 @@ class Activity:
|
||||
# conceivably be POTA or ILLW, etc. So in those cases we need to see the name of the activity itself immediately
|
||||
# before it.
|
||||
refs_globally_unique: bool
|
||||
# Activity 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 activity is for multiple types of
|
||||
# things, in which case the spot data will have to provide this instead.
|
||||
ref_type: ActivityRefType | None = None
|
||||
# Regex matcher for references, e.g. for POTA r"[A-Z]{2}\-\d+".
|
||||
# Regex matcher for references, e.g. for POTA r"[A-Z]{2}\-\d+". Only set when has_references is True and we know
|
||||
# the fixed format references take for this activity.
|
||||
ref_regex: str | None = None
|
||||
# Activity names as they might appear in cluster spot comments, e.g. ["TOTA"]
|
||||
comment_names: list[str] = field(default_factory=list)
|
||||
# Icon to use in the UI when referencing this activity. Chosen from the Font Awesome set.
|
||||
icon: str | None = None
|
||||
# Emoji flag for the country or region where this activity is relevant, if any. If None, this implies the
|
||||
|
||||
+5
-4
@@ -12,6 +12,7 @@ from pyhamtools.locator import latlong_to_locator, locator_to_latlong
|
||||
from core.activity_lookup_helper import populate_missing_activity_ref_info
|
||||
from core.activity_utils import (
|
||||
ANY_ACTIVITY_REGEX,
|
||||
get_activity_by_name,
|
||||
get_activity_name_from_comment_name,
|
||||
get_icon_for_activity,
|
||||
get_ref_regex_for_activity,
|
||||
@@ -296,10 +297,10 @@ class Spot:
|
||||
|
||||
# Now look to see if that activity name was followed by something that looks like a reference ID
|
||||
# for that activity. If so, add that to the sig_refs list for this spot.
|
||||
ref_regex = get_ref_regex_for_activity(found_activity)
|
||||
if ref_regex:
|
||||
found_activity_info = get_activity_by_name(found_activity)
|
||||
if found_activity_info and found_activity_info.has_refs and found_activity_info.ref_regex:
|
||||
ref_matches = re.finditer(
|
||||
r"(^|\W)" + found_activity + r"([ -])(" + ref_regex + r")($|\W)",
|
||||
r"(^|\W)" + found_activity + r"([ -])(" + found_activity_info.ref_regex + r")($|\W)",
|
||||
self.comment,
|
||||
re.IGNORECASE,
|
||||
)
|
||||
@@ -313,7 +314,7 @@ class Spot:
|
||||
# activity.
|
||||
if self.comment:
|
||||
for activity in ACTIVITIES.values():
|
||||
if activity.refs_globally_unique and activity.ref_regex:
|
||||
if activity.has_refs and activity.refs_globally_unique and activity.ref_regex:
|
||||
ref_matches = re.finditer(
|
||||
r"(^|\W)(" + activity.ref_regex + r")($|\W)", self.comment, re.IGNORECASE
|
||||
)
|
||||
|
||||
@@ -2,8 +2,7 @@ import re
|
||||
|
||||
from icalendar import Event
|
||||
|
||||
from core.enums import Continent
|
||||
from core.enums import ActivityName
|
||||
from core.enums import ActivityName, Continent
|
||||
from data.alert import Alert
|
||||
from providers.alert.ical_alert_provider import ICALAlertProvider
|
||||
|
||||
|
||||
@@ -4,8 +4,7 @@ from datetime import datetime
|
||||
import pytz
|
||||
|
||||
from core.constants import HTTP_HEADERS
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from core.url_data_cache import URLDataCache
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
|
||||
@@ -7,8 +7,7 @@ import requests
|
||||
from requests.exceptions import ConnectionError, ConnectTimeout, ReadTimeout
|
||||
|
||||
from core.constants import HTTP_HEADERS
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
from datetime import datetime
|
||||
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -6,8 +6,7 @@ import pytz
|
||||
import requests
|
||||
|
||||
from core.constants import HTTP_HEADERS
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName
|
||||
from core.enums import ActivityName, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -4,8 +4,7 @@ import pytz
|
||||
import requests
|
||||
|
||||
from core.constants import HTTP_HEADERS
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -5,8 +5,7 @@ import requests
|
||||
from requests.exceptions import ConnectionError, ConnectTimeout, ReadTimeout
|
||||
|
||||
from core.constants import HTTP_HEADERS
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -4,8 +4,7 @@ from datetime import datetime
|
||||
import requests
|
||||
|
||||
from core.constants import HTTP_HEADERS
|
||||
from core.enums import LocationSourceForSpot, Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, LocationSourceForSpot, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -8,8 +8,7 @@ import pytz
|
||||
from rss_parser import Parser
|
||||
from rss_parser.models.rss import RSS
|
||||
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.sse_spot_provider import SSESpotProvider
|
||||
|
||||
@@ -2,8 +2,7 @@ from datetime import datetime
|
||||
|
||||
import pytz
|
||||
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName, ActivityRefType
|
||||
from core.enums import ActivityName, ActivityRefType, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
@@ -2,8 +2,7 @@ from datetime import datetime
|
||||
|
||||
import pytz
|
||||
|
||||
from core.enums import Mode
|
||||
from core.enums import ActivityName
|
||||
from core.enums import ActivityName, Mode
|
||||
from data.activity_ref import ActivityRef
|
||||
from data.spot import Spot
|
||||
from providers.spot.http_spot_provider import HTTPSpotProvider
|
||||
|
||||
Reference in New Issue
Block a user