diff --git a/example/hello.html b/example/hello.html --- a/example/hello.html +++ b/example/hello.html @@ -1,8 +1,8 @@ - - -Hello, world! - - -Hello, world! - - + + +Hello, world! + + +Hello, worldz! + + diff --git a/simplewiki/dispatcher.py b/simplewiki/dispatcher.py --- a/simplewiki/dispatcher.py +++ b/simplewiki/dispatcher.py @@ -1,16 +1,16 @@ """ request dispatcher: data persisting across requests should go here """ import os -from handlers import GenshiRenderer, Index, Post, FileServer +from handlers import GenshiRenderer, Index, Post, FileServer, EditView from genshi.template import TemplateLoader from paste.fileapp import FileApp from pkg_resources import resource_filename from webob import Request, Response, exc class Dispatcher(object): @@ -25,17 +25,17 @@ class Dispatcher(object): # set instance parameters from kw and defaults for key in self.defaults: setattr(self, key, kw.get(key, self.defaults[key])) self.auto_reload = self.auto_reload.lower() == 'true' assert self.directory and os.path.exists(self.directory), "Must specify an existing directory" # request handlers - self.handlers = [ Post, GenshiRenderer, Index, FileServer ] + self.handlers = [ Post, EditView, GenshiRenderer, Index, FileServer ] # template loader self.template_dirs = self.template_dirs.split() self.template_dirs.append(resource_filename(__name__, 'templates')) self.loader = TemplateLoader(self.template_dirs, auto_reload=self.auto_reload) def __call__(self, environ, start_response): diff --git a/simplewiki/handlers.py b/simplewiki/handlers.py --- a/simplewiki/handlers.py +++ b/simplewiki/handlers.py @@ -120,30 +120,34 @@ class Index(Handler): class Post(Handler): methods = set(['POST']) # methods to listen to def __init__(self, app, request): Handler.__init__(self, app, request) if 'file' not in request.POST: raise HandlerMatchException self.file = self.request.POST['file'] - if not getattr(self.file, 'filename', None): - raise HandlerMatchException + filename = getattr(self.file, 'filename', '') + if filename: + content = self.file.file.read() + else: + content = self.file + self.location = request.path_info.rstrip('/') path = os.path.join(self.app.directory, *self.request.environ['path']) if os.path.isdir(path): self.directory = path - self.filename = os.path.join(self.directory, self.file.filename) - self.location += '/' + self.file.filename + self.filename = os.path.join(self.directory, filename) + self.location += '/' + filename else: self.directory = os.path.dirname(path) self.filename = path f = file(self.filename, 'wb') - f.write(self.file.file.read()) + f.write(content) f.close() def __call__(self): self.redirect(self.location) class FileServer(Handler): methods = set(['GET']) # methods to listen to @@ -151,8 +155,34 @@ class FileServer(Handler): Handler.__init__(self, app, request) self.file = os.path.join(self.app.directory, *request.environ['path']) if not os.path.exists(self.file): raise HandlerMatchException def __call__(self): return FileApp(self.file) +class EditView(Handler): + methods = set(['GET']) + template = 'edit.html' + + def __init__(self, app, request): + if 'edit' not in request.GET: + raise HandlerMatchException + + Handler.__init__(self, app, request) + + self.file = os.path.join(self.app.directory, *request.environ['path']) + if not os.path.exists(self.file): + raise HandlerMatchException + self.data = { 'request': request, + 'link': self.link, + 'file': '/' + '/'.join(request.environ['path']), + 'content': file(self.file).read() + } + + def __call__(self): + return getattr(self, self.request.method.title())() + + def Get(self): + template = self.app.loader.load(self.template) + return Response(content_type='text/html', + body=template.generate(**self.data).render('html'))