annotate decoupage/web.py @ 34:527ccb76d043

merged some stuff
author k0s <k0scist@gmail.com>
date Mon, 08 Feb 2010 11:44:20 -0500
parents e384d4569ac3 89a72b2fd149
children 20e3d138dc98
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
1 """
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
2 decoupage: a view with webob to index and serve static content
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
3 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
4
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
5 import os
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
6
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
7 from contenttransformer.app import FileTypeTransformer
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
8 from formatters import formatters
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
9
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
10 from genshi.builder import Markup
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
11 from genshi.template import TemplateLoader
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
12 from genshi.template.base import TemplateError
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
13 from martini.config import ConfigMunger
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
14 from paste.fileapp import FileApp
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
15 from pkg_resources import resource_filename
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
16 from pkg_resources import iter_entry_points
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
17 from webob import Request, Response, exc
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
18
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
19 class Decoupage(object):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
20
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
21 ### class level variables
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
22 defaults = { 'auto_reload': 'False',
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
23 'configuration': None,
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
24 'directory': None, # directory to serve
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
25 'cascade': 'True', # whether to cascade configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
26 'template': 'index.html', # XXX see below
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
27 'template_directories': '' # list of directories to look for templates
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
28 }
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
29
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
30 def __init__(self, **app_conf):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
31
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
32 # set defaults from app configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
33 kw = self.app_conf('decoupage', app_conf)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
34 for key in self.defaults:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
35 setattr(self, key, kw.get(key, self.defaults[key]))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
36
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
37 # configure defaults
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
38 self.auto_reload = self.auto_reload.lower() == 'true'
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
39 self.cascade = self.cascade.lower() == 'true'
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
40 self.directory = self.directory.rstrip(os.path.sep)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
41 assert os.path.isdir(self.directory)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
42 self.template_directories = self.template_directories.split() # no spaces in directory names, for now
30
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
43
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
44 for directory in self.template_directories:
81607129a45e better error message
egj@socialplanning.org
parents: 21
diff changeset
45 assert os.path.isdir(directory), "Decoupage template directory %s does not exist!" % directory
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
46
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
47 # static file server
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
48 self.fileserver = FileApp
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
49
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
50 # pluggable index data formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
51 self.formatters = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
52 for formatter in iter_entry_points('decoupage.formatters'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
53 try:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
54 _formatter = formatter.load()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
55 template_dir = resource_filename(formatter.module_name, 'templates')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
56 if template_dir not in self.template_directories and os.path.isdir(template_dir):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
57 self.template_directories.append(template_dir)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
58 except:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
59 continue # XXX should probably raise
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
60 self.formatters[formatter.name] = _formatter
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
61
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
62 # template loader
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
63 self.loader = TemplateLoader(self.template_directories,
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
64 auto_reload=self.auto_reload)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
65
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
66
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
67
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
68 ### methods dealing with HTTP
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
69 def __call__(self, environ, start_response):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
70 request = Request(environ)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
71 filename = request.path_info.strip('/')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
72 path = os.path.join(self.directory, filename)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
73 if os.path.exists(path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
74 if os.path.isdir(path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
75
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
76 if not request.path_info.endswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
77 raise exc.HTTPMovedPermanently(add_slash=True)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
78
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
79 res = self.get(request)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
80 return res(environ, start_response)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
81 else:
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
82 conf = self.conf(request.path_info.rsplit('/',1)[0])
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
83 if '/transformer' in conf:
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
84 args = [i.split('=', 1) for i in conf['/transformer'].split(',') if '=' in i]
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
85 fileserver = FileTypeTransformer(*args)
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
86 else:
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
87 fileserver = FileApp
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
88
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
89 fileserver = fileserver(path)
2
041958c8c8f2 use paste.fileapp as the fileserver
k0s <k0scist@gmail.com>
parents: 0
diff changeset
90 return fileserver(environ, start_response)
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
91 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
92 raise exc.HTTPNotFound()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
93
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
94
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
95 def get(self, request):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
96 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
97 return response to a GET requst
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
98 """
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
99 # ensure a sane path
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
100 path = request.path_info.strip('/')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
101 directory = os.path.join(self.directory, path)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
102 path = '/%s' % path
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
103
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
104 # get the configuraton
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
105 conf = self.conf(path)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
106
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
107 ### build data dictionary
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
108 files = self.filedata(path, directory, conf)
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
109 data = {'path': path, 'files': files, 'request': request }
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
110
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
111 # defaults; TODO: make this better
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
112 data['title'] = conf.get('/title')
15
8923fda80bd4 misspelling
k0s <k0scist@gmail.com>
parents: 14
diff changeset
113 data['directory'] = directory
14
4ca2530f8be1 stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents: 13
diff changeset
114 data['include'] = None
4ca2530f8be1 stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents: 13
diff changeset
115 data['css'] = ()
33
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
116 data['scripts'] = ()
e384d4569ac3 include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents: 26
diff changeset
117 data['icon'] = None
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
118
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
119 # apply formatters
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
120 # XXX this should be cached if not self.auto_reload
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
121 if '/formatters' in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
122 # ordered list of formatters to be applied first
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
123 formatters = [ i for i in conf['/formatters'].split()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
124 if i in self.formatters ]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
125 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
126 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
127 for key in conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
128 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
129 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
130 if key in self.formatters and key not in formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
131 formatters.append(key)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
132 for name in formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
133 formatter = self.formatters[name](conf.get('/%s' % name, ''))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
134 formatter(request, data)
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
135
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
136 # render the template
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
137 template = conf.get('/template')
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
138 local_index = False
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
139 if template is None:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
140 if 'index.html' in [ f['name'] for f in files ]:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
141 local_index = os.path.join(directory, 'index.html')
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
142 template = local_index
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
143 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
144 template = self.template
13
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
145 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
146 if not os.path.isabs(template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
147 _template = os.path.join(directory, template)
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
148 if os.path.exists(_template):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
149 template = _template
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
150 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
151 for directory in self.template_directories:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
152 if template in os.listdir(directory):
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
153 break
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
154 else:
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
155 raise IOError("template %s not found" % template)
ab0c2bb4d23d * get the templates in the correct way
k0s <k0scist@gmail.com>
parents: 12
diff changeset
156
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
157 try:
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
158 template = self.loader.load(template)
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
159 res = template.generate(**data).render('html', doctype='html')
21
64ae0d2f402b fix breakages
egj@egj-laptop
parents: 20
diff changeset
160 except TemplateError:
20
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
161 if local_index:
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
162 return self.fileserver(local_index)
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
163 raise
c17595c824a7 try to fail gracefully if index.html exists
egj@egj-laptop
parents: 15
diff changeset
164
25
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
165 return Response(content_type='text/html', body=res)
d5775f3667a2 remove pointless get_response method
k0s <k0scist@gmail.com>
parents: 21
diff changeset
166
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
167
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
168 ### internal methods
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
169
12
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
170 def filedata(self, path, directory, conf):
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
171 files = []
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
172 for i in os.listdir(directory):
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
173 files.append({'path' : '%s/%s' % (path.rstrip('/'), i),
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
174 'name': i,
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
175 'description': conf.get(i.lower(), None)})
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
176 return files
9f91acf9874c * split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents: 10
diff changeset
177
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
178 def conf(self, path, cascade=None):
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
179 """returns configuration dictionary appropriate to a path"""
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
180 if cascade is None:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
181 cascase = self.cascade
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
182
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
183 directory = os.path.join(self.directory, path.strip('/'))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
184 if path.strip('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
185 path_tuple = tuple(path.strip('/').split('/'))
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
186 else:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
187 path_tuple = ()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
188
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
189 # return cached configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
190 if hasattr(self, '_conf') and path_tuple in self._conf:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
191 return self._conf[path_tuple]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
192
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
193 conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
194
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
195 # local configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
196 ini_path = os.path.join(directory, 'index.ini')
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
197 if os.path.exists(ini_path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
198 _conf = ConfigMunger(ini_path).dict()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
199 if len(_conf) == 1:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
200 conf = _conf[_conf.keys()[0]].copy()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
201
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
202 # global configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
203 if not conf and self.configuration and os.path.exists(self.configuration):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
204 conf = ConfigMunger(self.configuration).dict().get('/%s' % path.rstrip('/'), {})
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
205
10
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
206 # inherit and cascade configuration
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
207 inherit_directory = None
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
208 if '/inherit' in conf:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
209 inherit_directory = conf['/inherit']
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
210 elif self.cascade and path_tuple:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
211 inherit_directory = '/%s' % '/'.join(path_tuple[:-1])
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
212 if inherit_directory:
a328cc9d2c74 * fix formatters
k0s <k0scist@gmail.com>
parents: 6
diff changeset
213 parent_configuration = self.conf(inherit_directory)
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
214 for key, value in parent_configuration.items():
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
215 if key.startswith('/') and key not in conf:
26
f306089d6def now use contenttransformer to serve files if /transformer in directory configuration; TODO: cache on a per-directory basis
k0s <k0scist@gmail.com>
parents: 25
diff changeset
216 conf[key] = value
0
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
217
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
218 # cache configuration
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
219 if not self.auto_reload:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
220 if not hasattr(self, '_conf'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
221 self._conf = {}
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
222 self._conf[path_tuple] = conf
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
223
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
224 return conf
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
225
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
226 def fmtrs(self, path):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
227 formatters = []
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
228 for key, value in self.conf(path).items():
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
229 if key.startswith('/'):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
230 key = key[1:]
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
231 if key in self.formatters:
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
232 formatter = self.formatters[key](value)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
233
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
234
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
235 def app_conf(self, keystr, app_conf):
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
236 keystr += '.'
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
237 return dict([(key.split(keystr, 1)[-1], value)
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
238 for key, value in app_conf.items()
fa2005f769eb adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff changeset
239 if key.startswith(keystr) ])