From 73311e2cf84706a6a3fd5d8e36863b40c2bb98ed Mon Sep 17 00:00:00 2001 From: helmutm Date: Sat, 7 Jun 2008 11:54:06 +0000 Subject: [PATCH] rearrange classes, added separate BSCWConnection class git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2675 fd906abe-77d9-0310-91a1-e0d9ade77398 --- integrator/browser/bscw.py | 20 ++------ integrator/browser/view.pt | 16 ++++-- integrator/bscw.py | 99 ++++++++++++++++++++++++++++---------- integrator/bscw.txt | 30 ++++++------ integrator/tests/bscw.py | 19 ++++++-- 5 files changed, 118 insertions(+), 66 deletions(-) diff --git a/integrator/browser/bscw.py b/integrator/browser/bscw.py index 3c5084e..47d0284 100644 --- a/integrator/browser/bscw.py +++ b/integrator/browser/bscw.py @@ -29,6 +29,7 @@ from zope.traversing.browser import absoluteURL from cybertools.integrator.bscw import ContainerFactory from cybertools.integrator.interfaces import IContainerFactory +from cybertools.integrator.interfaces import IItemFactory, IFileFactory view_macros = ViewPageTemplateFile('view.pt') @@ -74,9 +75,6 @@ class BSCWView(BaseView): viewTemplate = view_macros itemView = ItemView - baseUrl = '' - baseId = '' - @Lazy def listing(self): return self.viewTemplate.macros['listing'] @@ -87,16 +85,9 @@ class BSCWView(BaseView): @Lazy def remoteProxy(self): - url = self.context.getRepositoryURL() - if isinstance(url, basestring): - server, id = url.rsplit('/', 1) - self.baseUrl = server - else: # already a real server object - server = url - id = self.baseId - id = self.request.form.get('id', id) - factory = component.getUtility(IContainerFactory, name='bscw') - return factory(id, server=server, baseUrl=self.baseUrl) + id = self.request.form.get('id') + proxy = self.context.getProxy(address=id) + return proxy @Lazy def item(self): @@ -107,6 +98,3 @@ class BSCWView(BaseView): for obj in proxy.values(): yield self.itemView(obj, self.request, self) - #def getUrlForObject(self, obj): - # url = absoluteURL(self.context, self.request) - # return '%s?id=%s' % (url, obj.internalPath) diff --git a/integrator/browser/view.pt b/integrator/browser/view.pt index 42e87b3..2f62ab7 100644 --- a/integrator/browser/view.pt +++ b/integrator/browser/view.pt @@ -9,14 +9,24 @@ + + + + + + + + + + + + -
+
BSCW Repository diff --git a/integrator/bscw.py b/integrator/bscw.py index 6563e73..fefe2f5 100644 --- a/integrator/bscw.py +++ b/integrator/bscw.py @@ -33,6 +33,8 @@ from zope.interface import implements, Attribute from cybertools.integrator.base import ContainerFactory, ItemFactory, FileFactory from cybertools.integrator.base import ReadContainer, Item, File, Image from cybertools.integrator.base import ExternalUrlInfo +from cybertools.integrator.interfaces import IContainerFactory +from cybertools.integrator.interfaces import IItemFactory, IFileFactory from cybertools.text import mimetypes @@ -53,6 +55,63 @@ urlAttributes = ['url_link', 'last_verified', 'last_error', 'content_length', classes = ['cl_core.Folder', 'cl_core.Document', 'cl_core.URL', ] +class BSCWConnection(object): + + factoryName = 'bscw' + + baseURL = rootId = '' + + def __init__(self, url, server=None): + self.repositoryURL = url + self.setURLs() + if server is None: + server = ServerProxy(self.baseURL()) + self.server = server + + def getRepositoryURL(self): + return self.repositoryURL + + def setURLs(self): + url = self.getRepositoryURL() + if url: + self.baseURL, self.rootId = url.rsplit('/', 1) + + def getItem(self, address): + return self.server.get_attributes(address, + ['__class__', 'type', 'id', 'name', 'descr', 'url_link'], 1, True) + + def getProxy(self, item=None, address=None, parentPath=''): + if item is None: + if address is None: + address = self.rootId + item = self.getItem(address)[0] + address = item['id'] + itemType = item['__class__'].split('.')[-1] + internalPath = '/'.join((parentPath, address)).strip('/') + params = dict(connection=self, internalPath=internalPath, + properties=item, baseURL=self.baseURL, + itemType=itemType) + if itemType == 'Folder': + return self.containerFactory(address, **params) + elif itemType == 'Document': + return self.fileFactory(address, contentType=item['type'], + **params) + else: + return self.itemFactory(address, **params) + + @Lazy + def itemFactory(self): + return component.getUtility(IItemFactory, name=self.factoryName) + + @Lazy + def fileFactory(self): + return component.getUtility(IFileFactory, name=self.factoryName) + + @Lazy + def containerFactory(self): + return component.getUtility(IContainerFactory, name=self.factoryName) + + # proxy classes class BSCWProxyBase(object): @@ -62,7 +121,15 @@ class BSCWProxyBase(object): id = self.address if id.startswith('bs_'): id = id[3:] - return ExternalUrlInfo(self.baseUrl, id) + return ExternalUrlInfo(self.baseURL, id) + + @Lazy + def attributes(self): + return self.connection.getItem(self.address) + + @Lazy + def properties(self): + return self.attributes[0] @Lazy def title(self): @@ -77,15 +144,6 @@ class ReadContainer(BSCWProxyBase, ReadContainer): factoryName = 'bscw' - @Lazy - def properties(self): - return self.attributes[0] - - @Lazy - def attributes(self): - return self.server.get_attributes(self.address, - ['__class__', 'type', 'id', 'name', 'descr', 'url_link'], 1, True) - @Lazy def data(self): data = self.attributes @@ -109,18 +167,7 @@ class ReadContainer(BSCWProxyBase, ReadContainer): if key not in self.data: return default item = self.data[key] - itemType = item['__class__'].split('.')[-1] - internalPath = '/'.join((self.internalPath, key)).strip('/') - params = dict(server=self.server, internalPath=internalPath, - properties=item, baseUrl=self.baseUrl, - itemType=itemType) - if itemType == 'Folder': - return self.containerFactory(item['id'], **params) - elif itemType == 'Document': - return self.fileFactory(item['id'], contentType=item['type'], - **params) - else: - return self.itemFactory(item['id'], **params) + return self.connection.getProxy(item) def values(self): return [self.get(k) for k in self] @@ -164,13 +211,13 @@ class ContainerFactory(ContainerFactory): proxyClass = ReadContainer - def __call__(self, address, **kw): + def xxx__call__(self, address, **kw): server = kw.pop('server') if isinstance(server, basestring): # just a URL, resolve for XML-RPC server = ServerProxy(server) - baseUrl = server - baseUrl = kw.pop('baseUrl', '') - return self.proxyClass(address, server=server, baseUrl=baseUrl, **kw) + baseURL = server + baseURL = kw.pop('baseURL', '') + return self.proxyClass(address, server=server, baseURL=baseURL, **kw) class ItemFactory(ItemFactory): diff --git a/integrator/bscw.txt b/integrator/bscw.txt index fa286e9..a423e77 100644 --- a/integrator/bscw.txt +++ b/integrator/bscw.txt @@ -12,7 +12,7 @@ Integration of external sources. Accessing Objects on a Remote BSCW Repository ============================================= -In fact we do not access a remote repository but just a dummy (fake) +During testing we do not access a remote repository but just a dummy (fake) repository for testing purposes. >>> from cybertools.integrator.tests.bscw import BSCWServer, sampleObjects @@ -33,19 +33,23 @@ Let's first register the proxy factory utilities. >>> component.provideUtility(ItemFactory(), name='bscw') >>> component.provideUtility(FileFactory(), name='bscw') -We can now access the root object of the BSCW repository +We can now access the root object of the BSCW repository. - >>> from cybertools.integrator.interfaces import IContainerFactory - >>> root = component.getUtility(IContainerFactory, name='bscw')('4', server=server, - ... baseUrl='http://localhost/bscw.cgi/') + >>> from cybertools.integrator.bscw import BSCWConnection + >>> connection = BSCWConnection('http://localhost/bscw.cgi/4', + ... server=server) + + >>> root = connection.getProxy() + >>> root + <...bscw.ReadContainer...> >>> sorted(root.items()) - [('bs_5', <...ReadContainer object...>)] + [('bs_5', <...bscw.ReadContainer object...>)] >>> root.address - '4' + 'bs_4' >>> root.internalPath - '' + 'bs_4' >>> root.icon 'folder' >>> root.properties @@ -65,7 +69,7 @@ Let's also have a look at the item contained in the root object. ... ['__class__', 'type', 'id', 'name', 'descr', 'url_link'], 1, True) >>> bs_5.items() - [] + [('bs_6', <...bscw.File ...>), ('bs_7', <...bscw.Item ...>)] >>> bs_5.address 'bs_5' >>> bs_5.internalPath @@ -82,13 +86,7 @@ Let's also have a look at the item contained in the root object. The BSCW Repository View ======================== - >>> class BSCWAccess(object): - ... def __init__(self, server): - ... self.server = server - ... def getRepositoryURL(self): - ... return self.server - - >>> site['bscw'] = BSCWAccess(server) + >>> site['bscw'] = connection >>> bscwAccess = site['bscw'] >>> from cybertools.integrator.browser.bscw import BSCWView diff --git a/integrator/tests/bscw.py b/integrator/tests/bscw.py index fe9746c..b152023 100644 --- a/integrator/tests/bscw.py +++ b/integrator/tests/bscw.py @@ -31,6 +31,7 @@ class Artifact(dict): attributes = bscw.baseAttributes repository = None + content = '' def __init__(self, id, **kw): if not id.startswith('bs_'): @@ -69,14 +70,19 @@ class BSCWRepository(dict): sampleObjects = BSCWRepository( Artifact('4', name='public', descr='Public Repository', children=['5'], containers=[dict(__id__='4711', name='Community of Anonymous')]), - Artifact('5', name='Introduction', descr='Introduction to BSCW'), + Artifact('5', name='Introduction', descr='Introduction to BSCW', + children=['6', '7']), + Artifact('6', name='Overview', descr='BSCW Overview', + __class__='cl_core.Document', type='application/pdf'), + Artifact('7', name='BSCW Home', descr='BSCW Homepage', + __class__='cl_core.URL', url_link='http://www.bscw.de/'), ) class BSCWServer(object): def __init__(self, objects): - self. objects = objects + self.objects = objects def get_attributes(self, id=None, attribute_names=['__id__', 'name'], depth=0, nested=False, offset=0, number=0, sorted_by=None): @@ -84,11 +90,14 @@ class BSCWServer(object): if obj is None: raise Fault(10101, 'Bad object id: %s' % id) result = [obj.getData(attribute_names)] + children = [] if nested: for level in range(depth): for id in obj.children: - result.append(self.get_attributes(id, attribute_names, - depth-1, nested, offset, number, sorted_by)) + if not children: + result.append(children) + children.append(self.get_attributes(id, attribute_names, + depth-1, nested, offset, number, sorted_by)[0]) return result def get_attributenames(self, __class__): @@ -98,7 +107,7 @@ class BSCWServer(object): obj = self.objects.get(id) if obj is None: raise Fault(10101, 'Bad object id: %s' % id) - return '' + return obj.get('content', '') def get_path(id): return self.get_attributes(id, ['containers'])[0].get('containers', [])