Author: jmorliaguet Date: Sun Oct 9 19:05:32 2005 New Revision: 28087 Modified: z3lab/cpsskins/branches/jmo-perspectives/browser/authoring/__init__.py z3lab/cpsskins/branches/jmo-perspectives/browser/elements/__init__.py z3lab/cpsskins/branches/jmo-perspectives/browser/elements/configure.zcml z3lab/cpsskins/branches/jmo-perspectives/browser/elements/interfaces.py z3lab/cpsskins/branches/jmo-perspectives/browser/elements/slot.py z3lab/cpsskins/branches/jmo-perspectives/elements/slot.py z3lab/cpsskins/branches/jmo-perspectives/thememanager.py Log:
- saving work: - added an element mover adapter INodeMoving (working for theme elements, not yet working with portlets in slots) Modified: z3lab/cpsskins/branches/jmo-perspectives/browser/authoring/__init__.py ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/browser/authoring/__init__.py (original) +++ z3lab/cpsskins/branches/jmo-perspectives/browser/authoring/__init__.py Sun Oct 9 19:05:32 2005 @@ -19,8 +19,7 @@ from zope.app import zapi from zope.app.container.browser.contents import Contents -from zope.app.copypastemove.interfaces import IObjectMover, IObjectCopier -from zope.app.event.objectevent import ObjectCreatedEvent +from zope.app.copypastemove.interfaces import IObjectCopier from zope.app.location.traversing import LocationPhysicallyLocatable from zope.app.publisher.browser import BrowserView from zope.app.session.interfaces import ISession @@ -28,7 +27,6 @@ from zope.app.zapi import queryMultiAdapter, getMultiAdapter from zope.component import adapts from zope.component.interfaces import IFactory -from zope.event import notify from zope.interface import implements from zope.security.proxy import removeSecurityProxy @@ -38,7 +36,7 @@ from cpsskins.elements.interfaces import IElement from cpsskins.elements.interfaces import IViewable, IDisplayable, IFormattable from cpsskins.browser.elements.interfaces import INodeAdding, INodeRemoving -from cpsskins.browser.elements.interfaces import INodeOrdering +from cpsskins.browser.elements.interfaces import INodeMoving, INodeOrdering from cpsskins.browser.renderers.interfaces import IRenderer from cpsskins.thememanager import getThemeManager @@ -234,7 +232,6 @@ factory = zapi.getUtility(IFactory, type_name) content = factory() - notify(ObjectCreatedEvent(content)) adding = getMultiAdapter((container, request), INodeAdding) added = adding.add(content) @@ -246,16 +243,13 @@ """Move an element to another destination element. return the id of the moved element. """ + request = self.request element = self._getElementById(src_id) dest_container = self._getElementById(dest_id) # move the element to the destination container - if dest_container == getParent(element): - moved = element - moved_name = src_id - else: - mover = IObjectMover(element) - moved_name = mover.moveTo(dest_container) - moved = dest_container[moved_name] + moving = getMultiAdapter((dest_container, request), INodeMoving) + moved = moving.move(element) + # move the element to the specified order moved_id = moved.getIdentifier() self.reorderElement(moved_id, int(order)) Modified: z3lab/cpsskins/branches/jmo-perspectives/browser/elements/__init__.py ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/browser/elements/__init__.py (original) +++ z3lab/cpsskins/branches/jmo-perspectives/browser/elements/__init__.py Sun Oct 9 19:05:32 2005 @@ -19,15 +19,30 @@ from zope.app.publisher.browser import BrowserView from zope.app.container.browser.adding import Adding +from zope.app.copypastemove.interfaces import IObjectMover +from zope.app.traversing.api import getParent from zope.interface import implements -from interfaces import INodeAdding, INodeRemoving, INodeOrdering +from interfaces import INodeAdding, INodeRemoving, INodeOrdering, INodeMoving class NodeAdding(Adding): """A view for adding element into nodes """ implements(INodeAdding) +class NodeMoving(BrowserView): + """A view for moving elements between nodes + """ + implements(INodeMoving) + + def move(self, content): + container = self.context + if container == getParent(content): + return content + mover = IObjectMover(content) + moved_name = mover.moveTo(container) + return container[moved_name] + class NodeRemoving(BrowserView): """A view for removing elements from nodes """ Modified: z3lab/cpsskins/branches/jmo-perspectives/browser/elements/configure.zcml ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/browser/elements/configure.zcml (original) +++ z3lab/cpsskins/branches/jmo-perspectives/browser/elements/configure.zcml Sun Oct 9 19:05:32 2005 @@ -27,6 +27,13 @@ provides=".interfaces.INodeOrdering" /> + <adapter + for="cpsskins.elements.interfaces.ITheme + zope.publisher.interfaces.IRequest" + factory=".NodeMoving" + provides=".interfaces.INodeMoving" + /> + <!-- Page --> <adapter @@ -50,6 +57,13 @@ provides=".interfaces.INodeOrdering" /> + <adapter + for="cpsskins.elements.interfaces.IThemePage + zope.publisher.interfaces.IRequest" + factory=".NodeMoving" + provides=".interfaces.INodeMoving" + /> + <!-- Page block --> <adapter @@ -73,6 +87,13 @@ provides=".interfaces.INodeOrdering" /> + <adapter + for="cpsskins.elements.interfaces.IPageBlock + zope.publisher.interfaces.IRequest" + factory=".NodeMoving" + provides=".interfaces.INodeMoving" + /> + <!-- Cell --> <adapter @@ -96,6 +117,13 @@ provides=".interfaces.INodeOrdering" /> + <adapter + for="cpsskins.elements.interfaces.ICell + zope.publisher.interfaces.IRequest" + factory=".NodeMoving" + provides=".interfaces.INodeMoving" + /> + <!-- Slot --> <adapter @@ -119,4 +147,11 @@ provides=".interfaces.INodeOrdering" /> + <adapter + for="cpsskins.elements.interfaces.ISlot + zope.publisher.interfaces.IRequest" + factory=".slot.SlotMoving" + provides=".interfaces.INodeMoving" + /> + </configure> Modified: z3lab/cpsskins/branches/jmo-perspectives/browser/elements/interfaces.py ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/browser/elements/interfaces.py (original) +++ z3lab/cpsskins/branches/jmo-perspectives/browser/elements/interfaces.py Sun Oct 9 19:05:32 2005 @@ -26,6 +26,13 @@ def add(element): """Add an element to the node.""" +# Moving elements between nodes +class INodeMoving(IView): + """Removing elements between nodes.""" + + def move(element): + """Mmove element to a destination node.""" + # Removing elements from nodes class INodeRemoving(IView): """Removing elements from nodes.""" Modified: z3lab/cpsskins/branches/jmo-perspectives/browser/elements/slot.py ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/browser/elements/slot.py (original) +++ z3lab/cpsskins/branches/jmo-perspectives/browser/elements/slot.py Sun Oct 9 19:05:32 2005 @@ -19,6 +19,7 @@ from zope.app.container.browser.adding import Adding from zope.app.publisher.browser import BrowserView +from zope.app.traversing.api import getParent from zope.app.zapi import getMultiAdapter from zope.interface import implements @@ -26,7 +27,7 @@ from cpsskins.elements.interfaces import IDisplayable from cpsskins.elements.interfaces import IPortlet from cpsskins.thememanager import getThemeManager -from interfaces import INodeAdding, INodeRemoving, INodeOrdering +from interfaces import INodeAdding, INodeRemoving, INodeOrdering, INodeMoving class SlotAdding(Adding): """A view for adding elements into slots @@ -66,6 +67,27 @@ return portlet +class SlotMoving(BrowserView): + """A view for moving elements between slots + """ + implements(INodeMoving) + + def move(self, content): + src_container = getParent(content) + dest_container = self.context + request = self.request + if dest_container == src_container: + return content + + tmutil = getThemeManager() + + tmutil.movePortlet( + src_slot=src_container, + dest_slot=dest_container, + portlet=content, + ) + return content + class SlotRemoving(BrowserView): """A view for removing elements from slots """ Modified: z3lab/cpsskins/branches/jmo-perspectives/elements/slot.py ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/elements/slot.py (original) +++ z3lab/cpsskins/branches/jmo-perspectives/elements/slot.py Sun Oct 9 19:05:32 2005 @@ -63,21 +63,22 @@ return [] if iface and not iface is IPortlet: return [] + reltool = RelationTool(self) display = info.display - perspective = info.perspective - if perspective is not None: + + if perspective is None: portlets = reltool.getSeconds( - predicate=hasPortletFromPerspective, + predicate=hasPortlet, first=self, - third=perspective, - ) + ) else: portlets = reltool.getSeconds( - predicate=hasPortlet, + predicate=hasPortletFromPerspective, first=self, - ) + third=perspective, + ) # the portlet order is obtained from the display, if the display is # iterable otherwise the portlets are sorted by their identifier. Modified: z3lab/cpsskins/branches/jmo-perspectives/thememanager.py ============================================================================== --- z3lab/cpsskins/branches/jmo-perspectives/thememanager.py (original) +++ z3lab/cpsskins/branches/jmo-perspectives/thememanager.py Sun Oct 9 19:05:32 2005 @@ -176,6 +176,58 @@ portlets = theme.getStorage(IPortletStorage) return portlets[name] + def movePortlet(self, src_slot, dest_slot, portlet): + """Move a portlet between slots. + """ + + reltool = RelationTool(portlet) + + relations = reltool.search( + predicate=hasPortlet, + first=src_slot, + second=portlet, + ) + reltool.search( + predicate=hasPortletFromPerspective, + first=src_slot, + second=portlet, + ) + + rel = relations[0] + perspective = len(rel) == 3 and rel.third or None + + if perspective is not None: + relation = TriadicRelation( + predicate=hasPortletFromPerspective, + first=dest_slot, + second=portlet, + third=perspective, + ) + ids = reltool.search( + predicate=hasPortletFromPerspective, + first=src_slot, + second=portlet, + third=perspective, + ) + else: + relation = DyadicRelation( + predicate=hasPortlet, + first=dest_slot, + second=portlet, + ) + ids = reltool.search( + predicate=hasPortlet, + first=src_slot, + second=portlet, + ) + + theme = self.getThemeInContext(src_slot) + relations = theme.getStorage(IRelationStorage) + relations.add(relation) + + reltool.remove(ids) + + portlet.__parent__ = dest_slot + def setPortlet(self, slot, portlet, perspective): """Set a portlet in a slot """ -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins