Refactored ordered container stuff out of loops package and put into cybertools.container

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1036 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-01-27 08:21:51 +00:00
parent dedd7d8736
commit 3cbba1d593
7 changed files with 1 additions and 308 deletions

View file

@ -330,14 +330,10 @@ Let's add some more nodes and reorder them:
>>> m11.keys()
['m111', 'm112', 'm113', 'm114']
>>> m11.moveSubNodesByDelta(['m113'], -1)
>>> m11.keys()
['m111', 'm113', 'm112', 'm114']
A special management view provides methods for moving objects down, up,
to the bottom, and to the top
>>> from loops.browser.node import OrderedContainerView
>>> from cybertools.container.ordered import OrderedContainerView
>>> view = OrderedContainerView(m11, TestRequest())
>>> view.moveToBottom(('m113',))
>>> m11.keys()

View file

@ -333,25 +333,10 @@
name="node.html"
/>
<!-- move nodes up and down -->
<containerViews
for="loops.interfaces.IBaseNode"
index="zope.ManageContent"
add="zope.ManageContent"
/>
<pages
for="loops.interfaces.IBaseNode"
class=".node.OrderedContainerView"
permission="zope.ManageContent">
<page name="contents.html" template="contents.pt"
menu="zmi_views" title="Contents"
/>
<page name="move_down" attribute="moveDown" />
<page name="move_up" attribute="moveUp" />
<page name="move_bottom" attribute="moveToBottom" />
<page name="move_top" attribute="moveToTop" />
</pages>
</configure>

View file

@ -1,216 +0,0 @@
<html metal:use-macro="context/@@standard_macros/view"
i18n:domain="zope">
<body>
<div metal:fill-slot="body">
<div metal:define-macro="contents">
<tal:checkmove define="isMoveAction view/checkMoveAction">
<tal:showlisting condition="not:isMoveAction">
<form name="containerContentsForm" method="post" action="."
tal:attributes="action request/URL"
tal:define="container_contents view/listContentInfo">
<input type="hidden" name="type_name" value=""
tal:attributes="value request/type_name"
tal:condition="request/type_name|nothing"
/>
<input type="hidden" name="retitle_id" value=""
tal:attributes="value request/retitle_id"
tal:condition="request/retitle_id|nothing"
/>
<div class="page_error"
tal:condition="view/error"
tal:content="view/error"
i18n:translate="">
Error message
</div>
<table id="sortable" class="listing" summary="Content listing"
i18n:attributes="summary">
<thead>
<tr>
<th>&nbsp;</th>
<th i18n:translate="">Name</th>
<th i18n:translate="">Title</th>
<th i18n:translate="">Size</th>
<th i18n:translate="">Created</th>
<th i18n:translate="">Modified</th>
</tr>
</thead>
<tbody>
<metal:block tal:condition="view/hasAdding">
<tr tal:define="names_required context/@@+/nameAllowed"
tal:condition="python:names_required and request.has_key('type_name')">
<td></td>
<td><input name="new_value" id="focusid" value="" /></td>
<td></td>
<td></td>
<td></td>
</tr>
</metal:block>
<metal:block tal:define="supportsRename view/supportsRename"
tal:repeat="item container_contents">
<tr tal:define="oddrow repeat/item/odd; url item/url;
id_quoted item/id/url:quote"
tal:attributes="class python:oddrow and 'even' or 'odd'" >
<td>
<input type="checkbox" class="noborder" name="ids:list" id="#"
value="#"
tal:attributes="value item/id;
id item/cb_id;
checked request/ids_checked|nothing;"/>
</td>
<td><a href="#"
tal:attributes="href
string:${url}/@@SelectedManagementView.html"
tal:content="structure item/icon|default">
</a
><span tal:condition="item/rename"
><input name="new_value:list"
tal:attributes="value item/id"
/><input type="hidden" name="rename_ids:list" value=""
tal:attributes="value item/rename"
/></span
><span tal:condition="not:item/rename">
<a href="#"
tal:attributes="href
string:${url}/@@SelectedManagementView.html"
tal:content="item/id"
i18n:translate=""
>foo</a
><a href="#"
tal:attributes="href
string:${request/URL}?rename_ids:list=${id_quoted}"
tal:condition="supportsRename"
>&nbsp;&nbsp;</a
></span
></td>
<td>
<input name="new_value" id="focusid"
tal:attributes="value item/title|nothing"
tal:condition="item/retitle"
/>
<a href="#"
tal:attributes="href
string:${request/URL}?retitle_id=${id_quoted}"
tal:condition="item/retitleable"
tal:content="item/title|default"
i18n:translate=""
>&nbsp;&nbsp;&nbsp;&nbsp;</a>
<span
tal:condition="item/plaintitle"
tal:content="item/title|default"
i18n:translate=""
>&nbsp;&nbsp;&nbsp;&nbsp;</span>
</td>
<td><span tal:content="item/size/sizeForDisplay|nothing"
i18n:translate="">
&nbsp;</span></td>
<td><span tal:define="created item/created|default"
tal:content="created"
i18n:translate="">&nbsp;</span></td>
<td><span tal:define="modified item/modified|default"
tal:content="modified"
i18n:translate="">&nbsp;</span></td>
</tr>
</metal:block>
</tbody>
</table>
<div tal:condition="view/normalButtons">
<input type="submit" name="container_rename_button" value="Rename"
i18n:attributes="value container-rename-button"
tal:condition="view/supportsRename"
/>
<input type="submit" name="container_cut_button" value="Cut"
i18n:attributes="value container-cut-button"
tal:condition="view/supportsCut"
/>
<input type="submit" name="container_copy_button" value="Copy"
i18n:attributes="value container-copy-button"
tal:condition="view/supportsCopy"
/>
<input type="submit" name="container_paste_button" value="Paste"
tal:condition="view/hasClipboardContents"
i18n:attributes="value container-paste-button"
/>
<input type="submit" name="container_delete_button" value="Delete"
i18n:attributes="value container-delete-button"
tal:condition="view/supportsDelete"
i18n:domain="zope"
/>
<div tal:condition="view/hasAdding" tal:omit-tag="">
<div tal:omit-tag=""
tal:define="adding nocall:context/@@+;
addingInfo adding/addingInfo;
has_custom_add_view adding/hasCustomAddView;
names_required adding/nameAllowed"
tal:condition="adding/isSingleMenuItem">
<input type="submit" name="container_add_button" value="Add"
i18n:attributes="value add-button"
i18n:domain="zope"
/>
<input type="text" name="single_new_value" id="focusid"
tal:condition="python:names_required and not has_custom_add_view"
i18n:domain="zope"
/>
<input type="hidden" name="single_type_name"
value=""
tal:attributes="value python:addingInfo[0]['action']"
/>
</div>
</div>
<div tal:condition="view/orderable">
<input type="submit" name="move_top" value="Top"
i18n:attributes="value container-movetop-button"
i18n:domain="zope" />
<input type="submit" name="move_up" value="Up"
i18n:attributes="value container-moveup-button"
i18n:domain="zope" />
<input type="text" size="2" name="delta" value="1" />
<input type="submit" name="move_down" value="Down"
i18n:attributes="value container-moveup-button"
i18n:domain="zope" />
<input type="submit" name="move_bottom" value="Bottom"
i18n:attributes="value container-movebottom-button"
i18n:domain="zope" />
</div>
</div>
<div tal:condition="view/specialButtons">
<input type="submit" value="Apply"
i18n:attributes="value container-apply-button"
/>
<input type="submit" name="container_cancel_button" value="Cancel"
i18n:attributes="value container-cancel-button"
/>
</div>
</form>
</tal:showlisting>
</tal:checkmove>
<script type="text/javascript"><!--
if (document.containerContentsForm.new_value)
document.containerContentsForm.new_value.focus();
//-->
</script>
</div>
</div>
</body>
</html>

