Subversion Repositories Remote Hare Voting

Rev

Rev 54 | Rev 63 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
37 jtkorb 1
#!/p/python-2.5.1/bin/python
15 jtkorb 2
 
39 jtkorb 3
import optparse
5 jtkorb 4
import cgi
5
import string
6
import sys
7
 
15 jtkorb 8
import parseinput
9
import tally
7 jtkorb 10
 
15 jtkorb 11
fHTML = 1
5 jtkorb 12
formaction = string.split(sys.argv[0],"/")[-1]
13
 
14
def emitPreHTML(formaction):
15
    emitHTML("""Content-type: text/html\n
16
<html>
17
<body>
18
<title>Hare Ballot Calculation</title>
19
    <h1>Hare Ballot Calculation</h1>
20
    <form enctype="multipart/form-data" method=POST action=%s>
21
        <table>
22
        <tr><td>CSV file of ballots:
23
                <td><input type=file size=70 name=name>
24
        </table>
25
        <p>
62 jtkorb 26
        <input type=submit name="run1" value="Run">
5 jtkorb 27
    </form>
28
    <p>
29
Input file format is given
30
<a href="http://www.bikmort.com/wiki/index.php?title=Hare_Voting_Procedure">here</a>.
62 jtkorb 31
Little error checking is done, so be sure to review the trace output.
5 jtkorb 32
The source code is available <a href="%s?fetch=yes">here</a>.
33
<p>
34
<small>%s</small>
35
<hr>
36
<pre>
54 jtkorb 37
""" % (formaction, formaction, "$Id: vote.py 62 2007-09-24 13:57:27Z jtkorb $"))
5 jtkorb 38
    return
39
 
40
def emitPostHTML():
41
    emitHTML("""</pre>
42
</body>
43
</html>
44
""")
45
    return
46
 
47
def emitHTML(s):
48
    global fHTML
49
    if fHTML: print s
50
    return
51
 
38 jtkorb 52
def doone(nWinners, ballots):
53
    results = tally.dotally(nWinners, ballots)
45 jtkorb 54
    tally.fTrace = 1
55
    tally.trace("\nFINAL RESULTS")
38 jtkorb 56
    for winner in results:
45 jtkorb 57
        tally.trace("\t%s" % winner)
38 jtkorb 58
 
39 jtkorb 59
def domany(nTimes, nWinners, ballots):
60
    tally.fTrace = 0
61
    summary = {}
62
    for i in range(nTimes):
63
        results = str(tally.dotally(nWinners, ballots))
64
        if not summary.has_key(results):
65
            summary[results] = 0
66
        summary[results] = summary[results] + 1
45 jtkorb 67
    tally.fTrace = 1
68
    tally.trace("SUMMARY AFTER %d TIMES" % nTimes)
39 jtkorb 69
    l = summary.items()
70
    l.sort(lambda x,y: cmp(y[1], x[1]))
71
    for pair in l:
45 jtkorb 72
        tally.trace("%3d %s" % (pair[1], pair[0]))
39 jtkorb 73
 
74
def doweb():
5 jtkorb 75
    emitPreHTML(formaction)
76
    form = cgi.FieldStorage()
77
 
78
    if not form:
79
        emitHTML("Enter file name and press a button to see results.")
80
    elif form.has_key("fetch"):
21 jtkorb 81
        filename = string.replace(formaction, "vote.py", "tally.py")
82
        source = open(filename).read()
83
        print cgi.escape(source)
5 jtkorb 84
    elif not form.has_key("name"):
85
        emitHTML("Error: no file received")
86
    elif not form["name"].filename:
87
        emitHTML("Error: file name missing")
88
    else:
89
        name = form["name"].filename
90
        contents = form["name"].value
91
 
21 jtkorb 92
        tally.trace("INPUT FILE")
93
        tally.trace(contents)
5 jtkorb 94
 
15 jtkorb 95
        nWinners, ballots = parseinput.parsestring(contents)
21 jtkorb 96
        if form.has_key("run1"):
38 jtkorb 97
            doone(nWinners, ballots)
21 jtkorb 98
        else:
99
            print "UNEXPECTED SUBMIT BUTTON: %s" % form
100
 
5 jtkorb 101
    emitPostHTML()
102
    return
103
 
39 jtkorb 104
def main():
105
    usage = "usage: %prog [options] filename.csv"
106
    parser = optparse.OptionParser(usage)
107
    (options, args) = parser.parse_args()
108
 
109
    if len(args) == 0:
110
        doweb()
38 jtkorb 111
    else:
39 jtkorb 112
        nWinners, ballots = parseinput.parsefile(args[0])
62 jtkorb 113
        doone(nWinners, ballots)
38 jtkorb 114
 
15 jtkorb 115
if __name__=='__main__':
39 jtkorb 116
    main()