summaryrefslogtreecommitdiff
path: root/python/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/server.py')
-rw-r--r--python/server.py198
1 files changed, 0 insertions, 198 deletions
diff --git a/python/server.py b/python/server.py
deleted file mode 100644
index 7551a092..00000000
--- a/python/server.py
+++ /dev/null
@@ -1,198 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from __future__ import print_function
-
-import ledger
-import cgi
-import sys
-import types
-import posixpath
-import urllib
-import shutil
-import os
-import re
-
-from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
-from os.path import exists, join, isfile
-
-from Cheetah.Template import Template
-from Cheetah.Filters import Filter, WebSafe
-
-webroot = join(os.getcwd(), 'python', 'res')
-
-class UnicodeFilter(Filter):
- def filter(self, s, **kargs):
- return Filter.filter(self, s, str=unicode, **kargs)
-
-def strip(value):
- #return re.sub('\n', '<br />', value.strip_annotations().to_string())
- return value.strip_annotations().to_string()
-
-templateDef = '''#encoding utf-8
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>$title</title>
- <link rel="stylesheet" href="/style.css" type="text/css" media="print, projection, screen" />
- <script type="text/javascript" src="/jquery-latest.js"></script>
- <script type="text/javascript" src="/jquery.tablesorter.min.js"></script>
- <script type="text/javascript" src="/jquery.tablesorter.pager.js"></script>
- <script type="text/javascript" src="/jquery.dimensions.min.js"></script>
- <script type="text/javascript">
- \$(function() {
- \$("table")
- .tablesorter({textExtraction: 'complex',
- widthFixed: true,
- widgets: ['zebra']})
- .tablesorterPager({size: 100,
- container: \$("\#pager")});
- });
- </script>
- </head>
- <body>
- <div id="main">
- <h1>Register report</h1>
- <table id="register" cellspacing="1" class="tablesorter">
- <thead>
- <tr>
- <th>Date</th>
- <th>Payee</th>
- <th>Account</th>
- <th>Amount</th>
- <th>Total</th>
- </tr>
- </thead>
- <tfoot>
- <tr>
- <th>Date</th>
- <th>Payee</th>
- <th>Account</th>
- <th>Amount</th>
- <th>Total</th>
- </tr>
- </tfoot>
- <tbody>
- #for $post in $posts
- #set $total = $total + $post.amount
- <tr>
- <!--<td>${$post.xact.date if $post.xact is not $last_xact else $empty}</td>
- <td>${$post.xact.payee if $post.xact is not $last_xact else $empty}</td>-->
- <td>$post.xact.date</td>
- <td>$post.xact.payee</td>
- <td>$post.account</td>
- <td>${strip($post.amount)}</td>
- <td>${strip($total)}</td>
- </tr>
- #set $last_xact = $post.xact
- #end for
- </tbody>
- </table>
- <div id="pager" class="pager">
- <form>
- <img src="/icons/first.png" class="first"/>
- <img src="/icons/prev.png" class="prev"/>
- <input type="text" class="pagedisplay"/>
- <img src="/icons/next.png" class="next"/>
- <img src="/icons/last.png" class="last"/>
- <select class="pagesize">
- <option selected="selected" value="40">40</option>
- <option value="100">100</option>
- <option value="200">200</option>
- <option value="300">300</option>
- </select>
- </form>
- </div>
- </body>
- </html>
-'''
-
-class LedgerHandler(BaseHTTPRequestHandler):
- def __init__(self, *args):
- self.journal = ledger.Journal(sys.argv[1])
- BaseHTTPRequestHandler.__init__(self, *args)
-
- def do_GET(self):
- path = self.translate_path(self.path)
-
- if path and exists(path) and isfile(path):
- self.copyfile(open(path), self.wfile)
- else:
- tmpl = Template(templateDef, filter=UnicodeFilter)
-
- tmpl.title = 'Ledger Journal'
- tmpl.posts = self.journal.collect(sys.argv[2])
- tmpl.total = ledger.Value(0)
- tmpl.strip = strip
- tmpl.last_xact = None
- tmpl.empty = ""
-
- html = unicode(tmpl)
- html = html.encode('utf-8')
- self.wfile.write(html)
-
- def do_POST(self):
- print("Saw a POST request!")
- try:
- ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
- if ctype == 'multipart/form-data':
- query = cgi.parse_multipart(self.rfile, pdict)
- self.send_response(301)
- self.end_headers()
- except Exception:
- print("Saw exception in POST handler")
-
- # This code is straight from SimpleHTTPServer.py
- def copyfile(self, source, outputfile):
- """Copy all data between two file objects.
-
- The SOURCE argument is a file object open for reading
- (or anything with a read() method) and the DESTINATION
- argument is a file object open for writing (or
- anything with a write() method).
-
- The only reason for overriding this would be to change
- the block size or perhaps to replace newlines by CRLF
- -- note however that this the default server uses this
- to copy binary data as well.
-
- """
- shutil.copyfileobj(source, outputfile)
-
- def translate_path(self, path):
- """Translate a /-separated PATH to the local filename syntax.
-
- Components that mean special things to the local file system
- (e.g. drive or directory names) are ignored. (XXX They should
- probably be diagnosed.)
-
- """
- # abandon query parameters
- path = path.split('?',1)[0]
- path = path.split('#',1)[0]
- path = posixpath.normpath(urllib.unquote(path))
- words = path.split('/')
- words = filter(None, words)
- path = webroot
- for word in words:
- drive, word = os.path.splitdrive(word)
- head, word = os.path.split(word)
- if word in (os.curdir, os.pardir): continue
- path = os.path.join(path, word)
- return path
-
-def main(*args):
- try:
- port = 9000
- server = HTTPServer(('', port), LedgerHandler)
- print("Local HTTP server listening on port %d... (Control-C to exit)" \
- % port)
- server.serve_forever()
- except KeyboardInterrupt:
- print("Shutting down server")
- server.socket.close()
-
-if __name__ == '__main__':
- if len(sys.argv) < 3:
- print("usage: server.py <DATA-FILE> <REPORT-QUERY>")
- sys.exit(1)
- main()