1.1 --- a/macros/VoteRecorder.py Sun Mar 02 02:04:56 2008 +0100
1.2 +++ b/macros/VoteRecorder.py Sun Mar 02 03:08:36 2008 +0100
1.3 @@ -9,37 +9,62 @@
1.4 counting, and the current state of the poll is not shown during voting.
1.5 """
1.6
1.7 -from MoinMoin.util import filesys
1.8 +from MoinMoin.util import filesys, lock
1.9 from MoinMoin import wikiutil
1.10 import os
1.11 +try:
1.12 + import cPickle as pickle
1.13 +except ImportError:
1.14 + import pickle
1.15
1.16 -Dependencies = []
1.17 +Dependencies = ["time"]
1.18
1.19 -def get_vote_pathname(page, name):
1.20 +def get_vote_directory(page, name):
1.21 votes_dir = page.getPagePath("poll")
1.22 if not os.path.exists(votes_dir):
1.23 filesys.makeDirs(votes_dir)
1.24 + return votes_dir
1.25 +
1.26 +def get_vote_pathname(page, name):
1.27 + votes_dir = get_vote_directory(page, name)
1.28 filename = wikiutil.quoteWikinameFS(name)
1.29 return os.path.join(votes_dir, filename)
1.30
1.31 -def save_vote(page, poll_name, username, vote):
1.32 - path = get_vote_pathname(page, username)
1.33 - f = open(path, "a")
1.34 +def get_lock_directory(page, name):
1.35 + votes_dir = get_vote_directory(page, name)
1.36 + return os.path.join(votes_dir, "__lock__")
1.37 +
1.38 +def save_votes(page, poll_name, votes):
1.39 + vote_lock = lock.WriteLock(get_lock_directory(page, poll_name))
1.40 + vote_lock.acquire()
1.41 try:
1.42 - f.write(poll_name + "\t" + vote + "\n")
1.43 + _save_votes(page, poll_name, votes)
1.44 + finally:
1.45 + vote_lock.release()
1.46 +
1.47 +def _save_votes(page, poll_name, votes):
1.48 + path = get_vote_pathname(page, poll_name)
1.49 + f = open(path, "wb")
1.50 + try:
1.51 + pickle.dump(votes, f)
1.52 finally:
1.53 f.close()
1.54
1.55 -def get_votes(page, poll_name, username, vote):
1.56 - path = get_vote_pathname(page, username)
1.57 - f = open(path)
1.58 +def get_all_votes(page, poll_name):
1.59 + vote_lock = lock.ReadLock(get_lock_directory(page, poll_name))
1.60 + vote_lock.acquire()
1.61 try:
1.62 - voting = {}
1.63 - for line in f.xreadlines():
1.64 - line = line.strip()
1.65 - if line:
1.66 - poll_name, vote = line.split("\t")
1.67 - voting[poll_name] = vote
1.68 + return _get_all_votes(page, poll_name)
1.69 + finally:
1.70 + vote_lock.release()
1.71 +
1.72 +def _get_all_votes(page, poll_name):
1.73 + path = get_vote_pathname(page, poll_name)
1.74 + if not os.path.exists(path):
1.75 + return {}
1.76 + f = open(path, "rb")
1.77 + try:
1.78 + voting = pickle.load(f)
1.79 return voting
1.80 finally:
1.81 f.close()
1.82 @@ -74,13 +99,15 @@
1.83 return ''.join(output)
1.84
1.85 username = request.user.name
1.86 + votes = get_all_votes(page, poll_name)
1.87
1.88 # Handle any vote.
1.89
1.90 if form and form.has_key("vote") and form.has_key("poll"):
1.91 poll = form["poll"][0]
1.92 if poll == poll_name:
1.93 - save_vote(page, poll, username, form["vote"][0])
1.94 + votes[username] = int(form["vote"][0])
1.95 + save_votes(page, poll_name, votes)
1.96 output.append(fmt.emphasis(on=1))
1.97 output.append(fmt.text("Vote submitted!"))
1.98 output.append(fmt.emphasis(on=0))
1.99 @@ -97,14 +124,20 @@
1.100
1.101 output.append(fmt.rawHTML('<form method="get" name="%(poll)s" action="%(url)s#%(poll)s">' % values))
1.102 output.append(fmt.rawHTML('<input type="hidden" name="poll" value="%(poll)s">' % values))
1.103 +
1.104 for choice in choices:
1.105 values["choice"] = choice
1.106 + if votes.has_key(username) and choice <= votes[username]:
1.107 + values["default_image"] = values["on_image"]
1.108 + else:
1.109 + values["default_image"] = values["off_image"]
1.110 output.append(
1.111 fmt.rawHTML('''
1.112 -<input type="image" name="vote" value="%(choice)s" src="%(off_image)s"
1.113 - onmouseover="this.src='%(on_image)s'"
1.114 - onmouseout="this.src='%(off_image)s'">
1.115 + <input type="image" name="vote" value="%(choice)s" src="%(default_image)s"
1.116 + onmouseover="this.src='%(on_image)s'"
1.117 + onmouseout="this.src='%(default_image)s'">
1.118 ''' % values))
1.119 +
1.120 output.append(fmt.rawHTML('</form>'))
1.121
1.122 return ''.join(output)