provide breadcrumbs

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2710 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-06-12 19:38:52 +00:00
parent cd10a2db70
commit b6d7bfa7c9
5 changed files with 53 additions and 16 deletions

View file

@ -75,6 +75,13 @@ class ItemView(BaseView):
url = self.parentView.url
return '%s?id=%s' % (url, self.context.internalPath)
@property
def breadCrumbs(self):
for p in reversed(list(self.context.parents)):
view = ItemView(p, self.request, self.parentView)
yield dict(url=view.url, title=view.title)
yield dict(url=self.url, title=self.title)
class BSCWView(BaseView):
@ -112,3 +119,4 @@ class BSCWView(BaseView):
proxy = self.remoteProxy
for obj in proxy.values():
yield self.itemView(obj, self.request, self)

View file

@ -42,7 +42,7 @@ from cybertools.integrator.interfaces import IItemFactory, IFileFactory
baseAttributes = ['__class__', 'name', 'id', 'descr', 'notes',
'bound_sub_artifacts', 'creator', 'owner', 'owners',
'ctime', 'mtime', 'atime', 'lastEvent', 'createEvent',
'lastChange', 'lastMove', 'containers', 'access']
'lastChange', 'lastMove', 'location', 'containers', 'access']
minimalAttributes = ['__class__', 'name', 'id', 'descr', 'mtime']
@ -54,8 +54,9 @@ urlAttributes = ['url_link', 'last_verified', 'last_error', 'content_length',
'content_type', 'content_encoding', 'last_modified']
standardAttributes = ['__class__', 'type', 'id', 'name', 'descr',
'ctime', 'mtime', 'creator', 'owner', 'owner',
'url_link', 'size', 'encoding']
'ctime', 'mtime', 'creator', 'owner', 'owners',
'url_link', 'size', 'encoding',
'containers', 'location']
classes = ['cl_core.Folder', 'cl_core.Document', 'cl_core.URL', ]
@ -81,14 +82,14 @@ class BSCWConnection(object):
if url:
self.baseURL, self.rootId = url.rsplit('/', 1)
def getItem(self, address):
return self.server.get_attributes(address, standardAttributes, 1, True)
def getItem(self, address, nested=True):
return self.server.get_attributes(address, standardAttributes, 1, nested)
def getProxy(self, item=None, address=None, parentPath=''):
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)[0]
item = self.getItem(address, nested=nested)[0]
address = item['id']
itemType = item['__class__'].split('.')[-1]
internalPath = '/'.join((parentPath, address)).strip('/')
@ -122,9 +123,7 @@ class BSCWProxyBase(object):
@Lazy
def externalURLInfo(self):
id = self.address
if id.startswith('bs_'):
id = id[3:]
id = self.address.lstrip('bs_')
return ExternalURLInfo(self.baseURL, id)
@Lazy
@ -148,6 +147,18 @@ class BSCWProxyBase(object):
dt = self.properties['mtime']
return dt and datetime(*(strptime(str(dt), '%Y%m%dT%H:%M:%SZ')[0:6])) or ''
@property
def parents(self):
if self.address.lstrip('bs_') == self.connection.rootId:
return
parentId = self.properties['location']['__id__'].lstrip('bs_')
p = self.connection.getProxy(address=parentId, nested=False)
while parentId != self.connection.rootId:
yield p
parentId = p.properties['location']['__id__'].lstrip('bs_')
p = self.connection.getProxy(address=parentId)
yield p
class ReadContainer(BSCWProxyBase, ReadContainer):

View file

@ -62,6 +62,9 @@ We can now access the root object of the BSCW repository.
>>> str(root.externalURLInfo)
'http://localhost/bscw.cgi/4'
>>> list(root.parents)
[]
Let's also have a look at the item contained in the root object.
>>> bs_5 = root['bs_5']
@ -82,6 +85,16 @@ Let's also have a look at the item contained in the root object.
>>> str(bs_5.externalURLInfo)
'http://localhost/bscw.cgi/5'
>>> bs_5.properties['containers']
[{'name': 'public', '__id__': 'bs_4'}]
>>> [p.address for p in bs_5.parents]
['bs_4']
>>> bs_6 = bs_5['bs_6']
>>> [p.address for p in bs_6.parents]
['bs_5', 'bs_4']
The BSCW Repository View
========================
@ -104,6 +117,10 @@ The BSCW Repository View
>>> items[0].icon
'http://127.0.0.1/++resource++folder.png'
>>> list(items[0].breadCrumbs)
[{'url': 'http://127.0.0.1/bscw?id=bs_4', 'title': 'public'},
{'url': 'http://127.0.0.1/bscw?id=bs_5', 'title': 'Introduction'}]
Fin de partie
=============

View file

@ -32,7 +32,6 @@ from zope.interface import implements, Attribute
from cybertools.integrator.base import ContainerFactory, FileFactory
from cybertools.integrator.base import ReadContainer, File, Image
from cybertools.text import mimetypes
# proxy classes

View file

@ -51,25 +51,27 @@ class BSCWRepository(dict):
for obj in objs:
self[obj.id] = obj
obj.repository = self
self.updateContainersAttribute()
self.updateLocation()
def get(self, key, default=None):
if not key.startswith('bs_'):
key = 'bs_' + key
return super(BSCWRepository, self).get(key, default)
def updateContainersAttribute(self):
def updateLocation(self):
for obj in self.values():
for c in obj.children:
child = self.get(c)
if child is not None:
containerInfo = dict(__id__=child.id, name=child['name'])
child.setdefault('containers', []).append(containerInfo)
containerInfo = dict(__id__=obj.id, name=obj['name'])
child['containers'] = [containerInfo]
child['location'] = containerInfo
sampleObjects = BSCWRepository(
Artifact('4', name='public', descr='Public Repository', children=['5'],
containers=[dict(__id__='4711', name='Community of Anonymous')]),
containers=[dict(__id__='4711', name='Community of Anonymous')],
location=dict(__id__='4711', name='Community of Anonymous')),
Artifact('5', name='Introduction', descr='Introduction to BSCW',
children=['6', '7']),
Artifact('6', name='Overview', descr='BSCW Overview',