Mercurial > hg > decoupage
annotate decoupage/web.py @ 42:e0e1a339070c
print which formmaters werent available
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 01 Sep 2010 07:14:10 -0700 |
parents | 89f7a8ca965c |
children | 8621a6e2fe38 |
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 |
40
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
8 from contenttransformer.app import transformers |
10 | 9 from formatters import formatters |
10 | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
11 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
|
12 from genshi.template import TemplateLoader |
21 | 13 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
|
14 from martini.config import ConfigMunger |
2 | 15 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
|
16 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
|
17 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
|
18 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
|
19 |
40
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
20 transformers = [i.lower() for i in transformers()] |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
21 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
22 class Decoupage(object): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
23 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
24 ### class level variables |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
25 defaults = { 'auto_reload': 'False', |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
26 'configuration': None, |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
27 '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
|
28 '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
|
29 '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
|
30 '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
|
31 } |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
32 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
33 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
|
34 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
35 # 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
|
36 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
|
37 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
|
38 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
|
39 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
40 # configure defaults |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 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
|
45 self.template_directories = self.template_directories.split() # no spaces in directory names, for now |
30 | 46 |
47 for directory in self.template_directories: | |
48 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
|
49 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
50 # static file server |
40
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
51 self.fileserver = FileApp # XXX still used?!? |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
52 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
53 # pluggable index data formatters |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
54 self.formatters = {} |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
55 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
|
56 try: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
57 _formatter = formatter.load() |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
58 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
|
59 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
|
60 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
|
61 except: |
42
e0e1a339070c
print which formmaters werent available
Jeff Hammel <jhammel@mozilla.com>
parents:
40
diff
changeset
|
62 print "Couldn't load formatter: %s" % formatter |
e0e1a339070c
print which formmaters werent available
Jeff Hammel <jhammel@mozilla.com>
parents:
40
diff
changeset
|
63 continue |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
64 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
|
65 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
66 # template loader |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
67 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
|
68 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
|
69 |
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
|
70 |
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
|
71 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
72 ### methods dealing with HTTP |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
73 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
|
74 request = Request(environ) |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
75 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
|
76 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
|
77 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
|
78 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
|
79 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
80 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
|
81 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
|
82 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
83 res = self.get(request) |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 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
|
88 args = [i.split('=', 1) for i in conf['/transformer'].split(',') if '=' in i] |
40
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
89 kwargs = {} |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
90 for i in conf: |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
91 if i.startswith('/'): |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
92 name = i[1:].lower() |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
93 if name in transformers: |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
94 kwargs[name] = dict([j.split('=', 1) for j in conf[i].split(',') if '=' in j]) |
89f7a8ca965c
add arguments to transformers....configparser is somewhat retarded about capitalization so im going to be somewhat retarded here rather than google for how to fix right now. lame
Jeff Hammel <jhammel@mozilla.com>
parents:
35
diff
changeset
|
95 fileserver = FileTypeTransformer(*args, **kwargs) |
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
|
96 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
|
97 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
|
98 |
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
|
99 fileserver = fileserver(path) |
2 | 100 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
|
101 else: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
102 raise exc.HTTPNotFound() |
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 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
105 def get(self, request): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
106 """ |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
107 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
|
108 """ |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
109 # ensure a sane path |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
110 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
|
111 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
|
112 path = '/%s' % path |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
113 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
114 # get the configuraton |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
115 conf = self.conf(path) |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
116 |
33
e384d4569ac3
include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents:
26
diff
changeset
|
117 ### build data dictionary |
12
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
118 files = self.filedata(path, directory, conf) |
13
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
119 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
|
120 |
e384d4569ac3
include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents:
26
diff
changeset
|
121 # defaults; TODO: make this better |
13
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
122 data['title'] = conf.get('/title') |
15 | 123 data['directory'] = directory |
14
4ca2530f8be1
stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents:
13
diff
changeset
|
124 data['include'] = None |
4ca2530f8be1
stub for putting stylesheets and includes on templates"
k0s <k0scist@gmail.com>
parents:
13
diff
changeset
|
125 data['css'] = () |
33
e384d4569ac3
include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents:
26
diff
changeset
|
126 data['scripts'] = () |
e384d4569ac3
include components necessary to make decoupage feel almost like a framework
k0s <k0scist@gmail.com>
parents:
26
diff
changeset
|
127 data['icon'] = None |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
128 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
129 # apply formatters |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
130 # 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
|
131 if '/formatters' in conf: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
132 # 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
|
133 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
|
134 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
|
135 else: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
136 formatters = [] |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
137 for key in conf: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
138 if key.startswith('/'): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
139 key = key[1:] |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
140 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
|
141 formatters.append(key) |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
142 for name in formatters: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
143 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
|
144 formatter(request, data) |
10 | 145 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
146 # render the template |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
147 template = conf.get('/template') |
20 | 148 local_index = False |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
149 if template is None: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
150 if 'index.html' in [ f['name'] for f in files ]: |
20 | 151 local_index = os.path.join(directory, 'index.html') |
152 template = local_index | |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
153 else: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
154 template = self.template |
13
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
155 else: |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
156 if not os.path.isabs(template): |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
157 _template = os.path.join(directory, template) |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
158 if os.path.exists(_template): |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
159 template = _template |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
160 else: |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
161 for directory in self.template_directories: |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
162 if template in os.listdir(directory): |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
163 break |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
164 else: |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
165 raise IOError("template %s not found" % template) |
ab0c2bb4d23d
* get the templates in the correct way
k0s <k0scist@gmail.com>
parents:
12
diff
changeset
|
166 |
20 | 167 try: |
21 | 168 template = self.loader.load(template) |
20 | 169 res = template.generate(**data).render('html', doctype='html') |
21 | 170 except TemplateError: |
20 | 171 if local_index: |
172 return self.fileserver(local_index) | |
173 raise | |
174 | |
25
d5775f3667a2
remove pointless get_response method
k0s <k0scist@gmail.com>
parents:
21
diff
changeset
|
175 return Response(content_type='text/html', body=res) |
d5775f3667a2
remove pointless get_response method
k0s <k0scist@gmail.com>
parents:
21
diff
changeset
|
176 |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
177 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
178 ### internal methods |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
179 |
12
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
180 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
|
181 files = [] |
35
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
182 |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
183 # TODO: other items to add |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
184 # type: 'file' or 'directory' |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
185 # last_modified |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
186 # created |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
187 |
12
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
188 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
|
189 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
|
190 'name': i, |
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
191 'description': conf.get(i.lower(), None)}) |
35
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
192 |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
193 # TODO: deal with other links in conf |
20e3d138dc98
better way of doing up; this breaks old behaviour so incrementing version
k0s <k0scist@gmail.com>
parents:
34
diff
changeset
|
194 |
12
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
195 return files |
9f91acf9874c
* split on space in formatters to be consist with everything else
k0s <k0scist@gmail.com>
parents:
10
diff
changeset
|
196 |
10 | 197 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
|
198 """returns configuration dictionary appropriate to a path""" |
10 | 199 if cascade is None: |
200 cascase = self.cascade | |
0
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 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
|
203 if path.strip('/'): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
204 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
|
205 else: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
206 path_tuple = () |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
207 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
208 # return cached configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
209 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
|
210 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
|
211 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
212 conf = {} |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
213 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
214 # local configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
215 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
|
216 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
|
217 _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
|
218 if len(_conf) == 1: |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
219 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
|
220 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
221 # global configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
222 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
|
223 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
|
224 |
10 | 225 # inherit and cascade configuration |
226 inherit_directory = None | |
227 if '/inherit' in conf: | |
228 inherit_directory = conf['/inherit'] | |
229 elif self.cascade and path_tuple: | |
230 inherit_directory = '/%s' % '/'.join(path_tuple[:-1]) | |
231 if inherit_directory: | |
232 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
|
233 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
|
234 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
|
235 conf[key] = value |
0
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
236 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
237 # cache configuration |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
238 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
|
239 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
|
240 self._conf = {} |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
241 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
|
242 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
243 return conf |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
244 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
245 def fmtrs(self, path): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
246 formatters = [] |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
247 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
|
248 if key.startswith('/'): |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
249 key = key[1:] |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
250 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
|
251 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
|
252 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
253 |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
254 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
|
255 keystr += '.' |
fa2005f769eb
adding decoupage from http://my-svn.assembla.com/svn/arbez/decoupage r355
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
256 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
|
257 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
|
258 if key.startswith(keystr) ]) |