Subversion Repositories Remote Hare Voting

Rev

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

Rev Author Line No. Line
5 jtkorb 1
#!/p/python/python
15 jtkorb 2
 
5 jtkorb 3
import cgi
4
import string
5
import sys
6
 
15 jtkorb 7
import revision
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>
26
        <input type=submit name="run1" value="Run 1 Time">
27
        <input type=submit name="run1000" value="Run 1000 Times">
28
    </form>
29
    <p>
30
Input file format is given
31
<a href="http://www.bikmort.com/wiki/index.php?title=Hare_Voting_Procedure">here</a>.
32
Almost no error checking is done, so be sure to review the trace output.
33
The source code is available <a href="%s?fetch=yes">here</a>.
34
<p>
35
<small>%s</small>
36
<hr>
37
<pre>
15 jtkorb 38
""" % (formaction, formaction, revision.revision))
5 jtkorb 39
    return
40
 
41
def emitPostHTML():
42
    emitHTML("""</pre>
43
</body>
44
</html>
45
""")
46
    return
47
 
48
def emitHTML(s):
49
    global fHTML
50
    if fHTML: print s
51
    return
52
 
35 jtkorb 53
def main(argv=None):
54
    if argv is None:
55
        argv = sys.argv
56
 
5 jtkorb 57
    emitPreHTML(formaction)
58
 
59
    form = cgi.FieldStorage()
60
 
61
    if not form:
62
        emitHTML("Enter file name and press a button to see results.")
63
    elif form.has_key("fetch"):
21 jtkorb 64
        filename = string.replace(formaction, "vote.py", "tally.py")
65
        source = open(filename).read()
66
        print cgi.escape(source)
5 jtkorb 67
    elif not form.has_key("name"):
68
        emitHTML("Error: no file received")
69
    elif not form["name"].filename:
70
        emitHTML("Error: file name missing")
71
    else:
72
        name = form["name"].filename
73
        contents = form["name"].value
74
 
21 jtkorb 75
        tally.trace("INPUT FILE")
76
        tally.trace(contents)
5 jtkorb 77
 
15 jtkorb 78
        nWinners, ballots = parseinput.parsestring(contents)
21 jtkorb 79
        if form.has_key("run1"):
80
            results = tally.dotally(nWinners, ballots)
81
            print "\nFINAL RESULTS"
82
            for winner in results:
83
                print "\t%s" % winner
84
        elif form.has_key("run1000"):
85
            print "RUNNING 1000 TIMES"
86
            tally.fTrace = 0
87
            summary = {}
88
            for i in range(1000):
89
                results = str(tally.dotally(nWinners, ballots))
90
                # print "Run %2d: %s" % (i+1, results)
91
                if not summary.has_key(results):
92
                    summary[results] = 0
93
                summary[results] = summary[results] + 1
94
            print "\nSUMMARY"
95
            l = summary.items()
96
            l.sort(lambda x,y: cmp(y[1], x[1]))
97
            for pair in l:
98
                print "%2d %s" % (pair[1], pair[0])
99
        else:
100
            print "UNEXPECTED SUBMIT BUTTON: %s" % form
101
 
5 jtkorb 102
    emitPostHTML()
103
    return
104
 
15 jtkorb 105
if __name__=='__main__':
106
    main()