comparison decoupage/web.py @ 48:af73a3fda723

add more metadata to files: modification time, type
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 03 Nov 2010 07:22:39 -0700
parents 8621a6e2fe38
children ac693b8df32c
comparison
equal deleted inserted replaced
47:0cfb84d788d6 48:af73a3fda723
5 import os 5 import os
6 import sys 6 import sys
7 7
8 from contenttransformer.app import FileTypeTransformer 8 from contenttransformer.app import FileTypeTransformer
9 from contenttransformer.app import transformers 9 from contenttransformer.app import transformers
10 from datetime import datetime
10 from formatters import formatters 11 from formatters import formatters
11
12 from genshi.builder import Markup 12 from genshi.builder import Markup
13 from genshi.template import TemplateLoader 13 from genshi.template import TemplateLoader
14 from genshi.template.base import TemplateError 14 from genshi.template.base import TemplateError
15 from genshi.template.base import TemplateSyntaxError 15 from genshi.template.base import TemplateSyntaxError
16 from martini.config import ConfigMunger 16 from martini.config import ConfigMunger
106 106
107 def get(self, request): 107 def get(self, request):
108 """ 108 """
109 return response to a GET requst 109 return response to a GET requst
110 """ 110 """
111
111 # ensure a sane path 112 # ensure a sane path
112 path = request.path_info.strip('/') 113 path = request.path_info.strip('/')
113 directory = os.path.join(self.directory, path) 114 directory = os.path.join(self.directory, path)
114 path = '/%s' % path 115 path = '/%s' % path
115 116
119 ### build data dictionary 120 ### build data dictionary
120 files = self.filedata(path, directory, conf) 121 files = self.filedata(path, directory, conf)
121 data = {'path': path, 'files': files, 'request': request } 122 data = {'path': path, 'files': files, 'request': request }
122 123
123 # defaults; TODO: make this better 124 # defaults; TODO: make this better
125 # there shouldn't need to be defaults;
126 # iirc, genshi has a mode where these will default to None
124 data['title'] = conf.get('/title') 127 data['title'] = conf.get('/title')
125 data['directory'] = directory 128 data['directory'] = directory
126 data['include'] = None 129 data['include'] = None
127 data['css'] = () 130 data['css'] = ()
128 data['scripts'] = () 131 data['scripts'] = ()
163 for directory in self.template_directories: 166 for directory in self.template_directories:
164 if template in os.listdir(directory): 167 if template in os.listdir(directory):
165 break 168 break
166 else: 169 else:
167 raise IOError("template %s not found" % template) 170 raise IOError("template %s not found" % template)
168
169 try: 171 try:
170 template = self.loader.load(template) 172 template = self.loader.load(template)
171 res = template.generate(**data).render('html', doctype='html') 173 res = template.generate(**data).render('html', doctype='html')
172 except (TemplateError, TemplateSyntaxError), e: 174 except (TemplateError, TemplateSyntaxError), e:
173 if local_index: 175 if local_index:
174 print repr(e) 176 print repr(e)
175 return self.fileserver(local_index) 177 return self.fileserver(local_index)
176 raise 178 raise
177 179
180 # return response
178 return Response(content_type='text/html', body=res) 181 return Response(content_type='text/html', body=res)
179 182
180 183
181 ### internal methods 184 ### internal methods
182 185
183 def filedata(self, path, directory, conf): 186 def filedata(self, path, directory, conf):
184 files = [] 187 files = []
185 188
186 # TODO: other items to add
187 # type: 'file' or 'directory'
188 # last_modified
189 # created
190
191 for i in os.listdir(directory): 189 for i in os.listdir(directory):
190 filepath = os.path.join(directory, i)
191 filetype = 'file'
192 if os.path.isdir(filepath):
193 filetype = 'directory'
194 modified = os.path.getmtime(filepath)
195 modified = datetime.fromtimestamp(modified)
192 files.append({'path' : '%s/%s' % (path.rstrip('/'), i), 196 files.append({'path' : '%s/%s' % (path.rstrip('/'), i),
193 'name': i, 197 'name': i,
194 'description': conf.get(i.lower(), None)}) 198 'modified': modified,
199 'description': conf.get(i.lower(), None),
200 'type': filetype})
195 201
196 # TODO: deal with other links in conf 202 # TODO: deal with other links in conf
197 203
198 return files 204 return files
199 205