1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - VoteRecorder Macro 4 5 @copyright: 2008 by Paul Boddie <paul@boddie.org.uk> 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 8 This is like the VotingStars macro except that votes are logged for later 9 counting, and the current state of the poll is not shown during voting. 10 """ 11 12 from MoinMoin.util import filesys 13 from MoinMoin import wikiutil 14 import os 15 16 Dependencies = [] 17 18 def get_vote_pathname(page, name): 19 votes_dir = page.getPagePath("poll") 20 if not os.path.exists(votes_dir): 21 filesys.makeDirs(votes_dir) 22 filename = wikiutil.quoteWikinameFS(name) 23 return os.path.join(votes_dir, filename) 24 25 def save_vote(page, poll_name, username, vote): 26 path = get_vote_pathname(page, username) 27 f = open(path, "a") 28 try: 29 f.write(poll_name + "\t" + vote + "\n") 30 finally: 31 f.close() 32 33 def get_votes(page, poll_name, username, vote): 34 path = get_vote_pathname(page, username) 35 f = open(path) 36 try: 37 voting = {} 38 for line in f.xreadlines(): 39 line = line.strip() 40 if line: 41 poll_name, vote = line.split("\t") 42 voting[poll_name] = vote 43 return voting 44 finally: 45 f.close() 46 47 def execute(macro, args): 48 request = macro.request 49 form = macro.form 50 fmt = macro.formatter 51 page = fmt.page 52 53 output = [] 54 55 # Obtain the poll name for presentation purposes. 56 57 args = args.split(",") 58 if args: 59 poll_name = args[0] 60 else: 61 output.append(fmt.sysmsg(on=1)) 62 output.append(fmt.text("Please specify a poll name!")) 63 output.append(fmt.sysmsg(on=0)) 64 return ''.join(output) 65 66 # Show a message if the user is not logged in. 67 68 # Get the user, if known. 69 70 if not request.user.valid: 71 output.append(fmt.emphasis(on=1)) 72 output.append(fmt.text("Please log in to vote!")) 73 output.append(fmt.emphasis(on=0)) 74 return ''.join(output) 75 76 username = request.user.name 77 78 # Handle any vote. 79 80 if form and form.has_key("vote") and form.has_key("poll"): 81 poll = form["poll"][0] 82 if poll == poll_name: 83 save_vote(page, poll, username, form["vote"][0]) 84 output.append(fmt.emphasis(on=1)) 85 output.append(fmt.text("Vote submitted!")) 86 output.append(fmt.emphasis(on=0)) 87 return ''.join(output) 88 89 # Show the choices. 90 91 values = { 92 "poll" : poll_name, "url" : page.url(request), 93 "on_image" : '/wiki/modern/img/star_on.png', 94 "off_image" : '/wiki/modern/img/star_off.png' 95 } 96 choices = range(1, 6) 97 98 output.append(fmt.rawHTML('<form method="get" name="%(poll)s" action="%(url)s#%(poll)s">' % values)) 99 output.append(fmt.rawHTML('<input type="hidden" name="poll" value="%(poll)s">' % values)) 100 for choice in choices: 101 values["choice"] = choice 102 output.append( 103 fmt.rawHTML(''' 104 <input type="image" name="vote" value="%(choice)s" src="%(off_image)s" 105 onmouseover="this.src='%(on_image)s'" 106 onmouseout="this.src='%(off_image)s'"> 107 ''' % values)) 108 output.append(fmt.rawHTML('</form>')) 109 110 return ''.join(output) 111 112 # vim: tabstop=4 expandtab shiftwidth=4