Browse Source

Add edit page, get rid of old views

Gu1 11 years ago
parent
commit
6365f1f895
4 changed files with 46 additions and 52 deletions
  1. 27 2
      ffdnispdb/forms.py
  2. 1 0
      ffdnispdb/static/css/style.css
  3. 1 1
      ffdnispdb/templates/project_form.html
  4. 17 49
      ffdnispdb/views.py

+ 27 - 2
ffdnispdb/forms.py

@@ -37,14 +37,17 @@ class MyFormField(FormField):
 
 class Unique(object):
     """ validator that checks field uniqueness """
-    def __init__(self, model, field, message=None):
+    def __init__(self, model, field, message=None, allow_edit=False):
         self.model = model
         self.field = field
         if not message:
-            message = u'this element already exists'
+            message = _(u'this element already exists')
         self.message = message
 
     def __call__(self, form, field):
+        default=field.default() if callable(field.default) else field.default
+        if field.object_data != default and field.object_data == field.data:
+            return
         check = self.model.query.filter(self.field == field.data).first()
         if check:
             raise ValidationError(self.message)
@@ -115,3 +118,25 @@ class ProjectForm(Form):
         optlist('chatrooms', filter(bool, self.chatrooms.data)) # remove empty strings
         return json
 
+    @classmethod
+    def edit_json(cls, json):
+        obj=type('abject', (object,), {})
+        def set_attr(attr, itemk=None):
+            if itemk is None:
+                itemk=attr
+            if itemk in json:
+                setattr(obj, attr, json[itemk])
+        set_attr('name')
+        set_attr('shortname')
+        set_attr('description')
+        set_attr('logo_url', 'logoURL')
+        set_attr('website')
+        set_attr('contact_email', 'email')
+        set_attr('main_ml', 'mainMailingList')
+        set_attr('creation_date', 'creationDate')
+        set_attr('step', 'progressStatus')
+        return cls(obj=obj)
+
+
+class ProjectJSONForm(Form):
+    url = TextField(_(u'link url'), validators=[Optional(), URL(require_tld=True)])

+ 1 - 0
ffdnispdb/static/css/style.css

@@ -41,6 +41,7 @@ input#search-input {
     font-size: 24px;
     letter-spacing: 1px;
     display: inline-block;
+    vertical-align: text-bottom;
 }
 
 #ffdn-header span {

+ 1 - 1
ffdnispdb/templates/project_form.html

@@ -3,7 +3,7 @@
 {% 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") }}</legend>

+ 17 - 49
ffdnispdb/views.py

@@ -27,63 +27,31 @@ def members():
 def project_list():
     return render_template('project_list.html', projects=ISP.query.filter_by(is_disabled=False))
 
-@app.route('/fai/<projectid>')
+@app.route('/isp/<projectid>/')
 def project(projectid):
     p=ISP.query.get(projectid)
     if not p:
         abort(404)
     return render_template('project_detail.html', project_row=p, project=p.json)
 
-@app.route('/edit/<projectid>', methods=['GET', 'POST'])
+
+@app.route('/isp/<projectid>/edit', methods=['GET', 'POST'])
 def edit_project(projectid):
-    project = query_db('select * from fai where id = ?', [projectid], one=True)
-    if project is None:
+    isp=ISP.query.get(projectid)
+    if not isp:
         abort(404)
-    if request.method == 'POST':
-        if request.form['name']:
-            if request.form['shortname']:
-                if query_db('select * from fai where id!=? and (name=? or shortname=?)', [projectid, request.form['name'], request.form['shortname']], one=True) is None:
-                    is_member = 0
-                    if 'is_member' in request.form.keys():
-                        is_member = 1
-                    g.db.execute('update fai set name = ?, shortname = ?, description = ?, website = ?, email = ?, irc_channel = ?, irc_server = ?, zone = ?, gps = ?, step = ?, is_member = ? where id = ?', 
-                            [request.form['name'], request.form['shortname'], request.form['description'], request.form['website'], request.form['email'], request.form['irc_channel'], request.form['irc_server'], request.form['zone'], request.form['gps1'] + ':' + request.form['gps2'], request.form['step'][:1], is_member, projectid]) 
-                    g.db.commit()
-                    flash(u"Le projet a bien été mis à jour. Merci pour votre contribution !", "success")
-                    project = query_db('select * from fai where id = ?', [projectid], one=True)
-                    return redirect(url_for('project', projectid=projectid))
-                else:
-                    flash(u'Le nom complet ou le nom court que vous avez choisi est déjà pris.', 'error')
-            else:
-                flash(u'Vous devez spécifier un nom court (éventuellement, le même que le nom complet).', 'error')
-        else:
-            flash(u'Vous devez spécifier un nom.', 'error')
-
-    project['stepname'] = STEPS[project['step']]
-    return render_template('edit_project.html', project=project)
-
-@app.route('/create_old', methods=['GET', 'POST'])
-def create_project_old():
-    if request.method == 'POST':
-        if request.form['name']:
-            if request.form['shortname']:
-                if query_db('select * from fai where name=? or shortname=?', [request.form['name'], request.form['shortname']], one=True) is None:
-                    g.db.execute('INSERT INTO fai (name, shortname, description, website, email, irc_channel, irc_server, zone, gps, step) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', 
-                            [request.form['name'], request.form['shortname'], request.form['description'], request.form['website'], request.form['email'], request.form['irc_channel'], request.form['irc_server'], request.form['zone'], request.form['gps1'] + ':' + request.form['gps2'], request.form['step'][:1]]) 
-                    g.db.commit()
-                    flash(u"Le projet a bien été créé. Merci pour votre contribution !", "success")
-                    project = query_db('select * from fai where name = ?', [request.form['name']], one=True)
-                    if project is not None:
-                        return redirect(url_for('project', projectid=project['id']))
-                    else:
-                        flash(u'Hum… il semble que le projet n\'a pas été créé… vous voulez-bien réessayer ?', 'error')
-                else:
-                    flash(u'Le nom complet ou le nom court que vous avez choisi est déjà pris.', 'error')
-            else:
-                flash(u'Vous devez spécifier un nom court (éventuellement, le même que le nom complet).', 'error')
-        else:
-            flash(u'Vous devez spécifier un nom.', 'error')
-    return render_template('create_project.html')
+    form = forms.ProjectForm.edit_json(isp.json)
+    if form.validate_on_submit():
+        isp.name = form.name.data
+        isp.shortname = form.shortname.data or None
+        isp.json=form.to_json(isp.json)
+
+        db.session.add(isp)
+        db.session.commit()
+        flash(_(u'Project modified'), 'info')
+        return redirect(url_for('project', projectid=isp.id))
+    return render_template('project_form.html', form=form, project=isp)
+
 
 @app.route('/add-a-project', methods=['GET'])
 def add_project():