Skip to content

Commit 75f6c4c

Browse files
authored
Merge pull request #3504 from WikiWatershed/eh/validation-test-gwlfe
2 parents 917b5c0 + 7f7a58a commit 75f6c4c

File tree

2 files changed

+117
-8
lines changed

2 files changed

+117
-8
lines changed

src/mmw/apps/geoprocessing_api/validation.py

+102
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from numbers import Number
33
from uuid import UUID
44

5+
from django.conf import settings
6+
57
from rest_framework.exceptions import ValidationError
68

79

@@ -69,3 +71,103 @@ def validate_uuid(uuid):
6971
return False
7072

7173
return uuid == str(u)
74+
75+
76+
def validate_gwlfe_prepare(data):
77+
area_of_interest = data.get('area_of_interest')
78+
wkaoi = data.get('wkaoi')
79+
huc = data.get('huc')
80+
layer_overrides = data.get('layer_overrides', {})
81+
82+
if not check_gwlfe_only_one([area_of_interest, wkaoi, huc]):
83+
error = ('Invalid parameter: One and only one type of area object'
84+
' (area_of_interest, wkaoi, or huc) is allowed')
85+
raise ValidationError(error)
86+
87+
not_valid_layers = check_layer_overrides_keys(layer_overrides)
88+
89+
if not_valid_layers:
90+
error = create_layer_overrides_keys_not_valid_msg(not_valid_layers)
91+
raise ValidationError(error)
92+
93+
if ('__LAND__' in layer_overrides.keys() and
94+
not check_land_layer_overrides(layer_overrides)):
95+
error = create_layer_overrides_land_not_valid_msg(LAND_LAYER_OVERRIDES)
96+
raise ValidationError(error)
97+
98+
if ('__STREAMS__' in layer_overrides.keys() is not None and
99+
not check_streams_layer_overrides(layer_overrides)):
100+
error = (f'Invalid __STREAMS__ param: '
101+
f'Must be one of {STREAM_LAYER_OVERRIDES}')
102+
raise ValidationError(error)
103+
104+
105+
def validate_gwlfe_run(input, job_uuid):
106+
if not check_gwlfe_only_one([input, job_uuid]):
107+
error = ('Invalid parameter: Only one type of prepared input'
108+
'(input JSON or job_uuid) is allowed')
109+
raise ValidationError(error)
110+
111+
if not check_gwlfe_run_input(input):
112+
error = ("Invalid input: Please use the full result "
113+
"of gwlf-e/prepare endpoint's result object")
114+
raise ValidationError(error)
115+
116+
117+
def check_gwlfe_only_one(params):
118+
if sum(map(check_is_none, params)) == 1:
119+
return True
120+
else:
121+
return False
122+
123+
124+
def check_is_none(v):
125+
if v is None:
126+
return 0
127+
else:
128+
return 1
129+
130+
131+
def check_layer_overrides_keys(layers):
132+
not_valid_layers = []
133+
for layer in layers.keys():
134+
if (layer not in settings.GEOP['layers'].keys()):
135+
not_valid_layers.append(layer)
136+
return not_valid_layers
137+
138+
139+
def check_land_layer_overrides(layers):
140+
return layers['__LAND__'] in LAND_LAYER_OVERRIDES
141+
142+
143+
def check_streams_layer_overrides(layers):
144+
return layers['__STREAMS__'] in STREAM_LAYER_OVERRIDES
145+
146+
147+
def check_gwlfe_run_input(input):
148+
result = all(el in input for el in settings.GWLFE_DEFAULTS.keys())
149+
return result
150+
151+
152+
def create_layer_overrides_keys_not_valid_msg(layers):
153+
error = 'These layers are not standard layers for layer overrides: '
154+
for layler in layers:
155+
error += layler + ' '
156+
error += '. Must be one of: __LAND__, __STREAMS__'
157+
return error
158+
159+
160+
def create_layer_overrides_land_not_valid_msg(values):
161+
return (f'Invalid __LAND__ param: Must be one of {values}')
162+
163+
164+
LAND_LAYER_OVERRIDES = [
165+
'nlcd-2019-30m-epsg5070-512-byte',
166+
'nlcd-2016-30m-epsg5070-512-byte',
167+
'nlcd-2011-30m-epsg5070-512-byte',
168+
'nlcd-2006-30m-epsg5070-512-byte',
169+
'nlcd-2001-30m-epsg5070-512-byte',
170+
'nlcd-2011-30m-epsg5070-512-int8',
171+
]
172+
173+
STREAM_LAYER_OVERRIDES = ['drb', 'nhdhr', 'nhd']

src/mmw/apps/geoprocessing_api/views.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@
4343
from apps.geoprocessing_api.throttling import (BurstRateThrottle,
4444
SustainedRateThrottle)
4545

46-
from apps.geoprocessing_api.validation import validate_rwd, validate_uuid
46+
from apps.geoprocessing_api.validation import (validate_rwd,
47+
validate_uuid,
48+
validate_gwlfe_prepare,
49+
validate_gwlfe_run)
4750

4851

4952
@swagger_auto_schema(method='post',
@@ -1397,9 +1400,7 @@ def start_modeling_gwlfe_prepare(request, format=None):
13971400
the `input`. Alternatively, the `job_uuid` can be used as well.
13981401
"""
13991402
user = request.user if request.user.is_authenticated else None
1400-
area_of_interest, wkaoi = _parse_modeling_input(request)
1401-
1402-
layer_overrides = request.data.get('layer_overrides', {})
1403+
area_of_interest, wkaoi, layer_overrides = _parse_modeling_input(request)
14031404

14041405
return start_celery_job([
14051406
multi_mapshed(area_of_interest, wkaoi, layer_overrides),
@@ -1661,7 +1662,11 @@ def _parse_analyze_input(request):
16611662

16621663

16631664
def _parse_modeling_input(request):
1664-
return _parse_aoi(request.data)
1665+
validate_gwlfe_prepare(request.data)
1666+
layer_overrides = request.data.get('layer_overrides', {})
1667+
area_of_interest, wkaoi = _parse_aoi(request.data)
1668+
1669+
return area_of_interest, wkaoi, layer_overrides
16651670

16661671

16671672
def _parse_aoi(data):
@@ -1703,11 +1708,12 @@ def _parse_gwlfe_input(request, raw_input=True):
17031708
model_input = request.data.get('input')
17041709

17051710
if model_input:
1706-
# TODO #3484 Validate model_input
1711+
validate_gwlfe_run(model_input, job_uuid)
17071712
return model_input, job_uuid, mods, hash
17081713

17091714
if not job_uuid:
1710-
raise ValidationError('`job_uuid` must be specified')
1715+
raise ValidationError('Either `input` or `job_uuid` '
1716+
'must be specified.')
17111717

17121718
if not validate_uuid(job_uuid):
17131719
raise ValidationError(f'Invalid `job_uuid`: {job_uuid}')
@@ -1723,5 +1729,6 @@ def _parse_gwlfe_input(request, raw_input=True):
17231729

17241730
model_input = json.loads(input_job.result)
17251731

1726-
# TODO #3484 Validate model_input
1732+
validate_gwlfe_run(model_input, job_uuid)
1733+
17271734
return model_input, job_uuid, mods, hash

0 commit comments

Comments
 (0)