diff options
| author | ubq323 <ubq323> | 2021-06-29 00:30:02 +0000 | 
|---|---|---|
| committer | ubq323 <ubq323> | 2021-06-29 00:30:02 +0000 | 
| commit | fecd96342a07589f71cac6fc1d28e2f6d3240cbf (patch) | |
| tree | ba63731206249cce530d937aaa18820c868925aa | |
| parent | edbd48340de9add59bcf34f312ae036adae8dcfd (diff) | |
retraction of votes
| -rw-r--r-- | apioforum/templates/view_thread.html | 8 | ||||
| -rw-r--r-- | apioforum/thread.py | 25 | 
2 files changed, 28 insertions, 5 deletions
diff --git a/apioforum/templates/view_thread.html b/apioforum/templates/view_thread.html index b999658..7bf253d 100644 --- a/apioforum/templates/view_thread.html +++ b/apioforum/templates/view_thread.html @@ -64,8 +64,16 @@          <legend>poll: {{poll.title}}</legend>          <p>if you want, you can submit a vote along with this post. if you have previously voted             on this poll, your previous vote will be changed</p> +          <input type="radio" id="dontvote" name="poll" value="dontvote" checked>          <label for="dontvote">do not submit any vote at the moment</label> + +        {% if has_voted %} +        <br> +        <input type="radio" id="retractvote" name="poll" value="retractvote"> +        <label for="retractvote">retract my vote, and go back to having no vote on this poll</label> +        {% endif %} +          {% for opt in poll.options %}              <br>              <input type="radio" id="option_{{opt.option_idx}}" name="poll" value="{{opt.option_idx}}"> diff --git a/apioforum/thread.py b/apioforum/thread.py index ec50b3b..ce451ab 100644 --- a/apioforum/thread.py +++ b/apioforum/thread.py @@ -47,6 +47,12 @@ def view_thread(thread_id):              for post in posts:                  if post['vote'] is not None:                      votes[post['id']] = db.execute("SELECT * FROM votes WHERE id = ?",(post['vote'],)).fetchone() + +        if g.user is None: +            has_voted = None +        else: +            v = db.execute("SELECT * FROM votes WHERE poll = ? AND user = ? AND current AND NOT is_retraction;",(poll['id'],g.user)).fetchone() +            has_voted = v is not None          return render_template(              "view_thread.html", @@ -54,13 +60,21 @@ def view_thread(thread_id):              thread=thread,              tags=tags,              poll=poll, -            votes=votes +            votes=votes, +            has_voted=has_voted,          )  def register_vote(thread,pollval):      if pollval is None or pollval == 'dontvote':          return -    option_idx = int(pollval) +         +    is_retraction = pollval == 'retractvote' + +    if is_retraction: +        option_idx = None +    else: +        option_idx = int(pollval) +              db = get_db()      cur = db.cursor()      cur.execute(""" @@ -68,10 +82,11 @@ def register_vote(thread,pollval):          SET current = 0          WHERE poll = ? AND user = ?;      """,(thread['poll'],g.user)) +      cur.execute(""" -        INSERT INTO votes (user,poll,option_idx,time,current) -        VALUES (?,?,?,current_timestamp,1); -        """,(g.user,thread['poll'],option_idx)) +        INSERT INTO votes (user,poll,option_idx,time,current,is_retraction) +        VALUES (?,?,?,current_timestamp,1,?); +        """,(g.user,thread['poll'],option_idx,is_retraction))      vote_id = cur.lastrowid      return vote_id  | 
