diff --git a/src/scriptform.py b/src/scriptform.py index d88071e..7cc5716 100755 --- a/src/scriptform.py +++ b/src/scriptform.py @@ -133,6 +133,14 @@ html_submit_response = ''' ''' +class ValidationError(BaseException): + pass + + +class ScriptFormError(BaseException): + pass + + class ScriptForm: """ 'Main' class that orchestrates parsing the Form configurations, hooking up @@ -203,10 +211,10 @@ class FormConfig: for form_def in self.forms: if form_def.script: if not stat.S_IXUSR & os.stat(form_def.script)[stat.ST_MODE]: - raise Exception("{0} is not executable".format(form_def.script)) + raise ScriptFormError("{0} is not executable".format(form_def.script)) else: if not form_name in self.callbacks: - raise Exception("No script or callback registered for '{0}'".format(form_name)) + raise ScriptFormError("No script or callback registered for '{0}'".format(form_name)) def get_form(self, form_name): for form_def in self.forms: @@ -295,7 +303,7 @@ class FormDefinition: v = self.validate_field(field_name, form_values) if v is not None: values[field_name] = v - except Exception, e: + except ValidationError, e: errors.setdefault(field_name, []).append(str(e)) return (errors, values) @@ -307,7 +315,7 @@ class FormDefinition: # Find field definition by iterating through all the fields. field_def = self.get_field(field_name) if not field_def: - raise KeyError("Unknown field: {0}".format(field_name)) + raise ValidationError("Unknown field: {0}".format(field_name)) field_type = field_def['type'] validate_cb = getattr(self, 'validate_{0}'.format(field_type), None) @@ -319,9 +327,9 @@ class FormDefinition: minlen = field_def.get('minlen', None) if minlen is not None and len(value) < minlen: - raise Exception("Minimum length is {0}".format(minlen)) + raise ValidationError("Minimum length is {0}".format(minlen)) if maxlen is not None and len(value) > maxlen: - raise Exception("Maximum length is {0}".format(maxlen)) + raise ValidationError("Maximum length is {0}".format(maxlen)) return value @@ -333,12 +341,12 @@ class FormDefinition: try: value = int(value) except ValueError: - raise Exception("Must be an integer number") + raise ValidationError("Must be an integer number") if min is not None and value < min: - raise Exception("Minimum value is {0}".format(min)) + raise ValidationError("Minimum value is {0}".format(min)) if max is not None and value > max: - raise Exception("Maximum value is {0}".format(max)) + raise ValidationError("Maximum value is {0}".format(max)) return int(value) @@ -350,12 +358,12 @@ class FormDefinition: try: value = float(value) except ValueError: - raise Exception("Must be an real (float) number") + raise ValidationError("Must be an real (float) number") if min is not None and value < min: - raise Exception("Minimum value is {0}".format(min)) + raise ValidationError("Minimum value is {0}".format(min)) if max is not None and value > max: - raise Exception("Maximum value is {0}".format(max)) + raise ValidationError("Maximum value is {0}".format(max)) return float(value) @@ -367,28 +375,28 @@ class FormDefinition: try: value = datetime.datetime.strptime(value, '%Y-%m-%d').date() except ValueError: - raise Exception("Invalid date, must be in form YYYY-MM-DD") + raise ValidationError("Invalid date, must be in form YYYY-MM-DD") if min is not None: if value < datetime.datetime.strptime(min, '%Y-%m-%d').date(): - raise Exception("Minimum value is {0}".format(min)) + raise ValidationError("Minimum value is {0}".format(min)) if max is not None: if value > datetime.datetime.strptime(max, '%Y-%m-%d').date(): - raise Exception("maximum value is {0}".format(max)) + raise ValidationError("maximum value is {0}".format(max)) return value def validate_radio(self, field_def, form_values): value = form_values[field_def['name']] if not value in [o[0] for o in field_def['options']]: - raise ValueError( + raise ValidationError( "Invalid value for radio button: {0}".format(value)) return value def validate_select(self, field_def, form_values): value = form_values[field_def['name']] if not value in [o[0] for o in field_def['options']]: - raise ValueError( + raise ValidationError( "Invalid value for dropdown: {0}".format(value)) return value @@ -399,11 +407,11 @@ class FormDefinition: if minlen is not None: if len(value) < minlen: - raise Exception("minimum length is {0}".format(minlen)) + raise ValidationError("minimum length is {0}".format(minlen)) if maxlen is not None: if len(value) > maxlen: - raise Exception("maximum length is {0}".format(maxlen)) + raise ValidationError("maximum length is {0}".format(maxlen)) return value @@ -413,7 +421,7 @@ class FormDefinition: if minlen is not None: if len(value) < minlen: - raise Exception("minimum length is {0}".format(minlen)) + raise ValidationError("minimum length is {0}".format(minlen)) return value @@ -425,7 +433,7 @@ class FormDefinition: extensions = field_def.get('extensions', None) if extensions is not None and upload_fname_ext not in extensions: - raise Exception("Only file types allowed: {0}".format(','.join(extensions))) + raise ValidationError("Only file types allowed: {0}".format(','.join(extensions))) return value