Browse Source

Form to add a project by JSON URL

Gu1 11 years ago
parent
commit
143b62b039
3 changed files with 31 additions and 2 deletions
  1. 23 1
      ffdnispdb/forms.py
  2. 3 1
      ffdnispdb/templates/project_json_form.html
  3. 5 0
      ffdnispdb/views.py

+ 23 - 1
ffdnispdb/forms.py

@@ -1,5 +1,6 @@
 from functools import partial
 import itertools
+import urlparse
 from flask.ext.wtf import Form
 from wtforms import Form as InsecureForm
 from wtforms import (TextField, DateField, DecimalField, IntegerField, SelectField,
@@ -183,6 +184,27 @@ class ProjectForm(Form):
         return cls(obj=obj)
 
 
+class URLField(TextField):
+    def _value(self):
+        return urlparse.urlunsplit(self.data) if self.data is not None else ''
+
+    def process_formdata(self, valuelist):
+        if valuelist:
+            try:
+                self.data = urlparse.urlsplit(valuelist[0])
+            except:
+                self.data = None
+                raise ValidationError(_(u'Invalid URL'))
+
 class ProjectJSONForm(Form):
-    url = TextField(_(u'link url'), validators=[Optional(), URL(require_tld=True)])
+    url = URLField(_(u'base url'), description=['E.g. https://isp.com/', 'A ressource implementing our '+\
+                                                'JSON-Schema specification must exist at path /isp.json'])
+
+    def validate_url(self, field):
+        if not field.data.netloc:
+            raise ValidationError(_(u'Invalid URL'))
+
+        if field.data.scheme not in ('http', 'https'):
+            raise ValidationError(_(u'Invalid URL (must be HTTP(s))'))
+
 

+ 3 - 1
ffdnispdb/templates/project_json_form.html

@@ -1,11 +1,13 @@
 {% extends "layout.html" %}
+{% import "form_macros.html" as fm %}
 {% block container %}
 <div class="row">
   <div class="span11 well">
-    <form action="{{ url_for('create_project_form') }}" method="post" class="form-horizontal">
+    <form method="post" class="form-horizontal">
       {{ form.csrf_token }}
       <fieldset>
         <legend>{{ _("Add a new project from a JSON URL") }}</legend>
+        {{ fm.render_field(form.url) }}
         <div class="form-actions">
           <input type="submit" class="btn btn-primary" value="{{ _("Submit") }}" />
           <input type="reset" class="btn" value="{{ _("Cancel") }}" />

+ 5 - 0
ffdnispdb/views.py

@@ -4,6 +4,7 @@ from flask import request, g, redirect, url_for, abort, \
     render_template, flash, jsonify 
 from flask.ext.babel import gettext as _
 from datetime import date, time, timedelta, datetime
+from urlparse import urlunsplit
 import locale
 locale.setlocale(locale.LC_ALL, '')
 import string
@@ -75,6 +76,10 @@ def create_project_form():
 def create_project_json():
     form = forms.ProjectJSONForm()
     if form.validate_on_submit():
+        u=list(form.url.data)
+        u[2]='/isp.json' # new path
+        url=urlunsplit(u)
+
         isp=ISP()
         db.session.add(isp)
         db.session.commit()