Admins can edit votes
authorGuillaume Subiron <maethor@subiron.org>
Tue, 29 May 2012 10:03:22 +0000 (12:03 +0200)
committerJulien Rabier <taziden@flexiden.org>
Tue, 29 May 2012 10:13:36 +0000 (12:13 +0200)
main.py
schema.sql
templates/edit_vote.html
templates/login.html
templates/new_vote.html

diff --git a/main.py b/main.py
index c26c2cb..bdbd032 100755 (executable)
--- a/main.py
+++ b/main.py
@@ -201,8 +201,11 @@ def add_vote():
                 public = 1
             if 'multiplechoice' in request.form.keys():
                 multiplechoice = 1
-            g.db.execute('insert into votes (title, description, date_begin, date_end, is_transparent, is_public, is_multiplechoice) values (?, ?, ?, ?, ?, ?, ?)',
-                    [request.form['title'], request.form['description'], date_begin, date_end, transparent, public, multiplechoice])
+            role = query_db('select id from roles where name = ?', [request.form['role']], one=True)
+            if role is None:
+                role[id] = 1
+            g.db.execute('insert into votes (title, description, category, date_begin, date_end, is_transparent, is_public, is_multiplechoice, id_role, id_author) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
+                    [request.form['title'], request.form['description'], request.form['category'], date_begin, date_end, transparent, public, multiplechoice, role['id'], session['user']['id']])
             g.db.commit()
             vote = query_db('select * from votes where title = ? and date_begin = ? order by id desc', 
                     [request.form['title'], date_begin], one=True) # :DEBUG:maethor:20120528: Bug possible car le titre n'est pas unique
@@ -214,7 +217,8 @@ def add_vote():
                 return redirect(url_for('edit_vote', voteid=vote['id']))
         else:
             flash(u'Vous devez spécifier un titre.', 'error')
-    return render_template('new_vote.html')
+    groups = query_db('select * from roles') 
+    return render_template('new_vote.html', groups=groups)
 
 @app.route('/votes/admin/edit/<voteid>', methods=['GET', 'POST'])
 def edit_vote(voteid):
@@ -223,10 +227,31 @@ def edit_vote(voteid):
     vote = query_db('select * from votes where id = ?', [voteid], one=True)
     if vote is None:
         abort(404)
-    #if request.method == 'POST':
-    # :TODO:maethor:20120528
+    if request.method == 'POST':
+        if request.form['title']:
+            # :TODO:maethor:120529: Calculer date_begin pour pouvoir y ajouter duration et obtenir date_end
+            transparent = 0
+            public = 0
+            if 'transparent' in request.form.keys():
+                transparent = 1
+            if 'public' in request.form.keys():
+                public = 1
+            isopen = 0
+            if request.form['status'] == 'Ouvert':
+                isopen = 1
+            g.db.execute('update votes set title = ?, description = ?, category = ?, is_transparent = ?, is_public = ?, is_open = ? where id = ?',
+                    [request.form['title'], request.form['description'], request.form['category'], transparent, public, isopen, voteid])
+            g.db.commit()
+            vote = query_db('select * from votes where id = ?', [voteid], one=True)
+            flash(u"Le vote a bien été mis à jour.", "success")
+        else:
+            flash(u'Vous devez spécifier un titre.', 'error')
+
+    # :TODO:maethor:20120529: Calculer la durée du vote (différence date_end - date_begin) 
+    vote['duration'] = 15
+    group = query_db('select name from roles where id = ?', [vote['id_role']], one=True) 
     choices = query_db('select * from choices where id_vote = ?', [voteid])
-    return render_template('edit_vote.html', vote=vote, choices=choices)
+    return render_template('edit_vote.html', vote=vote, group=group, choices=choices)
 
 @app.route('/votes/admin/addchoice/<voteid>', methods=['POST'])
 def add_choice(voteid):
index 5529a31..39f1170 100644 (file)
@@ -1,5 +1,6 @@
 drop table if exists choices;
 drop table if exists votes;
