''' @author: olivier.massot, 2018 ''' from datetime import datetime import cerberus from core import gis def is_french_date(field, value, error): try: datetime.strptime(value, '%d/%m/%Y') except: error(field, 'Doit être une date au format jj/mm/aaaa') # Ref: http://docs.python-cerberus.org/en/stable/api.html#error-codes class GeoValidator(cerberus.validator.Validator): def _validate_geom(self, geom, field, value): shapeType, bbox = geom if value.shapeType != shapeType: self._error(field, "Le type de géométrie est {} (attendu: {})".format(gis.SHAPE_NAMES[value.shapeType], gis.SHAPE_NAMES[shapeType])) xmin, ymin, xmax, ymax = bbox try: x1, y1, x2, y2 = value.bbox if any(x < xmin or x > xmax for x in (x1, x2)) or \ any(y < ymin or y > ymax for y in (y1, y2)): self._error(field, "Certaines coordonnées hors de l'emprise autorisée") except AttributeError: pass def _validate_shapeType(self, shapeType, field, value): """ Test the oddity of a value. The rule's arguments are validated against this schema: {'type': 'boolean'} """ if value != shapeType: self._error(field, "Le type de géométrie est incorrect") def _validate_bbox(self, bbox, field, value): """ Test the oddity of a value. The rule's arguments are validated against this schema: {'type': 'boolean'} """ xmin, ymin, xmax, ymax = bbox x1, y1, x2, y2 = value if any(x < xmin or x > xmax for x in (x1, x2)) or \ any(y < ymin or y > ymax for y in (y1, y2)): self._error(field, "Certaines coordonnées hors de l'emprise autorisée") class CerberusErrorHandler(cerberus.errors.BasicErrorHandler): messages = {0x00: "{0}", 0x01: "Le document est manquant", 0x02: "Le champs est obligatoire", 0x03: "Champs inconnu", 0x04: "Le champs '{0}' est obligatoire", 0x05: "Dépends de ces valeurs: {constraint}", 0x06: "{0} ne doit pas être présent avec '{field}'", 0x21: "'{0}' is not a document, must be a dict", 0x22: "Le champs ne peut pas être vide", 0x23: "Les valeurs NULL ne sont pas autorisées", 0x24: "Doit être du type: {constraint}", 0x25: "Doit être de type 'dictionnaire'", 0x26: "La longueur de la liste doit être de {constraint}, elle est de {0}", 0x27: "La longueur minimum est de {constraint}", 0x28: "La longueur maximum est de {constraint}", 0x41: "La valeur n'est pas au bon format ('{constraint}')", 0x42: "La valeur minimum autorisée est {constraint}", 0x43: "La valeur maximum autorisée est {constraint}", 0x44: "Valeur non-autorisée: {value}", 0x45: "Valeurs non-autorisées: {0}", 0x46: "Valeur non-autorisée: {value}", 0x47: "Valeurs non-autorisées: {0}", 0x61: "Le champs '{field}' ne peut pas être converti: {0}", 0x62: "Le champs '{field}' ne peut pas être renommé: {0}", 0x63: "Le champs est en lecture seule", 0x64: "La valeur par défaut du champs '{field}' ne peut pas être appliquée: {0}", 0x81: "mapping doesn't validate subschema: {0}", 0x82: "one or more sequence-items don't validate: {0}", 0x83: "one or more keys of a mapping don't validate: {0}", 0x84: "one or more values in a mapping don't validate: {0}", 0x85: "one or more sequence-items don't validate: {0}", 0x91: "one or more definitions validate", 0x92: "none or more than one rule validate", 0x93: "no definitions validate", 0x94: "one or more definitions don't validate" }