mirror of
https://git.ianrenton.com/ian/spothole.git
synced 2025-12-16 00:53:39 +00:00
Compare commits
4 Commits
b00b4130c5
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac9e2ff054 | ||
|
|
6eaaca3a6f | ||
|
|
097c75eadd | ||
|
|
27db248398 |
@@ -85,7 +85,7 @@ spot-providers:
|
|||||||
class: "XOTA"
|
class: "XOTA"
|
||||||
name: "39C3 TOTA"
|
name: "39C3 TOTA"
|
||||||
enabled: false
|
enabled: false
|
||||||
url: "https://39c3.c3nav.de/"
|
url: "https://dev.39c3.totawatch.de/"
|
||||||
# Fixed SIG/latitude/longitude for all spots from a provider is currently only a feature for the "XOTA" provider,
|
# Fixed SIG/latitude/longitude for all spots from a provider is currently only a feature for the "XOTA" provider,
|
||||||
# the software found at https://github.com/nischu/xOTA/. This is because this is a generic backend for xOTA
|
# the software found at https://github.com/nischu/xOTA/. This is because this is a generic backend for xOTA
|
||||||
# programmes and so different URLs provide different programmes.
|
# programmes and so different URLs provide different programmes.
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ from pyhamtools.locator import latlong_to_locator
|
|||||||
from core.cache_utils import SEMI_STATIC_URL_DATA_CACHE
|
from core.cache_utils import SEMI_STATIC_URL_DATA_CACHE
|
||||||
from core.constants import SIGS, HTTP_HEADERS
|
from core.constants import SIGS, HTTP_HEADERS
|
||||||
from core.geo_utils import wab_wai_square_to_lat_lon
|
from core.geo_utils import wab_wai_square_to_lat_lon
|
||||||
from data.sig_ref import SIGRef
|
|
||||||
|
|
||||||
|
|
||||||
# Utility function to get the icon for a named SIG. If no match is found, the "circle-question" icon will be returned.
|
# Utility function to get the icon for a named SIG. If no match is found, the "circle-question" icon will be returned.
|
||||||
@@ -25,46 +24,51 @@ def get_ref_regex_for_sig(sig):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Look up details of a SIG reference (e.g. POTA park) such as name, lat/lon, and grid.
|
# Look up details of a SIG reference (e.g. POTA park) such as name, lat/lon, and grid. Takes in a sig_ref object which
|
||||||
|
# must at minimum have a "sig" and an "id". The rest of the object will be populated and returned.
|
||||||
# Note there is currently no support for KRMNPA location lookup, see issue #61.
|
# Note there is currently no support for KRMNPA location lookup, see issue #61.
|
||||||
def get_sig_ref_info(sig, sig_ref_id):
|
def populate_sig_ref_info(sig_ref):
|
||||||
sig_ref = SIGRef(id=sig_ref_id, sig=sig)
|
if sig_ref.sig is None or sig_ref.id is None:
|
||||||
|
logging.warn("Failed to look up sig_ref info, sig or id were not set.")
|
||||||
|
|
||||||
|
sig = sig_ref.sig
|
||||||
|
ref_id = sig_ref.id
|
||||||
try:
|
try:
|
||||||
if sig.upper() == "POTA":
|
if sig.upper() == "POTA":
|
||||||
data = SEMI_STATIC_URL_DATA_CACHE.get("https://api.pota.app/park/" + sig_ref_id, headers=HTTP_HEADERS).json()
|
data = SEMI_STATIC_URL_DATA_CACHE.get("https://api.pota.app/park/" + ref_id, headers=HTTP_HEADERS).json()
|
||||||
if data:
|
if data:
|
||||||
fullname = data["name"] if "name" in data else None
|
fullname = data["name"] if "name" in data else None
|
||||||
if fullname and "parktypeDesc" in data and data["parktypeDesc"] != "":
|
if fullname and "parktypeDesc" in data and data["parktypeDesc"] != "":
|
||||||
fullname = fullname + " " + data["parktypeDesc"]
|
fullname = fullname + " " + data["parktypeDesc"]
|
||||||
sig_ref.name = fullname
|
sig_ref.name = fullname
|
||||||
sig_ref.url = "https://pota.app/#/park/" + sig_ref_id
|
sig_ref.url = "https://pota.app/#/park/" + ref_id
|
||||||
sig_ref.grid = data["grid6"] if "grid6" in data else None
|
sig_ref.grid = data["grid6"] if "grid6" in data else None
|
||||||
sig_ref.latitude = data["latitude"] if "latitude" in data else None
|
sig_ref.latitude = data["latitude"] if "latitude" in data else None
|
||||||
sig_ref.longitude = data["longitude"] if "longitude" in data else None
|
sig_ref.longitude = data["longitude"] if "longitude" in data else None
|
||||||
elif sig.upper() == "SOTA":
|
elif sig.upper() == "SOTA":
|
||||||
data = SEMI_STATIC_URL_DATA_CACHE.get("https://api-db2.sota.org.uk/api/summits/" + sig_ref_id,
|
data = SEMI_STATIC_URL_DATA_CACHE.get("https://api-db2.sota.org.uk/api/summits/" + ref_id,
|
||||||
headers=HTTP_HEADERS).json()
|
headers=HTTP_HEADERS).json()
|
||||||
if data:
|
if data:
|
||||||
sig_ref.name = data["name"] if "name" in data else None
|
sig_ref.name = data["name"] if "name" in data else None
|
||||||
sig_ref.url = "https://www.sotadata.org.uk/en/summit/" + sig_ref_id
|
sig_ref.url = "https://www.sotadata.org.uk/en/summit/" + ref_id
|
||||||
sig_ref.grid = data["locator"] if "locator" in data else None
|
sig_ref.grid = data["locator"] if "locator" in data else None
|
||||||
sig_ref.latitude = data["latitude"] if "latitude" in data else None
|
sig_ref.latitude = data["latitude"] if "latitude" in data else None
|
||||||
sig_ref.longitude = data["longitude"] if "longitude" in data else None
|
sig_ref.longitude = data["longitude"] if "longitude" in data else None
|
||||||
elif sig.upper() == "WWBOTA":
|
elif sig.upper() == "WWBOTA":
|
||||||
data = SEMI_STATIC_URL_DATA_CACHE.get("https://api.wwbota.org/bunkers/" + sig_ref_id,
|
data = SEMI_STATIC_URL_DATA_CACHE.get("https://api.wwbota.org/bunkers/" + ref_id,
|
||||||
headers=HTTP_HEADERS).json()
|
headers=HTTP_HEADERS).json()
|
||||||
if data:
|
if data:
|
||||||
sig_ref.name = data["name"] if "name" in data else None
|
sig_ref.name = data["name"] if "name" in data else None
|
||||||
sig_ref.url = "https://bunkerwiki.org/?s=" + sig_ref_id if sig_ref_id.startswith("B/G") else None
|
sig_ref.url = "https://bunkerwiki.org/?s=" + ref_id if ref_id.startswith("B/G") else None
|
||||||
sig_ref.grid = data["locator"] if "locator" in data else None
|
sig_ref.grid = data["locator"] if "locator" in data else None
|
||||||
sig_ref.latitude = data["lat"] if "lat" in data else None
|
sig_ref.latitude = data["lat"] if "lat" in data else None
|
||||||
sig_ref.longitude = data["long"] if "long" in data else None
|
sig_ref.longitude = data["long"] if "long" in data else None
|
||||||
elif sig.upper() == "GMA" or sig.upper() == "ARLHS" or sig.upper() == "ILLW" or sig.upper() == "WCA" or sig.upper() == "MOTA" or sig.upper() == "IOTA":
|
elif sig.upper() == "GMA" or sig.upper() == "ARLHS" or sig.upper() == "ILLW" or sig.upper() == "WCA" or sig.upper() == "MOTA" or sig.upper() == "IOTA":
|
||||||
data = SEMI_STATIC_URL_DATA_CACHE.get("https://www.cqgma.org/api/ref/?" + sig_ref_id,
|
data = SEMI_STATIC_URL_DATA_CACHE.get("https://www.cqgma.org/api/ref/?" + ref_id,
|
||||||
headers=HTTP_HEADERS).json()
|
headers=HTTP_HEADERS).json()
|
||||||
if data:
|
if data:
|
||||||
sig_ref.name = data["name"] if "name" in data else None
|
sig_ref.name = data["name"] if "name" in data else None
|
||||||
sig_ref.url = "https://www.cqgma.org/zinfo.php?ref=" + sig_ref_id
|
sig_ref.url = "https://www.cqgma.org/zinfo.php?ref=" + ref_id
|
||||||
sig_ref.grid = data["locator"] if "locator" in data else None
|
sig_ref.grid = data["locator"] if "locator" in data else None
|
||||||
sig_ref.latitude = data["latitude"] if "latitude" in data else None
|
sig_ref.latitude = data["latitude"] if "latitude" in data else None
|
||||||
sig_ref.longitude = data["longitude"] if "longitude" in data else None
|
sig_ref.longitude = data["longitude"] if "longitude" in data else None
|
||||||
@@ -73,9 +77,9 @@ def get_sig_ref_info(sig, sig_ref_id):
|
|||||||
headers=HTTP_HEADERS)
|
headers=HTTP_HEADERS)
|
||||||
wwff_dr = csv.DictReader(wwff_csv_data.content.decode().splitlines())
|
wwff_dr = csv.DictReader(wwff_csv_data.content.decode().splitlines())
|
||||||
for row in wwff_dr:
|
for row in wwff_dr:
|
||||||
if row["reference"] == sig_ref_id:
|
if row["reference"] == ref_id:
|
||||||
sig_ref.name = row["name"] if "name" in row else None
|
sig_ref.name = row["name"] if "name" in row else None
|
||||||
sig_ref.url = "https://wwff.co/directory/?showRef=" + sig_ref_id
|
sig_ref.url = "https://wwff.co/directory/?showRef=" + ref_id
|
||||||
sig_ref.grid = row["iaruLocator"] if "iaruLocator" in row else None
|
sig_ref.grid = row["iaruLocator"] if "iaruLocator" in row else None
|
||||||
sig_ref.latitude = float(row["latitude"]) if "latitude" in row else None
|
sig_ref.latitude = float(row["latitude"]) if "latitude" in row else None
|
||||||
sig_ref.longitude = float(row["longitude"]) if "longitude" in row else None
|
sig_ref.longitude = float(row["longitude"]) if "longitude" in row else None
|
||||||
@@ -85,7 +89,7 @@ def get_sig_ref_info(sig, sig_ref_id):
|
|||||||
headers=HTTP_HEADERS)
|
headers=HTTP_HEADERS)
|
||||||
siota_dr = csv.DictReader(siota_csv_data.content.decode().splitlines())
|
siota_dr = csv.DictReader(siota_csv_data.content.decode().splitlines())
|
||||||
for row in siota_dr:
|
for row in siota_dr:
|
||||||
if row["SILO_CODE"] == sig_ref_id:
|
if row["SILO_CODE"] == ref_id:
|
||||||
sig_ref.name = row["NAME"] if "NAME" in row else None
|
sig_ref.name = row["NAME"] if "NAME" in row else None
|
||||||
sig_ref.grid = row["LOCATOR"] if "LOCATOR" in row else None
|
sig_ref.grid = row["LOCATOR"] if "LOCATOR" in row else None
|
||||||
sig_ref.latitude = float(row["LAT"]) if "LAT" in row else None
|
sig_ref.latitude = float(row["LAT"]) if "LAT" in row else None
|
||||||
@@ -96,13 +100,13 @@ def get_sig_ref_info(sig, sig_ref_id):
|
|||||||
headers=HTTP_HEADERS).json()
|
headers=HTTP_HEADERS).json()
|
||||||
if data:
|
if data:
|
||||||
for feature in data["features"]:
|
for feature in data["features"]:
|
||||||
if feature["properties"]["wotaId"] == sig_ref_id:
|
if feature["properties"]["wotaId"] == ref_id:
|
||||||
sig_ref.name = feature["properties"]["title"]
|
sig_ref.name = feature["properties"]["title"]
|
||||||
# Fudge WOTA URLs. Outlying fell (LDO) URLs don't match their ID numbers but require 214 to be
|
# Fudge WOTA URLs. Outlying fell (LDO) URLs don't match their ID numbers but require 214 to be
|
||||||
# added to them
|
# added to them
|
||||||
sig_ref.url = "https://www.wota.org.uk/MM_" + sig_ref_id
|
sig_ref.url = "https://www.wota.org.uk/MM_" + ref_id
|
||||||
if sig_ref_id.upper().startswith("LDO-"):
|
if ref_id.upper().startswith("LDO-"):
|
||||||
number = int(sig_ref_id.upper().replace("LDO-", ""))
|
number = int(ref_id.upper().replace("LDO-", ""))
|
||||||
sig_ref.url = "https://www.wota.org.uk/MM_LDO-" + str(number + 214)
|
sig_ref.url = "https://www.wota.org.uk/MM_LDO-" + str(number + 214)
|
||||||
sig_ref.grid = feature["properties"]["qthLocator"]
|
sig_ref.grid = feature["properties"]["qthLocator"]
|
||||||
sig_ref.latitude = feature["geometry"]["coordinates"][1]
|
sig_ref.latitude = feature["geometry"]["coordinates"][1]
|
||||||
@@ -112,9 +116,9 @@ def get_sig_ref_info(sig, sig_ref_id):
|
|||||||
data = SEMI_STATIC_URL_DATA_CACHE.get("https://ontheair.nz/assets/assets.json", headers=HTTP_HEADERS).json()
|
data = SEMI_STATIC_URL_DATA_CACHE.get("https://ontheair.nz/assets/assets.json", headers=HTTP_HEADERS).json()
|
||||||
if data:
|
if data:
|
||||||
for asset in data:
|
for asset in data:
|
||||||
if asset["code"] == sig_ref_id:
|
if asset["code"] == ref_id:
|
||||||
sig_ref.name = asset["name"]
|
sig_ref.name = asset["name"]
|
||||||
sig_ref.url = "https://ontheair.nz/assets/ZLI_OT-030" + sig_ref_id.replace("/", "_")
|
sig_ref.url = "https://ontheair.nz/assets/ZLI_OT-030" + ref_id.replace("/", "_")
|
||||||
sig_ref.grid = latlong_to_locator(asset["y"], asset["x"], 6)
|
sig_ref.grid = latlong_to_locator(asset["y"], asset["x"], 6)
|
||||||
sig_ref.latitude = asset["y"]
|
sig_ref.latitude = asset["y"]
|
||||||
sig_ref.longitude = asset["x"]
|
sig_ref.longitude = asset["x"]
|
||||||
@@ -124,14 +128,14 @@ def get_sig_ref_info(sig, sig_ref_id):
|
|||||||
sig_ref.name = sig_ref.id
|
sig_ref.name = sig_ref.id
|
||||||
sig_ref.url = "https://www.beachesontheair.com/beaches/" + sig_ref.name.lower().replace(" ", "-")
|
sig_ref.url = "https://www.beachesontheair.com/beaches/" + sig_ref.name.lower().replace(" ", "-")
|
||||||
elif sig.upper() == "WAB" or sig.upper() == "WAI":
|
elif sig.upper() == "WAB" or sig.upper() == "WAI":
|
||||||
ll = wab_wai_square_to_lat_lon(sig_ref_id)
|
ll = wab_wai_square_to_lat_lon(ref_id)
|
||||||
if ll:
|
if ll:
|
||||||
sig_ref.name = sig_ref_id
|
sig_ref.name = ref_id
|
||||||
sig_ref.grid = latlong_to_locator(ll[0], ll[1], 6)
|
sig_ref.grid = latlong_to_locator(ll[0], ll[1], 6)
|
||||||
sig_ref.latitude = ll[0]
|
sig_ref.latitude = ll[0]
|
||||||
sig_ref.longitude = ll[1]
|
sig_ref.longitude = ll[1]
|
||||||
except:
|
except:
|
||||||
logging.warn("Failed to look up sig_ref info for " + sig + " ref " + sig_ref_id + ".")
|
logging.warn("Failed to look up sig_ref info for " + sig + " ref " + ref_id + ".")
|
||||||
return sig_ref
|
return sig_ref
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
|
|||||||
import pytz
|
import pytz
|
||||||
|
|
||||||
from core.lookup_helper import lookup_helper
|
from core.lookup_helper import lookup_helper
|
||||||
from core.sig_utils import get_icon_for_sig, get_sig_ref_info
|
from core.sig_utils import get_icon_for_sig, populate_sig_ref_info
|
||||||
|
|
||||||
|
|
||||||
# Data class that defines an alert.
|
# Data class that defines an alert.
|
||||||
@@ -102,10 +102,7 @@ class Alert:
|
|||||||
# from WAB and WAI, which count as a SIG even though there's no real lookup, just maths
|
# from WAB and WAI, which count as a SIG even though there's no real lookup, just maths
|
||||||
if self.sig_refs and len(self.sig_refs) > 0:
|
if self.sig_refs and len(self.sig_refs) > 0:
|
||||||
for sig_ref in self.sig_refs:
|
for sig_ref in self.sig_refs:
|
||||||
lookup_data = get_sig_ref_info(sig_ref.sig, sig_ref.id)
|
populate_sig_ref_info(sig_ref)
|
||||||
if lookup_data:
|
|
||||||
# Update the sig_ref data from the lookup
|
|
||||||
sig_ref.__dict__.update(lookup_data.__dict__)
|
|
||||||
|
|
||||||
# If the spot itself doesn't have a SIG yet, but we have at least one SIG reference, take that reference's SIG
|
# 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.
|
# and apply it to the whole spot.
|
||||||
|
|||||||
27
data/spot.py
27
data/spot.py
@@ -11,7 +11,7 @@ from pyhamtools.locator import locator_to_latlong, latlong_to_locator
|
|||||||
|
|
||||||
from core.config import MAX_SPOT_AGE
|
from core.config import MAX_SPOT_AGE
|
||||||
from core.lookup_helper import lookup_helper
|
from core.lookup_helper import lookup_helper
|
||||||
from core.sig_utils import get_icon_for_sig, get_sig_ref_info, ANY_SIG_REGEX, get_ref_regex_for_sig
|
from core.sig_utils import get_icon_for_sig, populate_sig_ref_info, ANY_SIG_REGEX, get_ref_regex_for_sig
|
||||||
from data.sig_ref import SIGRef
|
from data.sig_ref import SIGRef
|
||||||
|
|
||||||
|
|
||||||
@@ -279,20 +279,17 @@ class Spot:
|
|||||||
# from WAB and WAI, which count as a SIG even though there's no real lookup, just maths
|
# from WAB and WAI, which count as a SIG even though there's no real lookup, just maths
|
||||||
if self.sig_refs and len(self.sig_refs) > 0:
|
if self.sig_refs and len(self.sig_refs) > 0:
|
||||||
for sig_ref in self.sig_refs:
|
for sig_ref in self.sig_refs:
|
||||||
lookup_data = get_sig_ref_info(sig_ref.sig, sig_ref.id)
|
sig_ref = populate_sig_ref_info(sig_ref)
|
||||||
if lookup_data:
|
# If the spot itself doesn't have location yet, but the SIG ref does, extract it
|
||||||
# Update the sig_ref data from the lookup
|
if sig_ref.grid and not self.dx_grid:
|
||||||
sig_ref.__dict__.update(lookup_data.__dict__)
|
self.dx_grid = sig_ref.grid
|
||||||
# If the spot itself doesn't have location yet, but the SIG ref does, extract it
|
if sig_ref.latitude and not self.dx_latitude:
|
||||||
if lookup_data.grid and not self.dx_grid:
|
self.dx_latitude = sig_ref.latitude
|
||||||
self.dx_grid = lookup_data.grid
|
self.dx_longitude = sig_ref.longitude
|
||||||
if lookup_data.latitude and not self.dx_latitude:
|
if self.sig == "WAB" or self.sig == "WAI":
|
||||||
self.dx_latitude = lookup_data.latitude
|
self.dx_location_source = "WAB/WAI GRID"
|
||||||
self.dx_longitude = lookup_data.longitude
|
else:
|
||||||
if self.sig == "WAB" or self.sig == "WAI":
|
self.dx_location_source = "SIG REF LOOKUP"
|
||||||
self.dx_location_source = "WAB/WAI GRID"
|
|
||||||
else:
|
|
||||||
self.dx_location_source = "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
|
# 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.
|
# and apply it to the whole spot.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from core.config import MAX_SPOT_AGE, ALLOW_SPOTTING, WEB_UI_OPTIONS
|
|||||||
from core.constants import BANDS, ALL_MODES, MODE_TYPES, SIGS, CONTINENTS, SOFTWARE_VERSION, UNKNOWN_BAND
|
from core.constants import BANDS, ALL_MODES, MODE_TYPES, SIGS, CONTINENTS, SOFTWARE_VERSION, UNKNOWN_BAND
|
||||||
from core.lookup_helper import lookup_helper
|
from core.lookup_helper import lookup_helper
|
||||||
from core.prometheus_metrics_handler import page_requests_counter, get_metrics, api_requests_counter
|
from core.prometheus_metrics_handler import page_requests_counter, get_metrics, api_requests_counter
|
||||||
from core.sig_utils import get_ref_regex_for_sig, get_sig_ref_info
|
from core.sig_utils import get_ref_regex_for_sig, populate_sig_ref_info
|
||||||
from data.sig_ref import SIGRef
|
from data.sig_ref import SIGRef
|
||||||
from data.spot import Spot
|
from data.spot import Spot
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ class WebServer:
|
|||||||
response.status = 422
|
response.status = 422
|
||||||
return json.dumps("Error - '" + id + "' does not look like a valid reference ID for " + sig + ".", default=serialize_everything)
|
return json.dumps("Error - '" + id + "' does not look like a valid reference ID for " + sig + ".", default=serialize_everything)
|
||||||
|
|
||||||
data = get_sig_ref_info(sig, id)
|
data = populate_sig_ref_info(SIGRef(id=id, sig=sig))
|
||||||
return self.serve_api(data)
|
return self.serve_api(data)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class GMA(HTTPSpotProvider):
|
|||||||
# and GMA summits come through with reftype=Summit, so we must check for the presence of a "sota" entry
|
# and GMA summits come through with reftype=Summit, so we must check for the presence of a "sota" entry
|
||||||
# to determine if it's a SOTA summit.
|
# to determine if it's a SOTA summit.
|
||||||
if "reftype" in ref_info and ref_info["reftype"] not in ["POTA", "WWFF"] and (
|
if "reftype" in ref_info and ref_info["reftype"] not in ["POTA", "WWFF"] and (
|
||||||
ref_info["reftype"] != "Summit" or ref_info["sota"] == ""):
|
ref_info["reftype"] != "Summit" or "sota" not in ref_info or ref_info["sota"] == ""):
|
||||||
match ref_info["reftype"]:
|
match ref_info["reftype"]:
|
||||||
case "Summit":
|
case "Summit":
|
||||||
spot.sig_refs[0].sig = "GMA"
|
spot.sig_refs[0].sig = "GMA"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from spotproviders.http_spot_provider import HTTPSpotProvider
|
|||||||
# The provider typically doesn't give us a lat/lon or SIG explicitly, so our own config provides this information. This
|
# The provider typically doesn't give us a lat/lon or SIG explicitly, so our own config provides this information. This
|
||||||
# functionality is implemented for TOTA events.
|
# functionality is implemented for TOTA events.
|
||||||
class XOTA(HTTPSpotProvider):
|
class XOTA(HTTPSpotProvider):
|
||||||
POLL_INTERVAL_SEC = 300
|
POLL_INTERVAL_SEC = 120
|
||||||
FIXED_LATITUDE = None
|
FIXED_LATITUDE = None
|
||||||
FIXED_LONGITUDE = None
|
FIXED_LONGITUDE = None
|
||||||
SIG = None
|
SIG = None
|
||||||
|
|||||||
@@ -479,7 +479,8 @@ paths:
|
|||||||
in: query
|
in: query
|
||||||
description: Special Interest Group (SIG), e.g. outdoor activity programme such as POTA
|
description: Special Interest Group (SIG), e.g. outdoor activity programme such as POTA
|
||||||
required: true
|
required: true
|
||||||
$ref: "#/components/schemas/SIGName"
|
schema:
|
||||||
|
$ref: "#/components/schemas/SIGName"
|
||||||
- name: id
|
- name: id
|
||||||
in: query
|
in: query
|
||||||
description: ID of a reference in that SIG
|
description: ID of a reference in that SIG
|
||||||
|
|||||||
Reference in New Issue
Block a user