-
Notifications
You must be signed in to change notification settings - Fork 15
/
locations.py
executable file
·133 lines (109 loc) · 4.43 KB
/
locations.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
"""Locations in HDX"""
from typing import Dict, List, Optional, Tuple
from hdx.api.configuration import Configuration
from hdx.utilities.typehint import ListTuple
class Locations:
"""Methods to help with countries and continents"""
_validlocations = None
@classmethod
def validlocations(cls, configuration=None) -> List[Dict]:
"""
Read valid locations from HDX
Args:
configuration (Optional[Configuration]): HDX configuration. Defaults to global configuration.
Returns:
List[Dict]: A list of valid locations
"""
if cls._validlocations is None:
if configuration is None:
configuration = Configuration.read()
cls._validlocations = configuration.call_remoteckan(
"group_list", {"all_fields": True}
)
return cls._validlocations
@classmethod
def set_validlocations(cls, locations: ListTuple[Dict]) -> None:
"""
Set valid locations using list of dictionaries of form {'name': 'zmb', 'title', 'Zambia'}
Args:
locations (ListTuple[Dict]): List of dictionaries of form {'name': 'zmb', 'title', 'Zambia'}
Returns:
None
"""
cls._validlocations = locations
@classmethod
def get_location_from_HDX_code(
cls,
code: str,
locations: Optional[ListTuple[Dict]] = None,
configuration: Optional[Configuration] = None,
) -> Optional[str]:
"""Get location from HDX location code
Args:
code (str): code for which to get location name
locations (Optional[ListTuple[Dict]]): Valid locations list. Defaults to list downloaded from HDX.
configuration (Optional[Configuration]): HDX configuration. Defaults to global configuration.
Returns:
Optional[str]: location name or None
"""
if locations is None:
locations = cls.validlocations(configuration)
code = code.upper()
for locdict in locations:
if code == locdict["name"].upper():
return locdict["title"]
return None
@classmethod
def get_HDX_code_from_location(
cls,
location: str,
locations: Optional[ListTuple[Dict]] = None,
configuration: Optional[Configuration] = None,
) -> Optional[str]:
"""Get HDX code for location
Args:
location (str): Location for which to get HDX code
locations (Optional[ListTuple[Dict]]): Valid locations list. Defaults to list downloaded from HDX.
configuration (Optional[Configuration]): HDX configuration. Defaults to global configuration.
Returns:
Optional[str]: HDX code or None
"""
if locations is None:
locations = cls.validlocations(configuration)
locationupper = location.upper()
for locdict in locations:
locationcode = locdict["name"].upper()
if locationupper == locationcode:
return locationcode
for locdict in locations:
if locationupper == locdict["title"].upper():
return locdict["name"].upper()
return None
@classmethod
def get_HDX_code_from_location_partial(
cls,
location: str,
locations: Optional[ListTuple[Dict]] = None,
configuration: Optional[Configuration] = None,
) -> Tuple[Optional[str], bool]:
"""Get HDX code for location
Args:
location (str): Location for which to get HDX code
locations (Optional[ListTuple[Dict]]): Valid locations list. Defaults to list downloaded from HDX.
configuration (Optional[Configuration]): HDX configuration. Defaults to global configuration.
Returns:
Tuple[Optional[str], bool]: HDX code and if the match is exact or (None, False) for no match
"""
hdx_code = cls.get_HDX_code_from_location(
location, locations, configuration
)
if hdx_code is not None:
return hdx_code, True
if locations is None:
locations = cls.validlocations(configuration)
locationupper = location.upper()
for locdict in locations:
locationname = locdict["title"].upper()
if locationupper in locationname or locationname in locationupper:
return locdict["name"].upper(), False
return None, False