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
 from functools import partial
 import itertools
 import itertools
+import urlparse
 from flask.ext.wtf import Form
 from flask.ext.wtf import Form
 from wtforms import Form as InsecureForm
 from wtforms import Form as InsecureForm
 from wtforms import (TextField, DateField, DecimalField, IntegerField, SelectField,
 from wtforms import (TextField, DateField, DecimalField, IntegerField, SelectField,
@@ -183,6 +184,27 @@ class ProjectForm(Form):
         return cls(obj=obj)
         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):
 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" %}
 {% extends "layout.html" %}
+{% import "form_macros.html" as fm %}
 {% block container %}
 {% block container %}
 <div class="row">
 <div class="row">
   <div class="span11 well">
   <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 }}
       {{ form.csrf_token }}
       <fieldset>
       <fieldset>
         <legend>{{ _("Add a new project from a JSON URL") }}</legend>
         <legend>{{ _("Add a new project from a JSON URL") }}</legend>
+        {{ fm.render_field(form.url) }}
         <div class="form-actions">
         <div class="form-actions">
           <input type="submit" class="btn btn-primary" value="{{ _("Submit") }}" />
           <input type="submit" class="btn btn-primary" value="{{ _("Submit") }}" />
           <input type="reset" class="btn" value="{{ _("Cancel") }}" />
           <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 
     render_template, flash, jsonify 
 from flask.ext.babel import gettext as _
 from flask.ext.babel import gettext as _
 from datetime import date, time, timedelta, datetime
 from datetime import date, time, timedelta, datetime
+from urlparse import urlunsplit
 import locale
 import locale
 locale.setlocale(locale.LC_ALL, '')
 locale.setlocale(locale.LC_ALL, '')
 import string
 import string
@@ -75,6 +76,10 @@ def create_project_form():
 def create_project_json():
 def create_project_json():
     form = forms.ProjectJSONForm()
     form = forms.ProjectJSONForm()
     if form.validate_on_submit():
     if form.validate_on_submit():
+        u=list(form.url.data)
+        u[2]='/isp.json' # new path
+        url=urlunsplit(u)
+
         isp=ISP()
         isp=ISP()
         db.session.add(isp)
         db.session.add(isp)
         db.session.commit()
         db.session.commit()