Title of page is now specified in module.
authordanigm <dani@danigm.net>
Sat, 18 Apr 2009 12:10:06 +0000 (14:10 +0200)
committerdanigm <dani@danigm.net>
Sat, 18 Apr 2009 12:10:06 +0000 (14:10 +0200)
Default page shows the default module put in modconf.
Documented the kisspi module.

index.py
kisspi.py
modules/hello/hello.py
modules/modconf
modules/testmod/testmod.py

index 0109683..c5bdbb2 100644 (file)
--- a/index.py
+++ b/index.py
@@ -41,7 +41,7 @@ class index:
     controller.
     '''
 
-    def default(self, args, method="GET"):
+    def default(self, rargs, method="GET"):
         '''
         if url is like /methodname/arg1/arg2...
             returns the method page
@@ -51,11 +51,10 @@ class index:
 
         #TODO yield module suport
 
-        args = args.split('/')
+        args = rargs.split('/')
         if args:
             m = modules.get(args[0], None)
             if m:
-                #return m.body().GET()
                 f, fargs = kisspi.parse_url(m, '/'.join(args[1:]))
                 # adding kisspi to module class (sessions and others stuff)
                 if not f:
@@ -67,11 +66,12 @@ class index:
                     returned = function(*fargs)
                 else:
                     returned = function()
-                return kisspi.template(title="test", body=returned,
+                return kisspi.template(title=f.title, body=returned,
                         path='/'.join(args), method=method)
-
-        return kisspi.template(title="test", body=str(args),
-                path='/'.join(args), method=method)
+        if rargs == '':
+            return kisspi.template(path='/'.join(args), method=method)
+        else:
+            raise web.notfound()
     
     def GET(self, args):
         return self.default(args, method="GET")
index 9eb9e7f..542dc3c 100644 (file)
--- a/kisspi.py
+++ b/kisspi.py
@@ -1,5 +1,10 @@
 # -*- coding: utf-8 -*-
 
+'''
+kisspi module gives some tools that make easy to create a module and
+manage modules inside kisspi cms.
+'''
+
 import os
 import sys
 import re
@@ -8,8 +13,14 @@ import utils
 
 MODULES = {}
 THEME = 'default'
+DEFAULT_TITLE = 'KISSpi CMS'
 
 def load_modules(path='modules'):
+    '''
+    Loads all modules in a global dict called MODULES, keys are names
+    and values are the imported module.
+    '''
+
     global MODULES
     sys.path += [path]
     modules = os.listdir(path)
@@ -19,25 +30,24 @@ def load_modules(path='modules'):
     return MODULES
 
 def parse_url(module, path):
+    '''
+    Checks a module url and returns the associated function to it. If
+    that path isn't specificated in module.urls returns None, None.
+    '''
+
     for url, function in module.urls:
         match = re.match(url+'$', path)
         if match:
             return function(), match.groups()
     return None, None
 
-def get_session():
-    return web.ses
-
-def get_input(**args):
-    return web.input(**args)
-
-def redirect(path):
-    raise web.seeother(path)
-
-def get_render():
-    return web.template.render('static/themes/'+THEME+'/templates')
+def template(title='', body='', path='', method='GET'):
+    '''
+    Put the layaout and fill all parts with configfile, returns the
+    html code to show.
+    If not body is specified use default.
+    '''
 
-def template(title, body='', path='', method='GET'):
     head, pre_body, post_body, left, foot = 'head', 'pre-body', 'post-body', 'left', 'foot'
     default_modules = modconf()
 
@@ -46,6 +56,9 @@ def template(title, body='', path='', method='GET'):
     post_body = parse_layaout(default_modules['post_body'], path, method)
     left = parse_layaout(default_modules['left'], path, method)
     foot = parse_layaout(default_modules['foot'], path, method)
+    if not body:
+        body = parse_layaout(default_modules['default'], path, method)
+        title = DEFAULT_TITLE
 
     render = get_render()
     e = utils.get_err()
@@ -59,25 +72,51 @@ def template(title, body='', path='', method='GET'):
             foot, errors=e, msgs=m)
 
 def parse_layaout(args, real_path, method):
+    '''
+    template auxiliar function.
+
+    args is a pair list with the modpath as first item and the expr
+    that represent in witch pages it's shows that module.
+
+    real_path is the url path that it's visited now.
+
+    method is GET or POST
+
+    Returns the html code returned by all modules in args joined
+    '''
+
+    # The html of all modules of this layaout part
     to_ret = ''
     for modpath, real_path_expr in args:
         match = re.match(real_path_expr+'$', real_path)
+        # Check if we wan't show that module
         if match:
             mod_name = modpath.split('/')[0]
             path = '/'.join(modpath.split('/')[1:])
             mod = MODULES[mod_name]
+            # Getting the module class to call
             f, fargs = parse_url(mod, path)
             function = getattr(f, method)
+            # Calling the module
             to_ret += function(*fargs)
     return to_ret
 
 def modconf(file='modules/modconf'):
+    '''
+    Load a modules conf file.
+
+    Returns a dict with head, pre_body, post_body, ... with a list as
+    values. Each item in that list is a pair with module path and a
+    regular expresion that says where that module need to be shown.
+    '''
+
     # TODO cache that
     lines = open(file).readlines()
     default_modules = {'head': [], 'pre_body': [], 'post_body': [],
-            'foot': [], 'left': []}
+            'foot': [], 'left': [], 'default': []}
 
     for line in lines:
+        # Ignoring comments
         if line.strip().startswith('#'):
             continue
         
@@ -91,3 +130,20 @@ def modconf(file='modules/modconf'):
 
     return default_modules
         
+
+#########################################
+# MODULE HELP FUNCTIONS                 #
+#########################################
+
+def get_session():
+    return web.ses
+
+def get_input(**args):
+    return web.input(**args)
+
+def redirect(path):
+    raise web.seeother(path)
+
+def get_render():
+    return web.template.render('static/themes/'+THEME+'/templates')
+
index 61d4669..f9f165a 100644 (file)
@@ -19,16 +19,19 @@ Inside that methods you can use self.kisspi module to:
 
 class Hello:
     kisspi = None
+    title = 'Hello test'
     def GET(self, *args):
         return "hello everyone " + str(args)
 
 class Number:
     kisspi = None
+    title = 'Hello test'
     def GET(self, number):
         return "Hola al grupo %s" % number
 
 class Upload:
     kisspi = None
+    title = 'Hello test'
     def GET(self):
         form = '''
             <form action="" method="POST">
index 55cd9a1..c1729aa 100644 (file)
@@ -6,3 +6,4 @@ post_body testmod/postbody .*
 left testmod/left .*
 foot testmod/foot .* 
 head testmod/head2 hello
+default testmod/DEFAULT_BODY .*
index 6fb7625..648c099 100644 (file)
@@ -1,5 +1,6 @@
 class Test:
     kisspi = None
+    title = 'testmod'
     def GET(self, arg):
         return '<div style="border: 1px dashed gray; background-color: #ffe371; padding: 3px;">%s</div>' % arg