Subversion Repositories Local Hare Voting

Rev

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