# # Copyright (c) 2009 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # """ BSCW repository view. $Id$ """ from datetime import datetime from time import strptime from urllib import quote, quote_plus from zope.app.pagetemplate import ViewPageTemplateFile from zope import component from zope.cachedescriptors.property import Lazy from zope.traversing.browser import absoluteURL from cybertools.integrator.base import mimeTypes from cybertools.integrator.bscw import ContainerFactory, File from cybertools.integrator.interfaces import IContainerFactory from cybertools.integrator.interfaces import IItemFactory, IFileFactory view_macros = ViewPageTemplateFile('view.pt') class BaseView(object): def __init__(self, context, request): self.context = context self.request = request @Lazy def title(self): return self.context.title @Lazy def description(self): return self.context.description @Lazy def modified(self): return self.context.modified @Lazy def url(self): return absoluteURL(self.context, self.request) @Lazy def icon(self): return '%s/++resource++%s.png' % (self.request.URL[0], self.context.icon) class ItemView(BaseView): def __init__(self, context, request, parentView): super(ItemView, self).__init__(context, request) self.parentView = parentView @Lazy def baseName(self): return self.context.icon @Lazy def url(self): #if isinstance(self.context, File): # return self.bscwDownloadUrl url = self.parentView.url return '%s?id=%s' % (url, self.context.internalPath) def download(self): fn = self.getFileName() data = self.context.getData() response = self.request.response response.setHeader('Content-Type', self.context.contentType) response.setHeader('Content-Length', len(data)) response.setHeader('Content-Disposition', 'inline; filename="%s"' % fn) return data def getFileName(self): if (self.context.contentType == 'application/octet-stream' and len(self.title) > 3 and self.title[-4] == '.'): extension = '' else: extensions = mimeTypes.get(self.context.contentType) or ['bin'] for ext in extensions: if self.title.endswith('.' + ext): extension = '' break else: extension = '.' + extensions[0] title = self.title.encode('UTF-8') title = title.replace('/', '|') return title + extension @Lazy def bscwDownloadUrl(self): urlInfo = self.context.externalURLInfo baseUrl = urlInfo.baseUrl while 'bscw.cgi' in baseUrl and not baseUrl.endswith('bscw.cgi'): baseUrl, ignore = baseUrl.rsplit('/', 1) fn = self.getFileName() return '%s/d%s/%s' % (baseUrl, urlInfo.path, fn) @property def breadCrumbs(self): parents = [p for p in self.context.parents if p is not None] for p in reversed(parents): view = ItemView(p, self.request, self.parentView) yield dict(url=view.url, title=view.title) if parents: yield dict(url=self.url, title=self.title) class BSCWView(BaseView): viewTemplate = view_macros itemView = ItemView def __call__(self): if isinstance(self.remoteProxy, File): view = self.itemView(self.remoteProxy, self.request, self) return view.download() else: return self.index() @Lazy def dataMacro(self): return self.viewTemplate.macros['data'] @Lazy def headingMacro(self): return self.viewTemplate.macros['heading'] @Lazy def itemMacro(self): if self.remoteProxy is None: return None typeName = self.remoteProxy.itemType.lower() return self.viewTemplate.macros.get(typeName, self.defaultMacro) @Lazy def defaultMacro(self): return self.viewTemplate.macros['default'] @Lazy def remoteProxy(self): id = self.request.form.get('id') proxy = self.context.getProxy(address=id) return proxy @Lazy def item(self): if self.remoteProxy is None: return None return self.itemView(self.remoteProxy, self.request, self) def content(self): proxy = self.remoteProxy for obj in proxy.values(): yield self.itemView(obj, self.request, self)