class ValidBirthDay(validators.FancyValidator): """Validator to test for validity of a date from given month, day and year. """ messages = {'invalid': "The birthday date isn't valid, minimum age is 18"} __unpackargs__ = ('month', 'day', 'year', 'minAge', 'maxAge',) def validate_python(self, field_dict, state): bdate = date(field_dict[self.year], field_dict[self.month], field_dict[self.day]) dt_now = date.today() if self.minAge <= (dt_now - bdate).days / 365 <= self.maxAge: return bdate print self.message('invalid', state), state, field_dict raise validators.Invalid( self.message('invalid', state), field_dict, state) class NewUserSchema(validators.Schema): user_name = validators.All(validators.UnicodeString(not_empty=True, min=5, max=16, strip=True), UniqueUsername()) email = validators.All(validators.Email(not_empty=True, max=255), UniqueEmail()) gender = validators.OneOf(['Male','Female']) password1 = validators.UnicodeString(not_empty=True, min=4, max=40) password2 = validators.UnicodeString(not_empty=True, min=4, max=40) birth_month = validators.Int(not_empty=True) birth_day = validators.Int(not_empty=True) birth_year= validators.Int(not_empty=True) zip_code = validators.PostalCode(not_empty=True) country = validators.UnicodeString(not_empty=True) display_name = validators.UnicodeString(not_empty=True) chained_validators = [validators.FieldsMatch('password1', 'password2'), ValidBirthDay('birth_month', 'birth_day', 'birth_year', 18, 100)]