import re class validator(object): def validate(self, value): return value class mandatory(validator): def validate(self, value): if not value: raise ValueError('field is mandatory') return value class minsize(validator): def __init__(self, minsize): self.minsize = minsize def validate(self, value): if value is None: return value = value.strip() if len(value) < self.minsize: raise ValueError('field should contain at least %s characters' % ( self.minsize,)) return value class id(validator): def __init__(self): import string self.allowedchars = string.ascii_letters self.nonstart = '_.' + string.digits def validate(self, value): if not value: return value assert isinstance(value, str) or isinstance(value, unicode) value = value.strip() if value[0] in self.allowedchars: for char in value[1:]: if char not in self.allowedchars and char not in self.nonstart: break else: return value raise ValueError( 'should contain only legal characters (uppercase and ' 'lowercase characters, . and _)') class regvalidator(validator): def __init__(self, reg, msg): self.reg = reg self.msg = msg def validate(self, value): if not value: return value value = value.strip() if not self.reg.match(value): raise ValueError(self.msg) return value class email(regvalidator): def __init__(self): # we're rather relaxed here, rather not have false positives :| self.reg = re.compile(r'^[\w.\-]+@[\w.\-]+\.\w{2,}$', re.U) self.msg = 'is not an email address'