i am interest in integating moinmoin in turbogears.
some month ago, i managed to run moinmoin over turbogears.but have
small bug.
below is my code.
# -*- coding: iso-8859-1 -*-
from MoinMoin import config
from MoinMoin.request import RequestBase
import cherrypy
def getdict(d,s,default):
try:
r=d[s]
except KeyError,e:
r=default
return(r)
class WikiRoot:
def index(self,*arg,**karg):
req = RequestCherry(cherrypy,arg,karg)
req.run()
return(req.output())
index.exposed=True
def default(self,*arg,**karg):
req = RequestCherry(cherrypy,arg,karg)
req.run()
return(req.output())
default.exposed=True
class RequestCherry(RequestBase):
def cherryUri(self):
p=self.cpresponse.path.split("/")
p=p[:-1]
for p1 in p:
r="/"+p1
return r
def output(self):
return(self.res[0])
def __init__(self, cpm,arg,karg):
if len(arg)>0:
pagename=arg[0]
else:
pagename=""
properties={}
self.res=[""]
self.arg=arg
self.karg=karg
self.cpresponse = cpm.request
self.reactor= cpm.response
self.http_accept_language =
getdict(self.cpresponse.headerMap,'Accept-Language','')
self.saved_cookie =
getdict(self.cpresponse.headerMap,'Cookie','')
self.http_user_agent = self.cpresponse.headerMap['User-Agent']
self.server_name =
self.cpresponse.headerMap['Host'].split(':')[0]
hp=self.cpresponse.headerMap['Host'].split(':')
if (len(hp)==2):
self.server_port = hp[1]
else:
self.server_port = "80"
self.is_ssl = 0
self.path_info = '/' + '/'.join([pagename]) #+
self.cpresponse.postpath)
self.request_method =self.cpresponse.method
self.remote_host = self.cpresponse.remoteHost
self.remote_addr = self.cpresponse.remoteAddr
self.script_name = self.cherryUri()
self.request_uri = self.cpresponse.path
# Values that need more work
self.query_string = self.splitURI(self.request_uri)[1]
#self.setHttpReferer(self.cpresponse.getHeader('Referer'))
self.setHost()
self.setURL(self.cpresponse.headerMap)#self.cpresponse.getAllHeaders()
self.debugEnvironment(self.cpresponse.headerMap)
RequestBase.__init__(self, properties)
def run(self):
""" Handle delayed errors then invoke base class run """
if hasattr(self, 'delayedError'):
self.fail(self.delayedError)
return self.finish()
RequestBase.run(self)
def setup_args(self, form=None):
""" Return args dict
Cherry already parsed args, including __filename__ hacking,
but did not decoded the values.
"""
#return self.decodeArgs(self.cpresponse.args)
from types import InstanceType,StringType
a={}
try:
a=self.karg
for a1 in a:
r=[]
if type(a[a1])==StringType:
r.append(unicode(a[a1],"utf-8"))
elif type(a[a1])==InstanceType:
r.append(a[a1].file.read())
else :
r.append(a[a1])
a[a1]=r
except IndexError,e:
pass
return(a)
def read(self, n=None):
""" Read from input stream.
"""
# XXX why is that wrong?:
#rd = self.reactor.callFromThread(self.cpresponse.read)
# XXX do we need self.reactor.callFromThread with that?
# XXX if yes, why doesn't it work?
self.cpresponse.content.seek(0, 0)
if n is None:
rd = self.cpresponse.content.read()
else:
rd = self.cpresponse.content.read(n)
#print "request.RequestCherry.read: data=\n" + str(rd)
return rd
def write(self, *data):
d=self.encode(data)
self.res[0]=self.res[0]+d
def flush(self):
pass # XXX is there a flush in Cherry?
def finish(self):
RequestBase.finish(self)
#self.reactor.callFromThread(self.cpresponse.finish)
def open_logs(self):
return
# create log file for catching stderr output
if not self.opened_logs:
sys.stderr = open(os.path.join(self.cfg.data_dir,
'error.log'), 'at')
self.opened_logs = 1
# Headers
----------------------------------------------------------
def __setHttpHeader(self, header):
if type(header) is unicode:
header = header.encode('ascii')
key, value = header.split(':',1)
value = value.lstrip()
if key.lower() == 'set-cookie':
key, value = value.split('=',1)
self.cpresponse.simpleCookie[key]=value
#self.cpresponse.addCookie(key, value)
else:
self.reactor.headerMap[key]=value
#print "request.RequestCherry.setHttpHeader: %s" % header
def http_headers(self, more_headers=[]):
if getattr(self, 'sent_headers', None):
return
self.sent_headers = 1
have_ct = 0
# set http headers
for header in more_headers + getattr(self, 'user_headers', []):
if header.lower().startswith("content-type:"):
# don't send content-type multiple times!
if have_ct: continue
have_ct = 1
self.__setHttpHeader(header)
if not have_ct:
self.__setHttpHeader("Content-type: text/html;charset=%s" %
config.charset)
def http_redirect(self, url):
""" Redirect to a fully qualified, or server-rooted URL
@param url: relative or absolute url, ascii using url encoding.
"""
url = self.getQualifiedURL(url)
raise cherrypy.HTTPRedirect(url)
#raise MoinMoinNoFooter
def setResponseCode(self, code, message=None):
#self.cpresponse.setResponseCode(code, message)
pass
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/turbogears
-~----------~----~----~----~------~----~------~--~---