def __init__(self, context): self.context = context self.mship = getToolByName(self.context, 'portal_membership') self.sort = IOrderedContainer.providedBy(self.context) and self.mship.checkPermission(permissions.ModifyPortalContent, self.context) self.sort_url = '%s/article_moveitem?anchor=%%s&delta=%%s&item_id=%%s' % self.context.absolute_url() self.show_hide_url = '%s/@@article_showhideitem?anchor=%%s&action=%%s&uid=%%s&component=%%s' % self.context.absolute_url() self.delete = self.mship.checkPermission(permissions.DeleteObjects, self.context)
def migrate_children(self): """Copy childish objects from the old folder to the new one """ subobjs = self.subobjs for id, obj in subobjs.items(): # we have to use _setObject instead of _setOb because it adds the object # to folder._objects but also reindexes all objects. __traceback_info__ = __traceback_info__ = ('migrate_children', self.old, self.orig_id, 'Migrating subobject %s' % id) try: self.new._setObject(id, obj, set_owner=0) except BadRequest: # If we already have the object we need to remove it carefully # and retry. We can assume that such an object must be # autogenerated by a prior migration step and thus is less # correct than the original. Such objects may want to # consider setting the attribute '__replaceable__' to avoid # this. if id in self.new.objectIds(): self.new._delOb(id) if getattr(self.new, '_objects', None) is not None: self.new._objects = tuple([o for o in self.new._objects if o['id'] != id]) self.new._setObject(id, obj, set_owner=0) else: raise # reorder items # in CMF 1.5 Topic is orderable while ATCT's Topic is not orderable # order objects only when old *and* new are orderable we can't check # when creating the map because self.new == None. if self.orderAble and IOrderedContainer.providedBy(self.new): orderMap = self.orderMap for id, pos in orderMap.items(): self.new.moveObjectToPosition(id, pos)
def migrate(self, unittest=0): """Migrates the object """ beforeChange, afterChange = self.getMigrationMethods() lockable = ILockable(self.old, None) if lockable and lockable.locked(): lockable.unlock() for method in beforeChange: __traceback_info__ = (self, method, self.old, self.orig_id) # may raise an exception, catch it later method() # preserve position on rename self.need_order = IOrderedContainer.providedBy(self.parent) if self.need_order: self._position = self.parent.getObjectPosition(self.orig_id) self.renameOld() self.createNew() for method in afterChange: __traceback_info__ = (self, method, self.old, self.orig_id) # may raise an exception, catch it later method() self.reorder() self.remove()
def __init__(self, context): self.context = context self.mship = getToolByName(self.context, 'portal_membership') self.sort = IOrderedContainer.providedBy(self.context) and self.mship.checkPermission(permissions.ModifyPortalContent, self.context) self.sort_url = '%s/article_moveitem?anchor=%%s&delta=%%s&item_id=%%s' % self.context.absolute_url() self.show_hide_url = '%s/@@article_showhideitem?anchor=%%s&action=%%s&uid=%%s&component=%%s' % self.context.absolute_url() self.delete = self.mship.checkPermission(permissions.DeleteObjects, self.context)
def migrate(self, unittest=0): """Migrates the object """ beforeChange, afterChange = self.getMigrationMethods() # Unlock according to plone.locking: lockable = ILockable(self.old, None) if lockable and lockable.locked(): lockable.unlock() # Unlock according to webdav: if self.old.wl_isLocked(): self.old.wl_clearLocks() for method in beforeChange: __traceback_info__ = (self, method, self.old, self.orig_id) # may raise an exception, catch it later method() # preserve position on rename self.need_order = IOrderedContainer.providedBy(self.parent) if self.need_order: self._position = self.parent.getObjectPosition(self.orig_id) self.renameOld() self.createNew() for method in afterChange: __traceback_info__ = (self, method, self.old, self.orig_id) # may raise an exception, catch it later method() self.reorder() self.remove()
def __init__(self, context): self.pos = [] self.component = '' self.context = context self.mship = getToolByName(self.context, 'portal_membership') self.delete = self.mship.checkPermission(permissions.DeleteObjects, self.context) or False self.sort = (IOrderedContainer.providedBy(self.context) and self.mship.checkPermission(permissions.ModifyPortalContent, self.context)) or False
def _extractObjects(self): fragment = self._doc.createDocumentFragment() objects = self.context.objectValues() if not IOrderedContainer.providedBy(self.context): objects = list(objects) objects.sort(lambda x, y: cmp(x.getId(), y.getId())) for obj in objects: exporter = queryMultiAdapter((obj, self.environ), INode) if exporter: fragment.appendChild(exporter.node) return fragment
def _extractObjects(self): fragment = self._doc.createDocumentFragment() objects = self.context.objectValues() if not IOrderedContainer.providedBy(self.context): objects = list(objects) objects.sort(lambda x,y: cmp(x.getId(), y.getId())) for obj in objects: exporter = queryMultiAdapter((obj, self.environ), INode) if exporter: fragment.appendChild(exporter.node) return fragment
def orderable(self): """ """ if self.is_special_type(): return True iface = IOrderedContainer.providedBy(aq_inner(self.context)) attr = self.context.aq_explicit\ .get('sortAttribute', '') == 'getObjPositionInParent' if self.contentFilter.get('sort_on', '') != 'getObjPositionInParent': return False return iface and attr
def orderable(self): """ """ if self.is_special_type(): return True iface = IOrderedContainer.providedBy(aq_inner(self.context)) attr = self.context.aq_explicit\ .get('sortAttribute', '') == 'getObjPositionInParent' if self.contentFilter.get('sort_on', '') != 'getObjPositionInParent': return False return iface and attr
def getOrdering(self): if IPloneSiteRoot.providedBy(self.context): return self.context try: ordering = self.context.aq_base.getOrdering() except AttributeError: if IOrderedContainer.providedBy(self.context): # Archetype return IOrderedContainer(self.context) return None if not IExplicitOrdering.providedBy(ordering): return None return ordering
def _extractObjects(self): fragment = self._doc.createDocumentFragment() objects = self.context.objectValues() if not IOrderedContainer.providedBy(self.context): objects = list(objects) objects.sort(lambda x, y: cmp(x.getId(), y.getId())) for obj in objects: # Check if the object can be exported if not can_export(obj): logger.info("Skipping {}".format(repr(obj))) continue exporter = queryMultiAdapter((obj, self.environ), INode) if exporter: node = exporter.node if node is not None: fragment.appendChild(exporter.node) return fragment
def beforeChange_storeSubojects(self): """store subobjects from old folder This methods gets all subojects from the old folder and removes them from the old. It also preservers the folder order in a dict. For performance reasons the objects are removed from the old folder before it is renamed. Elsewise the objects would be reindex more often. """ orderAble = IOrderedContainer.providedBy(self.old) orderMap = {} subobjs = {} # using objectIds() should be safe with BrokenObjects for id in self.old.objectIds(): obj = getattr(self.old.aq_inner.aq_explicit, id) # Broken object support. Maybe we are able to migrate them? if isinstance(obj, BrokenClass): LOG.warning('BrokenObject in %s' % self.old.absolute_url(1)) #continue if orderAble: try: orderMap[id] = self.old.getObjectPosition(id) except AttributeError: LOG.debug("Broken OrderSupport", exc_info=True) orderAble = 0 subobjs[id] = aq_base(obj) # delOb doesn't call manage_afterAdd which safes some time because it # doesn't unindex an object. The migrate children method uses # _setObject later. This methods indexes the object again and # so updates all catalogs. for id in self.old.objectIds(): # Loop again to remove objects, order is not preserved when # deleting objects self.old._delOb(id) # We need to take care to remove the relevant ids from _objects # otherwise objectValues breaks. if getattr(self.old, '_objects', None) is not None: self.old._objects = tuple([o for o in self.old._objects if o['id'] != id]) self.orderMap = orderMap self.subobjs = subobjs self.orderAble = orderAble
def beforeChange_storeSubojects(self): """store subobjects from old folder This methods gets all subojects from the old folder and removes them from the old. It also preservers the folder order in a dict. For performance reasons the objects are removed from the old folder before it is renamed. Elsewise the objects would be reindex more often. """ orderAble = IOrderedContainer.providedBy(self.old) orderMap = {} subobjs = {} # using objectIds() should be safe with BrokenObjects for id in self.old.objectIds(): obj = getattr(self.old.aq_inner.aq_explicit, id) # Broken object support. Maybe we are able to migrate them? if isinstance(obj, BrokenClass): LOG.warning('BrokenObject in %s' % self.old.absolute_url(1)) #continue if orderAble: try: orderMap[id] = self.old.getObjectPosition(id) or 0 except AttributeError: LOG.debug("Broken OrderSupport", exc_info=True) orderAble = 0 subobjs[id] = aq_base(obj) # delOb doesn't call manage_afterAdd which safes some time because it # doesn't unindex an object. The migrate children method uses # _setObject later. This methods indexes the object again and # so updates all catalogs. for id in self.old.objectIds(): # Loop again to remove objects, order is not preserved when # deleting objects self.old._delOb(id) # We need to take care to remove the relevant ids from _objects # otherwise objectValues breaks. if getattr(self.old, '_objects', None) is not None: self.old._objects = tuple( [o for o in self.old._objects if o['id'] != id]) self.orderMap = orderMap self.subobjs = subobjs self.orderAble = orderAble
def _copyPortalAttributes(self, peer): peer.portal_type = self.context.portal_type peer.content_uid = self.context.UID() peer.id = self.context.id peer.path = '/'.join(self.context.getPhysicalPath()) portal_url = getattr(self.context, 'portal_url', None) if portal_url: peer.relative_path = "/".join( portal_url.getRelativeContentPath(self.context)) wf_tool = getattr(self.context, 'portal_workflow', None) if wf_tool is None: return peer.status = wf_tool.getCatalogVariablesFor( self.context).get('review_state') container = self.context.getParentNode() if not IOrderedContainer.providedBy(container): return peer.folder_position = container.getObjectPosition( self.context.getId())
def migrate_children(self): """Copy childish objects from the old folder to the new one """ subobjs = self.subobjs for id, obj in subobjs.items(): # we have to use _setObject instead of _setOb because it adds the object # to folder._objects but also reindexes all objects. __traceback_info__ = __traceback_info__ = ( 'migrate_children', self.old, self.orig_id, 'Migrating subobject %s' % id) try: self.new._setObject(id, obj, set_owner=0) except BadRequest: # If we already have the object we need to remove it carefully # and retry. We can assume that such an object must be # autogenerated by a prior migration step and thus is less # correct than the original. Such objects may want to # consider setting the attribute '__replaceable__' to avoid # this. if id in self.new.objectIds(): self.new._delOb(id) if getattr(self.new, '_objects', None) is not None: self.new._objects = tuple( [o for o in self.new._objects if o['id'] != id]) self.new._setObject(id, obj, set_owner=0) else: raise # reorder items # in CMF 1.5 Topic is orderable while ATCT's Topic is not orderable # order objects only when old *and* new are orderable we can't check # when creating the map because self.new == None. if self.orderAble and IOrderedContainer.providedBy(self.new): orderMap = self.orderMap for id, pos in orderMap.items(): self.new.moveObjectToPosition(id, pos)
def orderable(self): """ """ return IOrderedContainer.providedBy(aq_inner(self.context))
def test_isOrdered(self): self.failUnless(IOrderedContainer.providedBy(self._ATCT))
def test_implementsOrderInterface(self): self.failUnless(OFSIOrderedContainer.providedBy(self._ATCT)) self.failUnless(IZopeOrderedContainer.isImplementedBy(self._ATCT)) self.failUnless(IOrderedContainer.isImplementedBy(self._ATCT)) self.failUnless(verifyObject(IZopeOrderedContainer, self._ATCT)) self.failUnless(verifyObject(IOrderedContainer, self._ATCT))
def test_ordered_container_interface(self): """Verify the OrderedContainer interface being used.""" self.assertTrue(IOrderedContainer.providedBy(self.folder))
def test_implementsOrderInterface(self): self.failUnless(IOrderedContainer.providedBy(self._ATCT)) self.failUnless(verifyObject(IOrderedContainer, self._ATCT))
def orderable(self): """ """ return IOrderedContainer.providedBy(aq_inner(self.context))
def test_isOrdered(self): self.failUnless(IOrderedContainer.providedBy(self._ATCT))
def test_isOrdered(self): self.assertTrue(IOrderedContainer.providedBy(self._ATCT))
def test_implementsOrderInterface(self): self.assertTrue(IOrderedContainer.providedBy(self._ATCT)) self.assertTrue(verifyObject(IOrderedContainer, self._ATCT))
def test_implementsOrderInterface(self): self.assertTrue(IOrderedContainer.providedBy(self._ATCT)) self.assertTrue(verifyObject(IOrderedContainer, self._ATCT))
def test_isOrdered(self): self.assertTrue(IOrderedContainer.providedBy(self._ATCT))