From ea156942ece50b990388537915ad312dbf1b7359 Mon Sep 17 00:00:00 2001 From: helmutm Date: Sun, 10 Aug 2008 09:04:21 +0000 Subject: [PATCH] make access fault-tolerant - show error message; show top-level link on breadcrumbs again git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2796 fd906abe-77d9-0310-91a1-e0d9ade77398 --- integrator/browser/bscw.py | 11 ++++++++--- integrator/bscw.py | 29 +++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/integrator/browser/bscw.py b/integrator/browser/bscw.py index 3c3c38c..0d84519 100644 --- a/integrator/browser/bscw.py +++ b/integrator/browser/bscw.py @@ -78,11 +78,12 @@ class ItemView(BaseView): @property def breadCrumbs(self): parents = list(self.context.parents) - for p in reversed(parents[:-1]): + #for p in reversed(parents[:-1]): + 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) + if parents: + yield dict(url=self.url, title=self.title) class BSCWView(BaseView): @@ -100,6 +101,8 @@ class BSCWView(BaseView): @Lazy def itemMacro(self): + if self.remoteProxy is None: + return None typeName = self.remoteProxy.itemType.lower() return self.viewTemplate.macros.get(typeName, self.defaultMacro) @@ -115,6 +118,8 @@ class BSCWView(BaseView): @Lazy def item(self): + if self.remoteProxy is None: + return None return self.itemView(self.remoteProxy, self.request, self) def content(self): diff --git a/integrator/bscw.py b/integrator/bscw.py index e087df9..f61740e 100644 --- a/integrator/bscw.py +++ b/integrator/bscw.py @@ -22,10 +22,11 @@ Access to objects in a BSCW repository. $Id$ """ +import logging import os from datetime import datetime from time import strptime -from xmlrpclib import ServerProxy +from xmlrpclib import ServerProxy, Fault from zope import component from zope.app.file.image import getImageInfo from zope.cachedescriptors.property import Lazy @@ -83,13 +84,25 @@ class BSCWConnection(object): self.baseURL, self.rootId = url.rsplit('/', 1) def getItem(self, address, nested=True): - return self.server.get_attributes(address, standardAttributes, 1, nested) + try: + item = self.server.get_attributes(address, standardAttributes, 1, nested) + except Fault, excp: + logging.getLogger('cybertools.integrator.bscw').warn(str(excp)) + item = None + except Exception, excp: + logging.getLogger('cybertools.integrator.bscw').error(str(excp)) + item = None + return item def getProxy(self, item=None, address=None, parentPath='', nested=True): if item is None: if address is None: address = self.rootId - item = self.getItem(address, nested=nested)[0] + items = self.getItem(address, nested=nested) + if items: + item = items[0] + else: + return None address = item['id'] itemType = item['__class__'].split('.')[-1] internalPath = '/'.join((parentPath, address)).strip('/') @@ -220,7 +233,15 @@ class File(BSCWProxyBase, File): contentType = None def getData(self, num=None): - return self.server.get_document() + try: + data = self.server.get_document() + except Fault, excp: + logging.getLogger('cybertools.integrator.bscw').warn(str(excp)) + item = None + except Exception, excp: + logging.getLogger('cybertools.integrator.bscw').error(str(excp)) + item = None + return data data = property(getData) def getSize(self):