Reorganized NodeView - use generator of view objects instead list of dictionaries
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1012 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
6d01b8a1f2
commit
e3595e882a
3 changed files with 49 additions and 49 deletions
33
README.txt
33
README.txt
|
@ -214,27 +214,20 @@ Node views
|
|||
----------
|
||||
|
||||
>>> from loops.browser.node import NodeView
|
||||
>>> view = NodeView(m1, TestRequest())
|
||||
>>> view.menu()
|
||||
{'url': 'http://127.0.0.1/loops/views/m1',
|
||||
'items': [{'url': 'http://127.0.0.1/loops/views/m1/m11', 'items': [],
|
||||
'selected': False, 'title': u'Zope'}],
|
||||
'selected': True, 'title': u'Menu'}
|
||||
>>> view.content()
|
||||
{'url': 'http://127.0.0.1/loops/views/m1', 'body': u'', 'items': [],
|
||||
'editable': False, 'title': u'Menu'}
|
||||
|
||||
>>> view = NodeView(m11, TestRequest())
|
||||
>>> view.menu()
|
||||
{'url': 'http://127.0.0.1/loops/views/m1',
|
||||
'items': [{'url': 'http://127.0.0.1/loops/views/m1/m11', 'items': [],
|
||||
'selected': True, 'title': u'Zope'}],
|
||||
'selected': False, 'title': u'Menu'}
|
||||
>>> view.content()
|
||||
{'url': 'http://127.0.0.1/loops/views/m1/m11', 'body': u'',
|
||||
'items': [{'url': 'http://127.0.0.1/loops/views/m1/m11/m112',
|
||||
'body': u'', 'items': [], 'editable': False, 'title': u'Zope 3'}],
|
||||
'editable': False, 'title': u'Zope'}
|
||||
|
||||
>>> page = view.page()
|
||||
>>> items = page.textItems()
|
||||
>>> for item in items:
|
||||
... print item.url, item.editable
|
||||
http://127.0.0.1/loops/views/m1/m11/m112 False
|
||||
|
||||
>>> menu = view.menu()
|
||||
>>> items = menu.menuItems()
|
||||
>>> for item in items:
|
||||
... print item.url, view.selected(item)
|
||||
http://127.0.0.1/loops/views/m1/m11 True
|
||||
|
||||
|
||||
Ordering Nodes
|
||||
--------------
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
|
||||
<metal:body fill-slot="body">
|
||||
<tal:content define="item view/content;
|
||||
<tal:content define="item view/page;
|
||||
level level|python: 1">
|
||||
|
||||
<metal:block define-macro="content">
|
||||
|
@ -24,13 +24,14 @@
|
|||
zmi=window.open('${item/url}/@@edit.html', 'zmi');;
|
||||
zmi.focus();; return false;;"
|
||||
tal:attributes="class string:content-$level;
|
||||
onclick python: item['editable'] and onclick or ''"
|
||||
onclick python: item.editable and onclick or ''"
|
||||
tal:content="structure body">
|
||||
The body
|
||||
</div>
|
||||
<div tal:content="item/context/title" />
|
||||
</tal:body>
|
||||
<tal:sub define="level python:level+1">
|
||||
<tal:items repeat="item item/items">
|
||||
<tal:items repeat="item item/textItems">
|
||||
<metal:portlet use-macro="views/node_macros/content" />
|
||||
</tal:items>
|
||||
</tal:sub>
|
||||
|
@ -50,14 +51,14 @@
|
|||
<metal:menu define-macro="menu">
|
||||
<div class="menu-3"
|
||||
tal:attributes="class python: 'content '
|
||||
+ (item['selected'] and 'even' or 'odd')
|
||||
+ (view.selected(item) and 'even' or 'odd')
|
||||
+ ' menu-%i' % level">
|
||||
<a href="#" class=""
|
||||
tal:content="item/title"
|
||||
tal:content="item/context/title"
|
||||
tal:attributes="href item/url">Menu Text</a>
|
||||
</div>
|
||||
<tal:sub tal:define="level python:level+1">
|
||||
<tal:items repeat="item item/items">
|
||||
<tal:items repeat="item item/menuItems">
|
||||
<metal:portlet use-macro="views/node_macros/menu" />
|
||||
</tal:items>
|
||||
</tal:sub>
|
||||
|
|
|
@ -55,30 +55,36 @@ class NodeView(object):
|
|||
d = dc.modified or dc.created
|
||||
return d and d.strftime('%Y-%m-%d %H:%M') or ''
|
||||
|
||||
def content(self, item=None):
|
||||
if item is None:
|
||||
item = self.context.getPage()
|
||||
if item is None:
|
||||
item = self.context
|
||||
result = {'title': item.title,
|
||||
'url': zapi.absoluteURL(item, self.request),
|
||||
'body': self.render(item.body),
|
||||
'editable': canWrite(item, 'body'),
|
||||
'items': [self.content(child)
|
||||
for child in item.getTextItems()]}
|
||||
return result
|
||||
def page(self):
|
||||
page = self.context.getPage()
|
||||
return page is not None and NodeView(page, self.request) or None
|
||||
|
||||
def menu(self, item=None):
|
||||
if item is None:
|
||||
item = self.context.getMenu()
|
||||
if item is None:
|
||||
return None
|
||||
result = {'title': item.title,
|
||||
'url': zapi.absoluteURL(item, self.request),
|
||||
'selected': item == self.context,
|
||||
'items': [self.menu(child)
|
||||
for child in item.getMenuItems()]}
|
||||
return result
|
||||
def textItems(self):
|
||||
for child in self.context.getTextItems():
|
||||
yield NodeView(child, self.request)
|
||||
|
||||
def menuItems(self):
|
||||
for child in self.context.getMenuItems():
|
||||
yield NodeView(child, self.request)
|
||||
|
||||
def menu(self):
|
||||
menu = self.context.getMenu()
|
||||
return menu is not None and NodeView(menu, self.request) or None
|
||||
|
||||
@Lazy
|
||||
def body(self):
|
||||
return self.render(self.context.body)
|
||||
|
||||
@Lazy
|
||||
def url(self):
|
||||
return zapi.absoluteURL(self.context, self.request)
|
||||
|
||||
@Lazy
|
||||
def editable(self):
|
||||
return canWrite(self.context, 'body')
|
||||
|
||||
def selected(self, item):
|
||||
return item.context == self.context
|
||||
|
||||
|
||||
class OrderedContainerView(JustContents):
|
||||
|
|
Loading…
Add table
Reference in a new issue