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'))