cerberus_extend.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. '''
  2. @author: olivier.massot, 2018
  3. '''
  4. from datetime import datetime
  5. import cerberus
  6. from core import gis
  7. def is_french_date(field, value, error):
  8. try:
  9. datetime.strptime(value, '%d/%m/%Y')
  10. except:
  11. error(field, 'Doit être une date au format jj/mm/aaaa')
  12. # Ref: http://docs.python-cerberus.org/en/stable/api.html#error-codes
  13. class GeoValidator(cerberus.validator.Validator):
  14. def _validate_geom(self, geom, field, value):
  15. shapeType, bbox = geom
  16. if value.shapeType != shapeType:
  17. self._error(field, "Le type de géométrie est {} (attendu: {})".format(gis.SHAPE_NAMES[value.shapeType], gis.SHAPE_NAMES[shapeType]))
  18. xmin, ymin, xmax, ymax = bbox
  19. try:
  20. x1, y1, x2, y2 = value.bbox
  21. if any(x < xmin or x > xmax for x in (x1, x2)) or \
  22. any(y < ymin or y > ymax for y in (y1, y2)):
  23. self._error(field, "Certaines coordonnées hors de l'emprise autorisée")
  24. except AttributeError:
  25. pass
  26. def _validate_shapeType(self, shapeType, field, value):
  27. """ Test the oddity of a value.
  28. The rule's arguments are validated against this schema:
  29. {'type': 'boolean'}
  30. """
  31. if value != shapeType:
  32. self._error(field, "Le type de géométrie est incorrect")
  33. def _validate_bbox(self, bbox, field, value):
  34. """ Test the oddity of a value.
  35. The rule's arguments are validated against this schema:
  36. {'type': 'boolean'}
  37. """
  38. xmin, ymin, xmax, ymax = bbox
  39. x1, y1, x2, y2 = value
  40. if any(x < xmin or x > xmax for x in (x1, x2)) or \
  41. any(y < ymin or y > ymax for y in (y1, y2)):
  42. self._error(field, "Certaines coordonnées hors de l'emprise autorisée")
  43. class CerberusErrorHandler(cerberus.errors.BasicErrorHandler):
  44. messages = {0x00: "{0}",
  45. 0x01: "Le document est manquant",
  46. 0x02: "Le champs est obligatoire",
  47. 0x03: "Champs inconnu",
  48. 0x04: "Le champs '{0}' est obligatoire",
  49. 0x05: "Dépends de ces valeurs: {constraint}",
  50. 0x06: "{0} ne doit pas être présent avec '{field}'",
  51. 0x21: "'{0}' is not a document, must be a dict",
  52. 0x22: "Le champs ne peut pas être vide",
  53. 0x23: "Les valeurs NULL ne sont pas autorisées",
  54. 0x24: "Doit être du type: {constraint}",
  55. 0x25: "Doit être de type 'dictionnaire'",
  56. 0x26: "La longueur de la liste doit être de {constraint}, elle est de {0}",
  57. 0x27: "La longueur minimum est de {constraint}",
  58. 0x28: "La longueur maximum est de {constraint}",
  59. 0x41: "La valeur n'est pas au bon format ('{constraint}')",
  60. 0x42: "La valeur minimum autorisée est {constraint}",
  61. 0x43: "La valeur maximum autorisée est {constraint}",
  62. 0x44: "Valeur non-autorisée: {value}",
  63. 0x45: "Valeurs non-autorisées: {0}",
  64. 0x46: "Valeur non-autorisée: {value}",
  65. 0x47: "Valeurs non-autorisées: {0}",
  66. 0x61: "Le champs '{field}' ne peut pas être converti: {0}",
  67. 0x62: "Le champs '{field}' ne peut pas être renommé: {0}",
  68. 0x63: "Le champs est en lecture seule",
  69. 0x64: "La valeur par défaut du champs '{field}' ne peut pas être appliquée: {0}",
  70. 0x81: "mapping doesn't validate subschema: {0}",
  71. 0x82: "one or more sequence-items don't validate: {0}",
  72. 0x83: "one or more keys of a mapping don't validate: {0}",
  73. 0x84: "one or more values in a mapping don't validate: {0}",
  74. 0x85: "one or more sequence-items don't validate: {0}",
  75. 0x91: "one or more definitions validate",
  76. 0x92: "none or more than one rule validate",
  77. 0x93: "no definitions validate",
  78. 0x94: "one or more definitions don't validate"
  79. }