I have modified the tutorial to allow the user to upload files. It's a
many to many relationship...so while a file may only be uploaded once,
it can be referenced by any page.
My question is: how do I serve up these files?
The files are stored in the 'uploads' dir as:
target_file_name =
os.path.join(os.getcwd(),'uploads',upload_file.filename)
The files are displayed in page.kid as:
<ul>
Attached Files:
<li py:for="filename in uploads"><a href="${filename}"
py:content="filename">Filenamehere.</a></li>
</ul>
Clearly that doesn't work. How do I prevent TG from processing the
controller against the URL like:
http:/localhost/wiki/dowloads/{some filename here}
Sounds like a filter perhaps?
For those interested, I'll paste the code below...
-Todd
----------------------------------------------------------
#controller.py
import turbogears, cherrypy, re
from turbogears import controllers, validators
from model import Page, hub, UploadedFile
from docutils.core import publish_parts
from sqlobject import SQLObjectNotFound
import os
wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")
class Root(controllers.Root):
@turbogears.expose(html="toddswiki.templates.welcome")
def index(self):
import time
return dict(now=time.ctime())
@turbogears.expose(html="toddswiki.templates.page")
def index(self, pagename="FrontPage"):
try:
page = Page.byPagename(pagename)
uploads = [item.filename for item in
page.attached_files]
except SQLObjectNotFound:
raise
cherrypy.HTTPRedirect(turbogears.url("/notfound",pagename=pagename))
#the strange bug i emailed the list about
try:
content = publish_parts(page.data,
writer_name="html")["html_body"]
except:
content = page.data
root = str(turbogears.url("/"))
content = wikiwords.sub(r'<a href="%s\1">\1</a>' % root,
content)
content = content.encode("utf8")
return dict(data=content, pagename=page.pagename,
uploads=uploads)
@turbogears.expose(html="toddswiki.templates.edit")
def notfound(self, pagename):
return dict(pagename=pagename, data="", new=True, uploads=[])
@turbogears.expose(html="toddswiki.templates.edit")
def edit(self, pagename):
page = Page.byPagename(pagename)
uploads = [item.filename for item in page.attached_files]
return dict(pagename=page.pagename, data=page.data, new=False,
uploads=uploads)
@turbogears.expose(validators=dict(new=validators.StringBoolean()))
def save(self, pagename, data, submit, new):
hub.begin()
if new:
page = Page(pagename=pagename, data=data)
else:
page = Page.byPagename(pagename)
page.data = data
hub.commit()
hub.end()
turbogears.flash("Changes saved")
new = False
raise cherrypy.HTTPRedirect(turbogears.url("/%s" % pagename))
@turbogears.expose(html="toddswiki.templates.page")
def default(self, pagename):
return self.index(pagename)
@turbogears.expose(html="toddswiki.templates.pagelist")
def pagelist(self):
pages = [page.pagename for page in
Page.select(orderBy=Page.q.pagename)]
return dict(pages=pages)
@turbogears.expose()
def upload(self, upload_file, pagename, new, **keywords):
try:
p = Page.byPagename(pagename)
except SQLObjectNotFound:
turbogears.flash("Must save page first")
raise cherrypy.HTTPRedirect(turbogears.url("/%s" %
pagename))
total_data=''
while True:
data = upload_file.file.read(8192)
if not data:
break
total_data += data
target_file_name =
os.path.join(os.getcwd(),'uploads',upload_file.filename)
try:
u = UploadedFile.byFilename(upload_file.filename)
turbogears.flash("File already uploaded: %s is already
at %s" %
(upload_file.filename, target_file_name))
except SQLObjectNotFound:
f = open(target_file_name, 'w')
f.write(total_data)
f.close
turbogears.flash("File uploaded successfully: %s saved
as : %s" %
(upload_file.filename, target_file_name))
u = UploadedFile(filename=upload_file.filename,
abspath=target_file_name, size=0)
Page.byPagename(pagename).addUploadedFile(u)
raise cherrypy.HTTPRedirect(turbogears.url("/%s" % pagename))
#model.py
from sqlobject import *
from turbogears.database import PackageHub
hub = PackageHub("toddswiki")
__connection__ = hub
# class YourDataClass(SQLObject):
# pass
class Page(SQLObject):
pagename = StringCol(alternateID=True, length=30)
data = StringCol()
attached_files = RelatedJoin('UploadedFile')
class UploadedFile(SQLObject):
filename = StringCol(alternateID=True)
abspath = StringCol()
size = IntCol()
referenced_in_pages = RelatedJoin('Page')
#page.kid
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://purl.org/kid/ns#"
py:extends="'master.kid'">
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type"
py:replace="''"/>
<title>TurboGears Wiki</title>
</head>
<body>
<div style="float:right; width=10em">
Viewing <span py:replace = "pagename">Page Name</span>
<br/>
Back to the <a href="/">FrontPage</a>
</div>
<div py:replace="XML(data)">Page text.</div>
<p><a href="${std.url('/edit', pagename=pagename)}">Edit this
page</a></p>
<ul>
Attached Files:
<li py:for="filename in uploads"><a href="${filename}"
py:content="filename">Filenamehere.</a></li>
</ul>
</body>
</html>