All pastes #154731 Raw Edit

Something

public text v1 · immutable
#154731 ·published 2006-08-30 16:00 UTC
rendered paste body
from Globals import DTMLFile
from OFS.Folder import Folder
from zope.security.interfaces import Unauthorized

from trac.web.main import dispatch_request, send_project_index, get_environment
from trac.web.api import Request
from trac.perm import PermissionError

manage_addZopeTracForm = DTMLFile('dtml/manage_addZopeTracForm', globals())

def manage_addZopeTrac(self, id, tracEnvParentDir, title = '', REQUEST = {}):
	""" Add a Zope Trac Instance """
	o = ZopeTrac(id, tracEnvParentDir, title)
	self._setObject(id, o)

	if REQUEST:
		return self.manage_main(self, REQUEST)
	return ''

class ZopeTracField(object):
	def __init__(self, name, value):
		self.name = name
		self.value = value
                self.filename = None
                if hasattr(self.value, 'filename'):
                        self.filename = self.value.filename
                        self.file = self.value
		
class ZopeTracFieldStorage:
	""" Zope FieldStorage Wrapper """
	def __init__(self, req):
		self.req = req

	def keys(self):
		return self.req.form.keys()

	def has_key(self, key):
		return self.req.form.has_key(key) or self.req.has_key(key)

	def __getitem__(self, key, default=None):
		return ZopeTracField(key, self.get(key, default))
		
	def get(self, key, default=None):
		return self.req.get(key, default)

	def __setitem__(self, key, value):
		self.req.set(key, value)

class ZopeTracRequest(Request):
	""" Req implementation for Zope """

	def __init__(self, options, request, baseUrl):
		Request.__init__(self)
		self.request = request
		self.remote_addr = self.request.REMOTE_ADDR
		self.remote_user = self.request.AUTHENTICATED_USER.getUserName()
		self.server_name = self.request.SERVER_NAME
		self.server_port = self.request.SERVER_PORT
		self.method = self.request.REQUEST_METHOD
		self.scheme = self.request.URL[:self.request.URL.index(':')]
		for k, v in self.request.cookies.items():
			self.incookie[k] = v

		self.args = ZopeTracFieldStorage(self.request)
			
		self.cgi_location = '/'+baseUrl
		self.idx_location = self.cgi_location
		pi = self.request.PATH_INFO
		pIndex = pi.index(self.cgi_location)

		self.path_info = pi[pIndex + len(self.cgi_location):]
		
	def read(self, len):
		pass

	def write(self, data):
		self.request.RESPONSE.write(data)

	def get_header(self, name):
		newName = 'HTTP_'+name.replace('-', '_').upper()
		return self.request[newName]

	def send_response(self, code):
		for k, v in self.outcookie.items():
			self.request.RESPONSE.setCookie(k, v)

		self.request.RESPONSE.flush()

	def send_header(self, name, value):
		if name == 'Location':
			self.request.RESPONSE.redirect(value)
		else:
			self.request.RESPONSE.setHeader(name, value)

	def end_headers(self):
		pass

class ZopeTrac(Folder):
	""" Map a Trac Instance to a Zope Folder """

	def __init__(self, id, tracEnvParentDir = '', title = ''):
		self.id = id
		self.title = title
		self.tracEnvParentDir = tracEnvParentDir

	def get_environment(self):
		options = {}
		options['TRAC_ENV'] = self.tracEnvParentDir
		return get_environment(self.REQUEST, options)

	def dispatch_request(self):
		env = self.get_environment()
		env.config.parse_if_needed()
		req = ZopeTracRequest(env, self.REQUEST, self.virtual_url_path())
		try:
			return dispatch_request(req.path_info, req, env)
		except PermissionError:
			raise Unauthorized

	def __call__(self, *args, **kwargs):
		self.dispatch_request()

	def __bobo_traverse__(self, REQUEST, name):
		return self