summaryrefslogtreecommitdiffstats
path: root/utils/forms.py
diff options
context:
space:
mode:
authorAlexander Sulfrian <alex@spline.inf.fu-berlin.de>2016-01-10 05:08:36 +0100
committerAlexander Sulfrian <alex@spline.inf.fu-berlin.de>2016-01-10 05:08:36 +0100
commit1ec270de4390f215f874e8fad23736ce978c1bbd (patch)
treef56ebd30ec7648f785b558e499148d424bc55147 /utils/forms.py
parent915c05c05a5b510d53042944582dc62c7d3f28d1 (diff)
downloadpadlite-teams-1ec270de4390f215f874e8fad23736ce978c1bbd.tar.gz
padlite-teams-1ec270de4390f215f874e8fad23736ce978c1bbd.tar.bz2
padlite-teams-1ec270de4390f215f874e8fad23736ce978c1bbd.zip
Use sqlalchemy, flask-migrate, flask-login and flask-script
No peewee anymore. All dependencies are available as debian packages now.
Diffstat (limited to 'utils/forms.py')
-rw-r--r--utils/forms.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/utils/forms.py b/utils/forms.py
new file mode 100644
index 0000000..a6ff4de
--- /dev/null
+++ b/utils/forms.py
@@ -0,0 +1,55 @@
+from flask import request, url_for, redirect
+from urlparse import urlparse, urljoin
+from wtforms import Field, HiddenField, ValidationError
+
+from widgets import Static
+
+
+class Unique(object):
+ """ validator that checks field uniqueness """
+ def __init__(self, model, field, message=None):
+ self.model = model
+ self.field = field
+ if not message:
+ message = u'This element already exists.'
+ self.message = message
+
+ def __call__(self, form, field):
+ if self.model.query.filter(self.field == field.data).count() > 0:
+ raise ValidationError(self.message)
+
+
+class ReadonlyField(Field):
+ widget = Static()
+
+ def process_formdata(self, _):
+ pass
+
+
+class RedirectMixin(object):
+ next = HiddenField()
+
+ def __init__(self, *args, **kwargs):
+ super(RedirectMixin, self).__init__(*args, **kwargs)
+ if not self.next.data:
+ self.next.data = self._get_redirect_target() or ''
+
+ def _get_redirect_target(self):
+ for target in request.args.get('next'), request.referrer:
+ if not target:
+ continue
+ if self._is_safe_url(target):
+ return target
+
+ def _is_safe_url(self, target):
+ ref_url = urlparse(request.host_url)
+ test_url = urlparse(urljoin(request.host_url, target))
+ return test_url.scheme in ('http', 'https') and \
+ ref_url.netloc == test_url.netloc
+
+ def redirect(self, endpoint='index', **values):
+ if self._is_safe_url(self.next.data):
+ return redirect(self.next.data)
+
+ target = self._get_redirect_target()
+ return redirect(target or url_for(endpoint, **values))