pylint improvements.

pull/7/head
Ferry Boender 10 years ago
parent 394022e2d3
commit 4210c3c672
  1. 4
      src/formconfig.py
  2. 40
      src/formdefinition.py
  3. 72
      src/formrender.py
  4. 23
      src/webapp.py

@ -14,8 +14,10 @@ class FormConfig:
file. It holds information (title, users, the form definitions) on the file. It holds information (title, users, the form definitions) on the
form configuration being served by this instance of ScriptForm. form configuration being served by this instance of ScriptForm.
""" """
def __init__(self, title, forms, users={}, static_dir=None, custom_css=None): def __init__(self, title, forms, users=None, static_dir=None, custom_css=None):
self.title = title self.title = title
self.users = {}
if users is not None:
self.users = users self.users = users
self.forms = forms self.forms = forms
self.static_dir = static_dir self.static_dir = static_dir

@ -88,54 +88,54 @@ class FormDefinition:
def validate_integer(self, field_def, form_values): def validate_integer(self, field_def, form_values):
value = form_values[field_def['name']] value = form_values[field_def['name']]
_max = field_def.get('max', None) maxval = field_def.get('max', None)
_min = field_def.get('min', None) minval = field_def.get('min', None)
try: try:
value = int(value) value = int(value)
except ValueError: except ValueError:
raise ValidationError("Must be an integer number") raise ValidationError("Must be an integer number")
if _min is not None and value < int(_min): if minval is not None and value < int(minval):
raise ValidationError("Minimum value is {0}".format(_min)) raise ValidationError("Minimum value is {0}".format(minval))
if _max is not None and value > int(_max): if maxval is not None and value > int(maxval):
raise ValidationError("Maximum value is {0}".format(_max)) raise ValidationError("Maximum value is {0}".format(maxval))
return int(value) return int(value)
def validate_float(self, field_def, form_values): def validate_float(self, field_def, form_values):
value = form_values[field_def['name']] value = form_values[field_def['name']]
_max = field_def.get('max', None) maxval = field_def.get('max', None)
_min = field_def.get('min', None) minval = field_def.get('min', None)
try: try:
value = float(value) value = float(value)
except ValueError: except ValueError:
raise ValidationError("Must be an real (float) number") raise ValidationError("Must be an real (float) number")
if _min is not None and value < float(_min): if minval is not None and value < float(minval):
raise ValidationError("Minimum value is {0}".format(_min)) raise ValidationError("Minimum value is {0}".format(minval))
if _max is not None and value > float(_max): if maxval is not None and value > float(maxval):
raise ValidationError("Maximum value is {0}".format(_max)) raise ValidationError("Maximum value is {0}".format(maxval))
return float(value) return float(value)
def validate_date(self, field_def, form_values): def validate_date(self, field_def, form_values):
value = form_values[field_def['name']] value = form_values[field_def['name']]
_max = field_def.get('max', None) maxval = field_def.get('max', None)
_min = field_def.get('min', None) minval = field_def.get('min', None)
try: try:
value = datetime.datetime.strptime(value, '%Y-%m-%d').date() value = datetime.datetime.strptime(value, '%Y-%m-%d').date()
except ValueError: except ValueError:
raise ValidationError("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 minval is not None:
if value < datetime.datetime.strptime(_min, '%Y-%m-%d').date(): if value < datetime.datetime.strptime(minval, '%Y-%m-%d').date():
raise ValidationError("Minimum value is {0}".format(_min)) raise ValidationError("Minimum value is {0}".format(minval))
if _max is not None: if maxval is not None:
if value > datetime.datetime.strptime(_max, '%Y-%m-%d').date(): if value > datetime.datetime.strptime(maxval, '%Y-%m-%d').date():
raise ValidationError("Maximum value is {0}".format(_max)) raise ValidationError("Maximum value is {0}".format(maxval))
return value return value

@ -1,13 +1,13 @@
html_field = u''' html_field = u'''
<li class="{classes}"> <li class="{classes}">
<p class="form-field-title">{title}</p> <p class="form-field-title">{title}</p>
<p class="form-field-input">{input} <span class="error">{errors}</span></p> <p class="form-field-input">{h_input} <span class="error">{errors}</span></p>
</li> </li>
''' '''
html_field_checkbox = u''' html_field_checkbox = u'''
<li class="checkbox {classes}"> <li class="checkbox {classes}">
<p class="form-field-input">{input} <p class="form-field-title">{title}</p><span class="error">{errors}</span></p> <p class="form-field-input">{h_input} <p class="form-field-title">{title}</p><span class="error">{errors}</span></p>
</li> </li>
''' '''
@ -15,12 +15,12 @@ html_field_checkbox = u'''
class FormRender(): class FormRender():
field_tpl = { field_tpl = {
"string": u'<input {required} type="text" name="{name}" value="{value}" size="{size}" class="{classes}" style="{style}" />', "string": u'<input {required} type="text" name="{name}" value="{value}" size="{size}" class="{classes}" style="{style}" />',
"number": u'<input {required} type="number" min="{min}" max="{max}" name="{name}" value="{value}" class="{classes}" style="{style}" />', "number": u'<input {required} type="number" min="{minval}" max="{maxval}" name="{name}" value="{value}" class="{classes}" style="{style}" />',
"integer": u'<input {required} type="number" min="{min}" max="{max}" name="{name}" value="{value}" class="{classes}" style="{style}" />', "integer": u'<input {required} type="number" min="{minval}" max="{maxval}" name="{name}" value="{value}" class="{classes}" style="{style}" />',
"float": u'<input {required} type="number" min="{min}" max="{max}" step="any" name="{name}" value="{value}" class="{classes}" style="{style}" />', "float": u'<input {required} type="number" min="{minval}" max="{maxval}" step="any" name="{name}" value="{value}" class="{classes}" style="{style}" />',
"date": u'<input {required} type="date" name="{name}" value="{value}" class="{classes}" style="{style}" />', "date": u'<input {required} type="date" name="{name}" value="{value}" class="{classes}" style="{style}" />',
"file": u'<input {required} type="file" name="{name}" class="{classes}" style="{style}" />', "file": u'<input {required} type="file" name="{name}" class="{classes}" style="{style}" />',
"password": u'<input {required} type="password" min="{min}" name="{name}" value="{value}" class="{classes}" style="{style}" />', "password": u'<input {required} type="password" min="{minval}" name="{name}" value="{value}" class="{classes}" style="{style}" />',
"text": u'<textarea {required} name="{name}" rows="{rows}" cols="{cols}" style="{style}" class="{classes}">{value}</textarea>', "text": u'<textarea {required} name="{name}" rows="{rows}" cols="{cols}" style="{style}" class="{classes}">{value}</textarea>',
"radio_option": u'<input {checked} type="radio" name="{name}" value="{value}" class="{classes} style="{style}"">{label}<br/>', "radio_option": u'<input {checked} type="radio" name="{name}" value="{value}" class="{classes} style="{style}"">{label}<br/>',
"select_option": u'<option value="{value}" style="{style}" {selected}>{label}</option>', "select_option": u'<option value="{value}" style="{style}" {selected}>{label}</option>',
@ -51,45 +51,63 @@ class FormRender():
return new_params return new_params
def r_field(self, type, **kwargs): def r_field(self, field_type, **kwargs):
params = self.cast_params(kwargs) params = self.cast_params(kwargs)
method_name = 'r_field_{0}'.format(type) method_name = 'r_field_{0}'.format(field_type)
method = getattr(self, method_name, None) method = getattr(self, method_name, None)
return method(**params) return method(**params)
def r_field_string(self, name, value, size=50, required=False, classes=[], style=""): def r_field_string(self, name, value, size=50, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['string'] tpl = self.field_tpl['string']
return tpl.format(name=name, value=value, size=size, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, size=size, required=required, classes=classes, style=style)
def r_field_number(self, name, value, min=None, max=None, required=False, classes=[], style=""): def r_field_number(self, name, value, minval=None, maxval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['number'] tpl = self.field_tpl['number']
return tpl.format(name=name, value=value, min=min, max=max, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, minval=minval, maxval=maxval, required=required, classes=classes, style=style)
def r_field_integer(self, name, value, min=None, max=None, required=False, classes=[], style=""): def r_field_integer(self, name, value, minval=None, maxval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['integer'] tpl = self.field_tpl['integer']
return tpl.format(name=name, value=value, min=min, max=max, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, minval=minval, maxval=maxval, required=required, classes=classes, style=style)
def r_field_float(self, name, value, min=None, max=None, required=False, classes=[], style=""): def r_field_float(self, name, value, minval=None, maxval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['integer'] tpl = self.field_tpl['integer']
return tpl.format(name=name, value=value, min=min, max=max, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, minval=minval, maxval=maxval, required=required, classes=classes, style=style)
def r_field_date(self, name, value, required=False, classes=[], style=""): def r_field_date(self, name, value, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['date'] tpl = self.field_tpl['date']
return tpl.format(name=name, value=value, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, required=required, classes=classes, style=style)
def r_field_file(self, name, required=False, classes=[], style=""): def r_field_file(self, name, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['file'] tpl = self.field_tpl['file']
return tpl.format(name=name, required=required, classes=classes, style=style) return tpl.format(name=name, required=required, classes=classes, style=style)
def r_field_password(self, name, value, min=None, required=False, classes=[], style=""): def r_field_password(self, name, value, minval=None, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['password'] tpl = self.field_tpl['password']
return tpl.format(name=name, value=value, min=min, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, minval=minval, required=required, classes=classes, style=style)
def r_field_text(self, name, value, rows=4, cols=80, required=False, classes=[], style=""): def r_field_text(self, name, value, rows=4, cols=80, required=False, classes=None, style=""):
if classes is None:
classes = []
tpl = self.field_tpl['text'] tpl = self.field_tpl['text']
return tpl.format(name=name, value=value, rows=rows, cols=cols, required=required, classes=classes, style=style) return tpl.format(name=name, value=value, rows=rows, cols=cols, required=required, classes=classes, style=style)
def r_field_radio(self, name, value, options, classes=[], style=""): def r_field_radio(self, name, value, options, classes=None, style=""):
if classes is None:
classes = []
tpl_option = self.field_tpl['radio_option'] tpl_option = self.field_tpl['radio_option']
radio_elems = [] radio_elems = []
for o_value, o_label in options: for o_value, o_label in options:
@ -100,10 +118,14 @@ class FormRender():
return u''.join(radio_elems) return u''.join(radio_elems)
def r_field_checkbox(self, name, checked, classes='', style=""): def r_field_checkbox(self, name, checked, classes='', style=""):
if classes is None:
classes = []
tpl = self.field_tpl['checkbox'] tpl = self.field_tpl['checkbox']
return tpl.format(name=name, checked=checked, classes=classes, style=style) return tpl.format(name=name, checked=checked, classes=classes, style=style)
def r_field_select(self, name, value, options, classes=[], style=""): def r_field_select(self, name, value, options, classes=None, style=""):
if classes is None:
classes = []
tpl_option = self.field_tpl['select_option'] tpl_option = self.field_tpl['select_option']
select_elems = [] select_elems = []
for o_value, o_label in options: for o_value, o_label in options:
@ -115,13 +137,13 @@ class FormRender():
tpl = self.field_tpl['select'] tpl = self.field_tpl['select']
return tpl.format(name=name, select_elems=''.join(select_elems), classes=classes, style=style) return tpl.format(name=name, select_elems=''.join(select_elems), classes=classes, style=style)
def r_form_line(self, type, title, input, classes, errors): def r_form_line(self, field_type, title, h_input, classes, errors):
if type == 'checkbox': if field_type == 'checkbox':
html = html_field_checkbox html = html_field_checkbox
else: else:
html = html_field html = html_field
return (html.format(classes=' '.join(classes), return (html.format(classes=' '.join(classes),
title=title, title=title,
input=input, h_input=h_input,
errors=u', '.join(errors))) errors=u', '.join(errors)))

@ -146,10 +146,11 @@ class WebAppHandler(BaseHTTPRequestHandler):
requests. If no path is set, it dispatches to the 'index' or 'default' requests. If no path is set, it dispatches to the 'index' or 'default'
method. method.
""" """
def log_message(self, format, *args): def log_message(self, fmt, *args):
"""Overrides BaseHTTPRequestHandler which logs to the console. We log """Overrides BaseHTTPRequestHandler which logs to the console. We log
to our log file instead""" to our log file instead"""
self.scriptform.log.info("{} {}".format(self.address_string(), args)) fmt = "{} {}"
self.scriptform.log.info(fmt.format(self.address_string(), args))
def do_GET(self): def do_GET(self):
self._call(*self._parse(self.path)) self._call(*self._parse(self.path))
@ -167,8 +168,8 @@ class WebAppHandler(BaseHTTPRequestHandler):
qs = urlparse.parse_qs(url_comp.query) qs = urlparse.parse_qs(url_comp.query)
# Only return the first value of each query var. E.g. for # Only return the first value of each query var. E.g. for
# "?foo=1&foo=2" return '1'. # "?foo=1&foo=2" return '1'.
vars = dict([(k, v[0]) for k, v in qs.items()]) var_values = dict([(k, v[0]) for k, v in qs.items()])
return (path.strip('/'), vars) return (path.strip('/'), var_values)
def _call(self, path, params): def _call(self, path, params):
""" """
@ -236,7 +237,7 @@ class ScriptFormWebApp(WebAppHandler):
authorized = False authorized = False
auth_header = self.headers.getheader("Authorization") auth_header = self.headers.getheader("Authorization")
if auth_header is not None: if auth_header is not None:
auth_realm, auth_unpw = auth_header.split(' ', 1) auth_unpw = auth_header.split(' ', 1)[1]
username, password = base64.decodestring(auth_unpw).split(":") username, password = base64.decodestring(auth_unpw).split(":")
pw_hash = hashlib.sha256(password).hexdigest() pw_hash = hashlib.sha256(password).hexdigest()
# Validate the username and password # Validate the username and password
@ -287,10 +288,12 @@ class ScriptFormWebApp(WebAppHandler):
self.end_headers() self.end_headers()
self.wfile.write(output.encode('utf8')) self.wfile.write(output.encode('utf8'))
def h_form(self, form_name, errors={}, **form_values): def h_form(self, form_name, errors=None, **form_values):
""" """
Render a form. Render a form.
""" """
if errors is None:
errors = {}
if not self.auth(): if not self.auth():
return return
@ -318,10 +321,10 @@ class ScriptFormWebApp(WebAppHandler):
params['size'] = field.get('size', '') params['size'] = field.get('size', '')
if field['type'] in ('number', 'integer', 'float', 'password'): if field['type'] in ('number', 'integer', 'float', 'password'):
params['min'] = field.get("min", '') params['minval'] = field.get("min", '')
if field['type'] in ('number', 'integer', 'float'): if field['type'] in ('number', 'integer', 'float'):
params['max'] = field.get("max", '') params['maxval'] = field.get("max", '')
if field['type'] in ('text'): if field['type'] in ('text'):
params['rows'] = field.get("rows", '') params['rows'] = field.get("rows", '')
@ -340,10 +343,10 @@ class ScriptFormWebApp(WebAppHandler):
if field['name'] in form_values and form_values[field['name']] == 'on': if field['name'] in form_values and form_values[field['name']] == 'on':
params['checked'] = True params['checked'] = True
input = fr.r_field(field['type'], **params) h_input = fr.r_field(field['type'], **params)
return fr.r_form_line(field['type'], field['title'], return fr.r_form_line(field['type'], field['title'],
input, params['classes'], errors) h_input, params['classes'], errors)
# Make sure the user is allowed to access this form. # Make sure the user is allowed to access this form.
form_def = form_config.get_form_def(form_name) form_def = form_config.get_form_def(form_name)

Loading…
Cancel
Save