2021-03-24 22:46:51 +01:00
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
from owrx.form.error import ValidationError
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Validator(ABC):
|
|
|
|
|
@abstractmethod
|
2021-09-30 23:26:26 +02:00
|
|
|
def validate(self, key, value) -> None:
|
2021-03-24 22:46:51 +01:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RequiredValidator(Validator):
|
2021-09-30 23:26:26 +02:00
|
|
|
def validate(self, key, value) -> None:
|
2021-03-24 22:46:51 +01:00
|
|
|
if value is None or value == "":
|
|
|
|
|
raise ValidationError(key, "Field is required")
|
2021-05-11 17:21:52 +02:00
|
|
|
|
2021-09-30 23:09:22 +02:00
|
|
|
|
2024-01-17 21:23:35 +01:00
|
|
|
class Range(object):
|
2024-01-17 22:39:05 +01:00
|
|
|
def __init__(self, start: int, end: int = None):
|
2024-01-17 21:23:35 +01:00
|
|
|
self.start = start
|
2024-01-17 22:39:05 +01:00
|
|
|
self.end = end if end is not None else start
|
2024-01-17 21:23:35 +01:00
|
|
|
|
|
|
|
|
def isInRange(self, value):
|
|
|
|
|
return self.start <= value <= self.end
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
2024-01-17 22:39:05 +01:00
|
|
|
if self.start == self.end:
|
|
|
|
|
return str(self.start)
|
2024-01-17 21:23:35 +01:00
|
|
|
return "{start}...{end}".format(**vars(self))
|
|
|
|
|
|
|
|
|
|
|
2021-05-11 17:21:52 +02:00
|
|
|
class RangeValidator(Validator):
|
|
|
|
|
def __init__(self, minValue, maxValue):
|
2024-01-17 21:23:35 +01:00
|
|
|
self.range = Range(minValue, maxValue)
|
2021-05-11 17:21:52 +02:00
|
|
|
|
2021-09-30 23:26:26 +02:00
|
|
|
def validate(self, key, value) -> None:
|
2021-05-11 17:21:52 +02:00
|
|
|
if value is None or value == "":
|
2021-09-30 23:09:22 +02:00
|
|
|
return # Ignore empty values
|
2024-01-17 21:23:35 +01:00
|
|
|
if not self.range.isInRange(float(value)):
|
2021-09-30 23:09:22 +02:00
|
|
|
raise ValidationError(
|
2024-01-17 21:23:35 +01:00
|
|
|
key, "Value must be between {min} and {max}".format(min=self.range.start, max=self.range.end)
|
2021-09-30 23:09:22 +02:00
|
|
|
)
|
2024-01-17 21:23:35 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class RangeListValidator(Validator):
|
|
|
|
|
def __init__(self, rangeList: list[Range]):
|
|
|
|
|
self.rangeList = rangeList
|
|
|
|
|
|
|
|
|
|
def validate(self, key, value) -> None:
|
|
|
|
|
if not any(range for range in self.rangeList if range.isInRange(value)):
|
|
|
|
|
raise ValidationError(
|
2024-01-17 22:39:05 +01:00
|
|
|
key, "Value is outside of the allowed range(s) {}".format(self._rangeStr())
|
2024-01-17 21:23:35 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def _rangeStr(self):
|
|
|
|
|
return "[{}]".format(", ".join(str(r) for r in self.rangeList))
|