from time import sleep from core.enums import ActivityName, ActivityRefType from data.activity_ref import ActivityRef from providers.activityrefdata.file_download_activity_ref_data_provider import ( FileDownloadActivityRefDataProvider, ) class WOTA(FileDownloadActivityRefDataProvider): """Activity ref data provider for Wainwrights on the Air""" POLL_INTERVAL_DAYS = 365 ACTIVITY = ActivityName.WOTA DATA_URL = "https://www.wota.org.uk/mapping/data/summits.json" def __init__(self, provider_config): super().__init__(self.ACTIVITY, provider_config, self.DATA_URL, self.POLL_INTERVAL_DAYS) def _http_response_to_data(self, http_response): new_data = [] for feature in http_response.json().get("features", []): ref_id = feature["properties"]["wotaId"] # Fudge WOTA URLs. Outlying fell (LDO) URLs don't match their ID numbers but require 214 to be # added to them url = f"https://www.wota.org.uk/MM_{ref_id}" if ref_id.upper().startswith("LDO-"): number = int(ref_id.upper().replace("LDO-", "")) url = f"https://www.wota.org.uk/MM_LDO-{number + 214!s}" new_data.append( ActivityRef( sig=self.ACTIVITY, id=ref_id, name=feature["properties"]["title"], url=url, ref_type=ActivityRefType.SUMMIT, grid=feature["properties"]["qthLocator"], latitude=feature["geometry"]["coordinates"][1], longitude=feature["geometry"]["coordinates"][0], altitude=feature["properties"]["height"], ) ) # Bail out if a stop has been requested, i.e. the program is shutting down - no need to parse the rest of # the data in this case if self._stop_event.is_set(): break # Very short pause. This will extend the time to handle activity refs by a few seconds but will ensure some time # is available for other threads e.g. the web server. sleep(0.001) return new_data