diff options
Diffstat (limited to '')
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | __init__.py | 1 | ||||
-rw-r--r-- | controller.py | 19 | ||||
-rw-r--r-- | helper.py | 16 | ||||
-rwxr-xr-x | index.py | 26 | ||||
-rw-r--r-- | renderer.py | 40 | ||||
-rw-r--r-- | static/css/style.css | 275 | ||||
-rw-r--r-- | templates/404.mako | 7 | ||||
-rw-r--r-- | templates/menu.mako | 5 | ||||
-rw-r--r-- | templates/page.mako | 46 | ||||
-rw-r--r-- | templates/pages/index.mako | 49 | ||||
-rw-r--r-- | templates/root.mako | 61 |
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> & <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> |