Modules paths now are resolved with regular expresions.
authordanigm <dani@danigm.net>
Thu, 16 Apr 2009 16:49:00 +0000 (18:49 +0200)
committerdanigm <dani@danigm.net>
Thu, 16 Apr 2009 16:49:00 +0000 (18:49 +0200)
Modules now can access to kisspi tools.
Better example and documentation.

index.py
kisspi.py
modules/hello/__init__.py
modules/hello/hello.py

index 06c25b1..8f923e6 100644 (file)
--- a/index.py
+++ b/index.py
@@ -5,7 +5,7 @@ import web
 import kisspi
 from utils import authenticated, templated
 
-#web.config.debug = False
+web.config.debug = False
 
 urls = (
         '/(.*)', 'index',
@@ -21,20 +21,48 @@ def internalerror():
     body = template(body)
     return web.internalerror(body)
 
-app.internalerror = internalerror
+#app.internalerror = internalerror
 
 web.ses = session
 
 modules = kisspi.load_modules()
 
 class index:
-    def GET(self, args):
+    '''
+    This is the default handler. All petitions goes trouth this
+    controller.
+    '''
+
+    def default(self, args, method="GET"):
+        '''
+        if url is like /methodname/arg1/arg2...
+            returns the method page
+        else
+            returns the default page
+        '''
+
+        #TODO pages goes inside a layaout, in body
+
         args = args.split('/')
         if args:
             m = modules.get(args[0], None)
             if m:
-                return m.body().GET()
+                #return m.body().GET()
+                f = kisspi.parse_url(m, '/'.join(args[1:]))
+                # adding kisspi to module class (sessions and others stuff)
+                f.kisspi = kisspi
+                function = getattr(f, method)
+                if args[1:]:
+                    returned = function(*args[1:])
+                else:
+                    returned = function()
+                return returned
         return args
+    
+    def GET(self, args):
+        return self.default(args, method="GET")
+    def POST(self, args):
+        return self.default(args, method="POST")
 
 if __name__ == '__main__':
     app.run()
index c6e54af..d5d52d5 100644 (file)
--- a/kisspi.py
+++ b/kisspi.py
@@ -3,16 +3,29 @@
 import os
 import sys
 import re
+import web
+
+MODULES = {}
 
 def load_modules(path='modules'):
+    global MODULES
     sys.path += [path]
     modules = os.listdir(path)
-    modules = dict([(i, __import__(i)) for i in modules])
-    return modules
+    MODULES = dict([(i, __import__(i)) for i in modules])
+
+    return MODULES
 
 def parse_url(module, path):
-    # TODO testear esto
     for url, function in module.urls:
         if re.match(url, path):
             return function()
     return None
+
+def get_session():
+    return web.ses
+
+def get_input(**args):
+    return web.input(**args)
+
+def redirect(path):
+    raise web.seeother(path)
index d019faf..9b02e07 100644 (file)
@@ -1,7 +1,26 @@
+'''
+Example kisspi module init file
+'''
+
 import hello
 
-urls = (('.*', hello.Hello),
+# some urls:
+# /hello/23 -> hello.Number().GET(23)
+# /hello/up -> hello.Upload().GET(up) / hello.Upload().POST(up) 
+# /hello -> hello.Hello
+# They are regular expresions and the order is important
+urls = (
+        ('\d', hello.Number),
+        ('up', hello.Upload),
+        ('', hello.Hello),
         )
 
+# Usual urls are defined as variables
+
+# Admin page
+admin = None
+# Add page
 add = None
+# Body is the default controller, it's called when this module is
+# asigned to a sidebar, header, main body, etc
 body = hello.Hello
index 2d05313..7c01171 100644 (file)
@@ -1,4 +1,50 @@
+'''
+Example kisspi module controller
+
+Every controller is a class with GET/POST methods. That functions
+returns html that it's embebed inside the cms layaout.
+
+Inside that methods you can use self.kisspi module to:
+    - use sessions:
+        self.kisspi.get_session()
+    - get input:
+        self.kisspi.get_input()
+        if you try to upload a file, use webpy syntax
+        self.kisspi.get_input(myfile={})
+    - redirect:
+        self.kisspi.redirect(new_url)
+    - other modules:
+        self.kisspi.MODULES
+'''
+
 class Hello:
-    def GET(self):
-        return "Hola a todos"
+    kisspi = None
+    def GET(self, *args):
+        return "hello everyone " + str(args)
+
+class Number:
+    kisspi = None
+    def GET(self, number):
+        return "Hola al grupo %s" % number
+
+class Upload:
+    kisspi = None
+    def GET(self, *args):
+        form = '''
+            <form action="" method="POST">
+                <input type="text" name="text"/>
+                <input type="submit" name="upload"/>
+            </form>
+        '''
+        session = self.kisspi.get_session()
+        yield '<html><head></head><body>'
+        yield 'uploaded: %s' % session.get('uploaded', '')
+        yield form
+        yield '</body></html>'
 
+    def POST(self, *args):
+        session = self.kisspi.get_session()
+        input = self.kisspi.get_input()
+        session.uploaded = input.text
+        
+        self.kisspi.redirect('/hello/up')