summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--__init__.py1
-rw-r--r--controller.py19
-rw-r--r--helper.py16
-rwxr-xr-xindex.py26
-rw-r--r--renderer.py40
-rw-r--r--static/css/style.css275
-rw-r--r--templates/404.mako7
-rw-r--r--templates/menu.mako5
-rw-r--r--templates/page.mako46
-rw-r--r--templates/pages/index.mako49
-rw-r--r--templates/root.mako61
12 files changed, 547 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..034ed13
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.pyc
+.*.sw?
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..c3189d1
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1 @@
+from index import app
diff --git a/controller.py b/controller.py
new file mode 100644
index 0000000..e4c07f7
--- /dev/null
+++ b/controller.py
@@ -0,0 +1,19 @@
+from __future__ import with_statement
+
+import web
+from helper import appdir
+from renderer import render
+
+class Page:
+ """
+ All the general and simple pages.
+ """
+ def GET(self, name = '/'):
+ if not name or name == '/': name = 'index'
+ return render(name)
+
+def FourOhFour(page="?"):
+ """
+ 404 error page.
+ """
+ return web.notfound(render("404", level = "", page = page))
diff --git a/helper.py b/helper.py
new file mode 100644
index 0000000..69d6ab2
--- /dev/null
+++ b/helper.py
@@ -0,0 +1,16 @@
+import web
+import os
+import cStringIO
+
+opj = os.path.join
+
+# some nice imports
+import itertools as it
+
+
+APPDIR = os.path.dirname(os.path.abspath(__file__))
+def appdir (*args):
+ return os.path.join(APPDIR, *args)
+
+def url (path):
+ return "\"%s\"" % web.url(path)
diff --git a/index.py b/index.py
new file mode 100755
index 0000000..b91418d
--- /dev/null
+++ b/index.py
@@ -0,0 +1,26 @@
+#!/usr/bin/python
+
+import web
+import controller
+
+#
+# URL Mappings
+#
+urls = (
+ "/r/(.*)", controller.Redirect,
+ "/(.*)", controller.Page
+ )
+
+#
+# The App
+#
+app = web.application(urls, globals())
+app.notfound = controller.FourOhFour
+
+# debug for the moment
+web.config.debug = True
+
+#
+# And go!
+if __name__ == "__main__":
+ app.run()
diff --git a/renderer.py b/renderer.py
new file mode 100644
index 0000000..b8ce716
--- /dev/null
+++ b/renderer.py
@@ -0,0 +1,40 @@
+import os
+import web
+import mako
+from mako.lookup import TemplateLookup
+
+import helper
+
+class Renderer:
+ """
+ Renderer loading the correct Mako Templates
+ """
+ def __init__ (self):
+ self.lookup = TemplateLookup(
+ directories=[helper.appdir('templates')],
+ module_directory = "/tmp/webpy/kosten/",
+ input_encoding='utf-8',
+ output_encoding='utf-8',
+ format_exceptions = True)
+
+ def render (self, tpl, level = "pages" , **kwargs):
+ try:
+ t = self.get_tpl(tpl, level)
+ except mako.exceptions.TopLevelLookupException, e:
+ raise web.ctx.app_stack[-1].notfound(tpl)
+
+ return t.render(h = helper, url = helper.url, w = web, _hl = highlighting, **kwargs)
+
+ __call__ = render
+
+ def get_tpl (self, tpl, level):
+ return self.lookup.get_template(self.get_tpl_name(tpl, level))
+
+ def get_tpl_name (self, tpl, level):
+ if not tpl.endswith(".mako"):
+ tpl = tpl+".mako"
+
+ return os.path.join(level, tpl)
+
+# the one and only instance :)
+render = Renderer()
diff --git a/static/css/style.css b/static/css/style.css
new file mode 100644
index 0000000..26973a7
--- /dev/null
+++ b/static/css/style.css
@@ -0,0 +1,275 @@
+/*
+Design by Free CSS Templates
+http://www.freecsstemplates.org
+Released for free under a Creative Commons Attribution 2.5 License
+*/
+
+body {
+ margin: 0;
+ padding: 0;
+ background: #000000;
+ font-size: 13px;
+ font-family: "Trebuchet MS", Georgia, "Times New Roman", Times, serif;
+ text-align: justify;
+ color: #FFFFFF;
+}
+
+
+h1, h2, h3 {
+ margin: 0;
+ text-transform: lowercase;
+ font-weight: normal;
+ color: #FFFFFF;
+}
+
+h1 {
+ letter-spacing: -1px;
+ font-size: 32px;
+}
+
+h2 {
+ font-size: 23px;
+}
+
+h3 {
+ font-size: 18px;
+}
+
+p, ul, ol {
+ text-align: justify;
+ line-height: 20px;
+}
+
+p + h2, p + h3 {
+ margin-top: 1.5em;
+}
+
+a:link {
+ color: #8BD80E;
+}
+
+a:hover, a:active {
+ text-decoration: none;
+ color: #8BD80E;
+}
+
+a:visited {
+ color: #8BD80E;
+}
+
+img {
+ border: none;
+}
+
+img.left {
+ float: left;
+ margin-right: 15px;
+}
+
+img.right {
+ float: right;
+ margin-left: 15px;
+}
+
+/* Header */
+
+#header {
+ width: 713px;
+ margin: 0 auto;
+ height: 42px;
+}
+
+#wrapper {
+ margin: 0;
+ padding: 0;
+ background: #FFFFFF url(../images/img01.gif) repeat-x left top;
+}
+
+/* Menu */
+
+#menu {
+ float: left;
+ width: 713px;
+ height: 50px;
+ background: url(../images/img02.gif) no-repeat left top;
+}
+
+#menu ul {
+ margin: 0;
+ padding: 0px 0 0 10px;
+ list-style: none;
+ line-height: normal;
+}
+
+#menu li {
+ display: block;
+ float: left;
+}
+
+#menu a {
+ display: block;
+ float: left;
+ background: url(../images/img04.gif) no-repeat right 55%;
+ margin-top: 5px;
+ margin-right: 3px;
+ padding: 8px 17px;
+ text-decoration: none;
+ font-size: 13px;
+ color: #000000;
+}
+
+#menu a:hover {
+ color: #000000;
+}
+
+#menu .current_page_item a {
+ color: #000000;
+}
+
+/** LOGO */
+
+#logo {
+ width: 713px;
+ height: 80px;
+ margin: 0 auto;
+}
+
+#logo h1, #logo h2, #logo img {
+ float: left;
+ margin: 0;
+ padding: 30px 0 0 0px;
+ line-height: normal;
+}
+
+#logo img {
+ float: left;
+ margin-right: 15px;
+ padding: 30px 0 0 0px;
+}
+
+#logo h1 {
+ font-family: Georgia, "Times New Roman", Times, serif;
+ font-size:40px;
+}
+
+#logo h1 a {
+ text-decoration: none;
+ color: #4C4C4C;
+}
+
+#logo h1 a:hover { text-decoration: underline; }
+
+#logo h2 {
+ float: left;
+ padding: 45px 0 0 18px;
+ font: 18px Georgia, "Times New Roman", Times, serif;
+ color: #8BD80E;
+}
+
+#logo p a {
+ text-decoration: none;
+ color: #8BD80E;
+}
+
+#logo p a:hover { text-decoration: underline; }
+
+/* Page */
+
+#page {
+ width: 663px;
+ margin: 0 auto;
+ background: #4C4C4C url(../images/img03.gif) no-repeat left bottom;
+ padding: 0 25px;
+}
+
+/* Post */
+
+.content {
+ float: left;
+ width: 620px;
+ padding: 15px 0px;
+ margin-bottom: 20px;
+}
+
+.content .title {
+ margin-bottom: 20px;
+ padding-bottom: 5px;
+}
+
+.content h2, .content h3 {
+ margin-bottom: 0.5em;
+}
+
+.hstart {
+ font: 18px Georgia, "Times New Roman", Times, serif;
+ color: #8BD80E;
+}
+
+/* Boxes */
+
+.box {
+ background: #9e9e9e;
+ color: #000;
+ padding: 5px;
+ margin: 0.5em 0.5em 2em 0.5em;
+}
+
+.box h2, .box h3 {
+ margin-bottom: 15px;
+ font-size: 16px;
+ color: #FFFFFF;
+}
+
+.box ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.box a:link, .box a:hover, .box a:active, .box a:visited {
+ color: #EDEDED;
+}
+
+.box > pre {
+ margin: 0;
+ padding: 0;
+ overflow: auto;
+}
+
+/* Table of contents */
+
+ul#toc {
+}
+
+.tocLink {
+}
+
+/* Footer */
+#footer-wrap {
+}
+
+#footer {
+ margin: 0 auto;
+ padding: 20px 0 10px 0;
+ background: #000000;
+}
+
+html>body #footer {
+ height: auto;
+}
+
+#footer p {
+ font-size: 11px;
+}
+
+#legal {
+ clear: both;
+ padding-top: 17px;
+ text-align: center;
+ color: #FFFFFF;
+}
+
+#legal a {
+ font-weight: normal;
+ color: #FFFFFF;
+}
diff --git a/templates/404.mako b/templates/404.mako
new file mode 100644
index 0000000..aeb95e3
--- /dev/null
+++ b/templates/404.mako
@@ -0,0 +1,7 @@
+<%!
+ title = "404 -- Page not found!"
+%>
+<%inherit file="/page.mako" />
+<p>
+Sorry - the requested page <i>${page}</i> cannot be found.
+</p>
diff --git a/templates/menu.mako b/templates/menu.mako
new file mode 100644
index 0000000..64701b2
--- /dev/null
+++ b/templates/menu.mako
@@ -0,0 +1,5 @@
+<%!
+ menu = [
+ ("/index", "Kosten"),
+ ]
+%>
diff --git a/templates/page.mako b/templates/page.mako
new file mode 100644
index 0000000..aa2aa51
--- /dev/null
+++ b/templates/page.mako
@@ -0,0 +1,46 @@
+<%!
+ title = ""
+ uses_toc = False
+%>
+<%
+ page_text = capture(next.body)
+%>
+
+<%inherit file="/root.mako" />
+
+## content
+
+<h1 class="title">${self.attr.title}</h1>
+% if self.attr.uses_toc:
+ ${self.preface()}
+ ${self.toc()}
+% endif
+
+${page_text}
+
+## functions
+
+<%def name="h2(tag='h2')">
+ <%
+ if self.attr.uses_toc:
+ c = capture(caller.body)
+ name = c.replace(" ", "_").replace("/", "_").lower()
+ tlist = getattr(self.attr, "tlist", [])
+ tlist.append((str(name), str(c)))
+
+ self.attr.tlist = tlist
+ else:
+ name = "#"
+ %>
+ <${tag}><a name="${name}"><span class="hstart">» </span></a>${caller.body()}</${tag}>
+</%def>
+
+<%def name="toc()">
+ <ul id="toc">
+ % for url, name in self.attr.tlist:
+ <li><a class="tocLink" href="#${url}">${name}</a></li>
+ % endfor
+ </ul>
+</%def>
+
+<%def name="preface()"></%def>
diff --git a/templates/pages/index.mako b/templates/pages/index.mako
new file mode 100644
index 0000000..8ce483e
--- /dev/null
+++ b/templates/pages/index.mako
@@ -0,0 +1,49 @@
+<%!
+ title = "Portato"
+%>
+<%inherit file="/page.mako" />
+
+<p>
+ Portato is a GUI for the package manager of <a href="http://www.gentoo.org">Gentoo</a> and <a href="http://www.sabayonlinux.org">Sabayon</a> - Portage. It is mostly written in <a href="http://www.python.org">Python</a> for the GTK+-frontend, which is used in most Linux desktop environments (except KDE).
+</p>
+
+<p>
+ As the current portage development is quite fast-paced, Portato is not able to keep step. Thus it might be that the released version(s) do not behave as expected. In these cases also try the <a href=${"development" | url}>development version</a>.
+</p>
+
+<%self:h2>Installation</%self:h2>
+<p>
+ Portato is delivered with the standard portage tree and can be installed using <code>emerge portato</code>.
+ If you want to use the development version, you need to do the following (given you have installed and configured layman ... if not: see <a href="http://www.gentoo.org/proj/en/overlays/userguide.xml">this guide</a>):
+</p>
+
+<%self:hl lang="bash">
+layman -a portato
+echo "=app-portage/portato-9999" >> /etc/portage/package.unmask
+echo "=app-portage/portato-9999" >> /etc/portage/package.keywords
+emerge -av portato
+</%self:hl>
+
+<%self:h2>Translations</%self:h2>
+<p>
+ Portato does know about the so called <strong>Native Language Support</strong>. It currently supports the following languages: Catalan, English, Italian, German, Polish, Portugese, and Turkish.
+</p>
+<p>
+ If you want to add support for another language, please see the <a href=${"translating" | url}>translation howto</a>.
+</p>
+
+<%self:h2>Forums</%self:h2>
+<p>
+ This project itself does not have any forums. But there are a couple of threads in other forums:<br>
+ If you are using Gentoo look into <a href="http://forums.gentoo.org/viewtopic-t-502350.html">this forum thread (engl)</a> or into <a href="http://forums.gentoo.org/viewtopic-t-495971.html">the German one</a>. If you are using Sabayon, use <a href="http://sabayonlinux.org/forum/viewtopic.php?f=54&t=10158">this one</a>.
+</p>
+
+<%self:h2>Similar projects</%self:h2>
+<p>
+ Of course there are other projects too, which do the same or at least a similar job. These are for example:
+</p>
+<ul>
+ <li><a href="http://www.haskell.org/himerge">Himerge</a> - a frontend written in Haskell (yeah ;P)</li>
+ <li><a href="http://porthole.sourceforge.net/">Porthole</a> - also written in Python and using GTK+. This frontend inspired me to do my own ;). I also suggest this one as the alternative if Portato does not work as expected.</li>
+ <li><a href="http://www.kuroo.org/">Kuroo</a> - a frontend especially aimed for the KDE environment. <em>(Development seems to have stopped)</em>
+</ul>
diff --git a/templates/root.mako b/templates/root.mako
new file mode 100644
index 0000000..bfadb2a
--- /dev/null
+++ b/templates/root.mako
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+ <!-- <link rel="shortcut icon" href=${"favicon.ico" | url} type="image/icon"> -->
+ <title>${self.title()}</title>
+ ${self.style()}
+ </head>
+
+ <body>
+ <div id="wrapper">
+ <div id="logo">
+ <h1><a href=${"" | url}>Kosten</a></h1>
+ <h2>»   vom Nec</h2>
+ </div>
+
+ <div id="header">
+ <div id="menu">
+ ${self.menu()}
+ </div>
+ </div>
+ </div>
+
+ <div id="page">
+ <div class="content">
+ ${next.body()}
+ </div>
+ <div style="clear: both;"> </div>
+ </div>
+ <div id="footer">
+ <p id="legal">
+ ${self.footer()}
+ </p>
+ </div>
+ </body>
+</html>
+
+## functions
+
+<%def name="title()">
+ Kostenverwaltung
+</%def>
+
+<%def name="style()">
+ <link href=${"static/css/style.css" | url} rel="stylesheet" type="text/css" />
+</%def>
+
+<%def name="footer()">
+ powered by <a href="http://www.makotemplates.org">mako</a> &amp; <a href="http://www.webpy.org">web.py</a> |
+ © 2010. All Rights Reserved. René Neumann |
+ with the help of <a href="http://www.freecsstemplates.org/">Free CSS Templates</a>.
+</%def>
+
+<%def name="menu()">
+ <%namespace file="menu.mako" name="m" />
+ <ul>
+ % for uri, page in m.attr.menu:
+ <li><a href=${uri | url}>${page}</a></li>
+ % endfor
+ </ul>
+</%def>