+drop table if exists roles;
 drop table if exists users;
 
 create table users (
@@ -12,6 +13,11 @@ create table users (
     key TEXT
 );
 
+create table roles (
+    id INTEGER primary key autoincrement,
+    name TEXT
+);
+
 create table votes (
     id INTEGER primary key autoincrement,
     title TEXT not null,
@@ -25,9 +31,9 @@ create table votes (
     is_weighted INTEGER default 0 not null,
     is_open INTEGER default 0 not null,
     id_author INTEGER, -- :COMMENT:maethor:120528: not null ?
-    --id_role INTEGER,
+    id_role INTEGER default 1 not null,
     FOREIGN KEY(id_author) REFERENCES users(id)
-    --FOREIGN KEY(id_role) REFERENCES role(id)
+    FOREIGN KEY(id_role) REFERENCES roles(id)
 );
 
 create table choices (
@@ -40,4 +46,7 @@ create table choices (
 -- Test data
 
 insert into users (email, password, name, organization, is_admin, key) values ("admin@admin.fr", "admin", "Toto (admin) Tata", "World corp", 1, "test");
+insert into roles (id, name) values (1, "Tous");
+insert into roles (name) values ("CA");
+insert into roles (name) values ("Members");
 
index 4319631..881b6d7 100644 (file)
@@ -15,7 +15,7 @@
       <div class="control-group">
         <label class="control-label" for="description">Description</label>
         <div class="controls">
-          <textarea class="input-xlarge" name="description" id="description" value="{{ vote.description }}"></textarea>
+          <textarea class="input-xlarge" name="description" id="description">{{ vote.description }}</textarea>
         </div>
       </div>
       <div class="accordion">
               <div class="control-group">
                 <label class="control-label" for="category">Catégorie</label>
                 <div class="controls">
-                  <input type="text" data-provide="typeahead" data-source='["ca","membres"]' size=30 name="category" id="category" value="{{ request.form.category }}" />
+                  <input type="text" data-provide="typeahead" data-source='["ca","membres"]' size=30 name="category" id="category" value="{{ vote.category }}" />
                 </div>
               </div>
               <div class="control-group">
                 <label class="control-label" for="role">Groupe</label>
                 <div class="controls">
                   <select name="role" id="role" disabled>
-                    <option selected>Tous</option>
-                    <option>CA</option>
-                    <option>Membres</option>
+                    <option>{{ group.name }}</option>
                   </select>
                   <p class="help-block">Groupe d'utilisateur concernés par le vote et ayant le droit de voter</p>
                 </div>
               </div>
-            </div>
-          </div>
-        </div>
-        <div class="accordion-group">
-          <div class="accordion-heading">
-            <a class="accordion-toggle" data-toggle="collapse" href="#options">+ Options</a>
-          </div>
-          <div id="options" class="accordion-body collapse">
-            <div class="accordion-inner">
               <div class="control-group">
                 <label class="control-label" for="days">Durée (jours)</label>
                 <div class="controls">
                   <select class="span1" name="days" id="days">
                     {% for i in range(1, 31) %}
-                    {% if i == 20 %}
+                    {% if i == vote.duration %}
                     <option selected>{{ i }}</option>
                     {% else %}
                     <option>{{ i }}</option>
                     {% endif %}
                     {% endfor %}
                   </select>
+                  <span class="help-inline">Du {{ vote.date_begin }} au {{ vote.date_end }}</span>
                 </div>
               </div>
+            </div>
+          </div>
+        </div>
+        <div class="accordion-group">
+          <div class="accordion-heading">
+            <a class="accordion-toggle" data-toggle="collapse" href="#options">+ Options</a>
+          </div>
+          <div id="options" class="accordion-body collapse">
+            <div class="accordion-inner">
               <div class="control-group">
                 <label class="control-label">Options</label>
                 <div class="controls">
                   <label class="checkbox">
-                    <input type="checkbox" name="transparent" />
+                    <input type="checkbox" name="transparent" {% if vote.is_transparent == 1 %} checked {% endif %} />
                     Les votants peuvent-ils voir le choix des autres ?
                   </label>
                   <label class="checkbox">
-                    <input type="checkbox" name="public" />
+                    <input type="checkbox" name="public" {% if vote.is_public == 1 %} checked {% endif %}/>
                     Le vote est-il visible par tous ?
                   </label>
-                  {% if not vote.is_open %}
                   <label class="checkbox">
-                    <input type="checkbox" name="multiplechoice" disabled/>
+                    <input type="checkbox" name="multiplechoice" {% if vote.is_multiplechoice == 1 %} checked {% endif %} disabled/>
                     Les votants peuvent-ils choisir plusieurs options ?
                   </label>
-                  {% endif %}
                 </div>
               </div>
             </div>
index 85d5b07..332195e 100644 (file)
@@ -1,7 +1,7 @@
 {% extends "layout.html" %}
 {% block body %}
 <div class="row">
-  <div class="span3 well">
+  <div class="span3 well offset1">
     <form action="{{ url_for('login') }}" method="post">
     <fieldset><legend>Connexion</legend>
       <label for="username">E-mail</label>
index 0adca60..dd24bce 100644 (file)
@@ -28,9 +28,9 @@
     <label class="control-label" for="role">Groupe</label>
     <div class="controls">
       <select name="role" id="role">
-        <option selected>Tous</option>
-        <option>CA</option>
-        <option>Membres</option>
+        {% for group in groups %}
+        <option>{{ group.name }}</option>
+        {% endfor %}
       </select>
       <p class="help-block">Groupe d'utilisateur concernés par le vote et ayant le droit de voter</p>
     </div>