params.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from marshmallow import validate
  2. def _get_base_field_kwargs():
  3. return {
  4. 'validate': []
  5. }
  6. class MetaParam(object):
  7. def __init__(self):
  8. self.field_kwargs = _get_base_field_kwargs()
  9. def apply(self, field_kwargs=None):
  10. if not field_kwargs:
  11. field_kwargs = _get_base_field_kwargs()
  12. for key, value in self.field_kwargs.items():
  13. if key == 'validate':
  14. if 'validate' not in field_kwargs:
  15. field_kwargs['validate'] = []
  16. field_kwargs['validate'] += value
  17. else:
  18. field_kwargs[key] = value
  19. return field_kwargs
  20. class RequiredParam(MetaParam):
  21. def __init__(self, field_me):
  22. super(RequiredParam, self).__init__()
  23. required = getattr(field_me, 'required')
  24. # If the field has a default value, we don't have to enforce the
  25. # require check
  26. if required and getattr(field_me, 'default', None) is None:
  27. self.field_kwargs['required'] = required
  28. class LenghtParam(MetaParam):
  29. def __init__(self, field_me):
  30. super(LenghtParam, self).__init__()
  31. # Add a length validator for max_length/min_length
  32. maxmin_args = {}
  33. if hasattr(field_me, 'max_length'):
  34. maxmin_args['max'] = field_me.max_length
  35. if hasattr(field_me, 'min_length'):
  36. maxmin_args['min'] = field_me.min_length
  37. self.field_kwargs['validate'].append(validate.Length(**maxmin_args))
  38. class RegexParam(MetaParam):
  39. def __init__(self, field_me):
  40. super(RegexParam, self).__init__()
  41. regex = getattr(field_me, 'regex', None)
  42. if regex:
  43. self.field_kwargs['validate'].append(validate.Regexp(regex))
  44. class SizeParam(MetaParam):
  45. def __init__(self, field_me):
  46. super(SizeParam, self).__init__()
  47. # Add a length validator for max_length/min_length
  48. maxmin_args = {}
  49. if hasattr(field_me, 'max_value'):
  50. maxmin_args['max'] = field_me.max_value
  51. if hasattr(field_me, 'min_value'):
  52. maxmin_args['min'] = field_me.min_value
  53. self.field_kwargs['validate'].append(validate.Range(**maxmin_args))
  54. class DescriptionParam(MetaParam):
  55. def __init__(self, field_me):
  56. super(DescriptionParam, self).__init__()
  57. description = getattr(field_me, 'help_text', None)
  58. if description:
  59. self.field_kwargs['description'] = description
  60. class AllowNoneParam(MetaParam):
  61. def __init__(self, field_me):
  62. super(AllowNoneParam, self).__init__()
  63. allow_none = getattr(field_me, 'null', None)
  64. if allow_none:
  65. self.field_kwargs['allow_none'] = True
  66. class ChoiceParam(MetaParam):
  67. def __init__(self, field_me):
  68. super(ChoiceParam, self).__init__()
  69. choices = getattr(field_me, 'choices', None)
  70. labels = None
  71. if choices and isinstance(choices[0], (list, tuple)):
  72. choices, labels = zip(*choices)
  73. if choices:
  74. self.field_kwargs['validate'].append(validate.OneOf(choices, labels))
  75. class PrecisionParam(MetaParam):
  76. def __init__(self, field_me):
  77. super(PrecisionParam, self).__init__()
  78. precision = getattr(field_me, 'precision', None)
  79. if precision:
  80. self.field_kwargs['places'] = precision