View file

@ -132,49 +132,3 @@ class ConfigureView(object):
self.delegate.checkCreateTarget()
return super(ConfigureView, self).update()
class OrderedContainerView(JustContents):
""" A view providing the necessary methods for moving sub-objects
within an ordered container.
"""
@Lazy
def url(self):
return zapi.absoluteURL(self.context, self.request)
@Lazy
def orderable(self):
return len(self.context) > 1
def checkMoveAction(self):
request = self.request
for var in request:
if var.startswith('move_'):
params = []
if 'delta' in request:
params.append('delta=' + request['delta'])
if 'ids' in request:
for id in request['ids']:
params.append('ids:list=' + id)
request.response.redirect('%s/%s?%s'
% (self.url, var, '&'.join(params)))
return True
return False
def moveDown(self, ids=[], delta=1):
self.context.moveSubNodesByDelta(ids, int(delta))
self.request.response.redirect(self.url + '/contents.html')
def moveUp(self, ids=[], delta=1):
self.context.moveSubNodesByDelta(ids, -int(delta))
self.request.response.redirect(self.url + '/contents.html')
def moveToBottom(self, ids=[]):
self.context.moveSubNodesByDelta(ids, len(self.context))
self.request.response.redirect(self.url + '/contents.html')
def moveToTop(self, ids=[]):
self.context.moveSubNodesByDelta(ids, -len(self.context))
self.request.response.redirect(self.url + '/contents.html')

View file

@ -264,12 +264,6 @@ class INode(IView, IBaseNode):
a menu).
"""
def moveSubNodesByDelta(names, delta):
""" Move the sub-nodes specified by the list of names up
(negative delta) or down (positive delta) by the number of places
specified by delta.
"""
class IViewManager(ILoopsObject, IBaseNode):
""" A manager/container for views.

16
util.py
View file

@ -22,22 +22,6 @@ Utility functions.
$Id$
"""
def moveByDelta(objs, toMove, delta):
""" Return the list given by objs resorted in a way that the elements
of toMove (which must be in the objs list) have been moved by delta.
"""
result = [obj for obj in objs if obj not in toMove]
if delta < 0:
objs = list(reversed(objs))
result.reverse()
toMove = sorted(toMove, lambda x,y: cmp(objs.index(x), objs.index(y)))
for element in toMove:
newPos = min(len(result), objs.index(element) + abs(delta))
result.insert(newPos, element)
if delta < 0:
result.reverse()
return result
def nl2br(text):
if not text: return text
if '\n' in text: # Unix or DOS line endings

View file

@ -39,7 +39,6 @@ from cybertools.relation.registry import IRelationsRegistry, getRelations
from interfaces import IView, INode, INodeConfigSchema
from interfaces import IViewManager, INodeContained
from interfaces import ILoopsContained
from util import moveByDelta
class View(object):
@ -134,9 +133,6 @@ class Node(View, OrderedContainer):
def getTextItems(self):
return self.getChildNodes(['text'])
def moveSubNodesByDelta(self, names, delta):
self.updateOrder(moveByDelta(self.keys(), names, delta))
class ViewManager(OrderedContainer):