summaryrefslogtreecommitdiff
path: root/web-server/opendc/util/parameter_checker.py
diff options
context:
space:
mode:
authorGeorgios Andreadis <info@gandreadis.com>2020-06-29 16:05:23 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-08-24 16:18:36 +0200
commit4f9a40abdc7836345113c047f27fcc96800cb3f5 (patch)
treee443d14e34a884b1a4d9c549f81d51202eddd5f7 /web-server/opendc/util/parameter_checker.py
parentcd5f7bf3a72913e1602cb4c575e61ac7d5519be0 (diff)
Prepare web-server repository for monorepo
This change prepares the web-server Git repository for the monorepo residing at https://github.com/atlarge-research.com/opendc. To accomodate for this, we move all files into a web-server subdirectory.
Diffstat (limited to 'web-server/opendc/util/parameter_checker.py')
-rw-r--r--web-server/opendc/util/parameter_checker.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/web-server/opendc/util/parameter_checker.py b/web-server/opendc/util/parameter_checker.py
new file mode 100644
index 00000000..f55e780e
--- /dev/null
+++ b/web-server/opendc/util/parameter_checker.py
@@ -0,0 +1,78 @@
+from opendc.util import database, exceptions
+
+
+def _missing_parameter(params_required, params_actual, parent=''):
+ """Recursively search for the first missing parameter."""
+
+ for param_name in params_required:
+
+ if param_name not in params_actual:
+ return '{}.{}'.format(parent, param_name)
+
+ param_required = params_required.get(param_name)
+ param_actual = params_actual.get(param_name)
+
+ if isinstance(param_required, dict):
+
+ param_missing = _missing_parameter(param_required, param_actual, param_name)
+
+ if param_missing is not None:
+ return '{}.{}'.format(parent, param_missing)
+
+ return None
+
+
+def _incorrect_parameter(params_required, params_actual, parent=''):
+ """Recursively make sure each parameter is of the correct type."""
+
+ for param_name in params_required:
+
+ param_required = params_required.get(param_name)
+ param_actual = params_actual.get(param_name)
+
+ if isinstance(param_required, dict):
+
+ param_incorrect = _incorrect_parameter(param_required, param_actual, param_name)
+
+ if param_incorrect is not None:
+ return '{}.{}'.format(parent, param_incorrect)
+
+ else:
+
+ if param_required == 'datetime':
+ try:
+ database.string_to_datetime(param_actual)
+ except:
+ return '{}.{}'.format(parent, param_name)
+
+ if param_required == 'int' and not isinstance(param_actual, int):
+ return '{}.{}'.format(parent, param_name)
+
+ if param_required == 'string' and not isinstance(param_actual, str) and not isinstance(param_actual, int):
+ return '{}.{}'.format(parent, param_name)
+
+ if param_required.startswith('list') and not isinstance(param_actual, list):
+ return '{}.{}'.format(parent, param_name)
+
+
+def _format_parameter(parameter):
+ """Format the output of a parameter check."""
+
+ parts = parameter.split('.')
+ inner = ['["{}"]'.format(x) for x in parts[2:]]
+ return parts[1] + ''.join(inner)
+
+
+def check(request, **kwargs):
+ """Return True if all required parameters are there."""
+
+ for location, params_required in kwargs.items():
+ params_actual = getattr(request, 'params_{}'.format(location))
+
+ missing_parameter = _missing_parameter(params_required, params_actual)
+ if missing_parameter is not None:
+ raise exceptions.MissingParameterError(_format_parameter(missing_parameter), location)
+
+ incorrect_parameter = _incorrect_parameter(params_required, params_actual)
+ if incorrect_parameter is not None:
+ raise exceptions.IncorrectParameterError(_format_parameter(incorrect_parameter), location)