# HG changeset patch # User Paul Boddie # Date 1204423716 -3600 # Node ID dfc1fd6a3298cfc301e1c7901ed1a3acb243abd9 # Parent 0fb526c272ae67a595bcbb6d5fc82bd3f5cd94cb Switched to a single pickle file per poll, providing feedback to each user on their previous choices. Introduced lock usage to avoid potential concurrency issues. Added a time dependency. diff -r 0fb526c272ae -r dfc1fd6a3298 macros/VoteRecorder.py --- a/macros/VoteRecorder.py Sun Mar 02 02:04:56 2008 +0100 +++ b/macros/VoteRecorder.py Sun Mar 02 03:08:36 2008 +0100 @@ -9,37 +9,62 @@ counting, and the current state of the poll is not shown during voting. """ -from MoinMoin.util import filesys +from MoinMoin.util import filesys, lock from MoinMoin import wikiutil import os +try: + import cPickle as pickle +except ImportError: + import pickle -Dependencies = [] +Dependencies = ["time"] -def get_vote_pathname(page, name): +def get_vote_directory(page, name): votes_dir = page.getPagePath("poll") if not os.path.exists(votes_dir): filesys.makeDirs(votes_dir) + return votes_dir + +def get_vote_pathname(page, name): + votes_dir = get_vote_directory(page, name) filename = wikiutil.quoteWikinameFS(name) return os.path.join(votes_dir, filename) -def save_vote(page, poll_name, username, vote): - path = get_vote_pathname(page, username) - f = open(path, "a") +def get_lock_directory(page, name): + votes_dir = get_vote_directory(page, name) + return os.path.join(votes_dir, "__lock__") + +def save_votes(page, poll_name, votes): + vote_lock = lock.WriteLock(get_lock_directory(page, poll_name)) + vote_lock.acquire() try: - f.write(poll_name + "\t" + vote + "\n") + _save_votes(page, poll_name, votes) + finally: + vote_lock.release() + +def _save_votes(page, poll_name, votes): + path = get_vote_pathname(page, poll_name) + f = open(path, "wb") + try: + pickle.dump(votes, f) finally: f.close() -def get_votes(page, poll_name, username, vote): - path = get_vote_pathname(page, username) - f = open(path) +def get_all_votes(page, poll_name): + vote_lock = lock.ReadLock(get_lock_directory(page, poll_name)) + vote_lock.acquire() try: - voting = {} - for line in f.xreadlines(): - line = line.strip() - if line: - poll_name, vote = line.split("\t") - voting[poll_name] = vote + return _get_all_votes(page, poll_name) + finally: + vote_lock.release() + +def _get_all_votes(page, poll_name): + path = get_vote_pathname(page, poll_name) + if not os.path.exists(path): + return {} + f = open(path, "rb") + try: + voting = pickle.load(f) return voting finally: f.close() @@ -74,13 +99,15 @@ return ''.join(output) username = request.user.name + votes = get_all_votes(page, poll_name) # Handle any vote. if form and form.has_key("vote") and form.has_key("poll"): poll = form["poll"][0] if poll == poll_name: - save_vote(page, poll, username, form["vote"][0]) + votes[username] = int(form["vote"][0]) + save_votes(page, poll_name, votes) output.append(fmt.emphasis(on=1)) output.append(fmt.text("Vote submitted!")) output.append(fmt.emphasis(on=0)) @@ -97,14 +124,20 @@ output.append(fmt.rawHTML('
' % values)) output.append(fmt.rawHTML('' % values)) + for choice in choices: values["choice"] = choice + if votes.has_key(username) and choice <= votes[username]: + values["default_image"] = values["on_image"] + else: + values["default_image"] = values["off_image"] output.append( fmt.rawHTML(''' - + ''' % values)) + output.append(fmt.rawHTML('
')) return ''.join(output)