Ejemplo n.º 1
0
    def test_add_nonorderable(self):
        """We add non-orderable content in the folder. It is not added
        to the order manager.
        """
        manager = IOrderManager(self.root.folder)
        factory = self.root.folder.manage_addProduct['Silva']

        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            factory.manage_addMockupAsset('asset1', 'Asset 1')
        asset1 = self.root.folder._getOb('asset1')
        self.assertEqual(manager.get_position(asset1), -1)
        self.assertEqual(len(manager), 0)

        # If you add an item if will be correctly added.
        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            factory.manage_addMockupVersionedContent('item1', 'Item 1')
        item1 = self.root.folder._getOb('item1')
        self.assertEqual(manager.get_position(item1), 0)
        self.assertEqual(len(manager), 1)

        # Asset still don't go through.
        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            factory.manage_addMockupAsset('asset2', 'Asset 2')
        asset2 = self.root.folder._getOb('asset2')
        self.assertEqual(manager.get_position(asset2), -1)
        self.assertEqual(len(manager), 1)
Ejemplo n.º 2
0
def content_removed(content, event):
    if (event.object != content or IObjectWillBeAddedEvent.providedBy(event)
            or event.newParent == event.oldParent):
        return
    if IOrderableContainer.providedBy(event.oldParent):
        manager = IOrderManager(event.oldParent)
        manager.remove(content)
Ejemplo n.º 3
0
def content_removed(content, event):
    if (event.object != content or
        IObjectWillBeAddedEvent.providedBy(event) or
        event.newParent == event.oldParent):
        return
    if IOrderableContainer.providedBy(event.oldParent):
        manager = IOrderManager(event.oldParent)
        manager.remove(content)
Ejemplo n.º 4
0
 def __call__(self, form):
     manager = IOrderManager(form.context, None)
     if manager is not None:
         if manager.repair(form.context.objectValues()):
             form.send_message(_("Container order was repaired."),
                               type=u"feedback")
             return silvaforms.SUCCESS
     form.send_message(_("Container order is consistent."), type=u"feedback")
     return silvaforms.SUCCESS
Ejemplo n.º 5
0
    def test_implementation(self):
        self.assertTrue(verifyObject(IOrderableContainer, self.root.folder))
        manager = IOrderManager(self.root.folder)
        self.assertTrue(verifyObject(IOrderManager, manager))

        # If you ask the position of an invalid content, or a contnet
        # that is not in the folder, you get -1
        self.assertEqual(manager.get_position(None), -1)
        self.assertEqual(manager.get_position(self.root), -1)
        self.assertEqual(len(manager), 0)
Ejemplo n.º 6
0
    def test_copy_orderable(self):
        """If we copy a orderable content, the copy is added to the
        order manager, and the other order are not touched.
        """
        source = self.root.source
        manager = IOrderManager(source)
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        item2 = source.item2
        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            with IContainerManager(source).copier() as copier:
                copier(item2)

        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.copy_of_item2), 3)
        self.assertEqual(len(manager), 4)

        # The order is valid, repair return False.
        self.assertEqual(manager.repair(source.objectValues()), False)
Ejemplo n.º 7
0
    def test_repair_broken_order(self):
        """We repair a broken order.
        """
        source = self.root.source
        manager = IOrderManager(source)
        # We add invalid ids to the order
        manager.order.insert(1, 'foo')
        manager.order.insert(3, 'bar')
        manager.order.insert(4, manager.order[0])

        # Order is now messed up
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 2)
        self.assertEqual(manager.get_position(source.item3), 5)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 6)

        # repair return True.
        self.assertEqual(manager.repair(source.objectValues()), True)

        # Invalid ids have been removed
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)
Ejemplo n.º 8
0
 def upgrade(self, container):
     logger.info(u'Upgrading container order in: %s.', content_path(container))
     manager = IOrderManager(container)
     get_id = manager._get_id
     order = []
     for identifier in container._ordered_ids:
         content = container._getOb(identifier, None)
         if content is not None:
             order.append(get_id(content))
     manager.order = order
     del container._ordered_ids
     return container
Ejemplo n.º 9
0
    def test_remove_orderable(self):
        """If we remove an orderable, it is no longer available in the
        order manager, and position of content following this one are
        changed as well.
        """
        source = self.root.source
        manager = IOrderManager(source)
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        item2 = source.item2
        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            with IContainerManager(source).deleter() as deleter:
                self.assertEqual(deleter(item2), item2)

        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item3), 1)
        self.assertEqual(manager.get_position(item2), -1)
        self.assertEqual(len(manager), 2)

        # The order is valid, repair return False.
        self.assertEqual(manager.repair(source.objectValues()), False)
Ejemplo n.º 10
0
    def test_move_nonorderable(self):
        """If we move an nonorderable content, nothing is changed.
        """
        source = self.root.source
        target = self.root.target
        manager_source = IOrderManager(source)
        manager_target = IOrderManager(target)
        self.assertEqual(manager_source.get_position(source.item1), 0)
        self.assertEqual(manager_source.get_position(source.item2), 1)
        self.assertEqual(manager_source.get_position(source.item3), 2)
        self.assertEqual(manager_source.get_position(source.asset1), -1)
        self.assertEqual(len(manager_source), 3)
        self.assertEqual(len(manager_target), 1)

        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            with IContainerManager(target).mover() as mover:
                mover(source.asset1)

        asset1 = source._getOb('asset1', None)
        self.assertEqual(asset1, None)
        asset1 = target._getOb('asset1', None)
        self.assertNotEqual(asset1, None)

        self.assertEqual(manager_source.get_position(source.item1), 0)
        self.assertEqual(manager_source.get_position(source.item2), 1)
        self.assertEqual(manager_source.get_position(source.item3), 2)
        self.assertEqual(len(manager_source), 3)
        self.assertEqual(len(manager_target), 1)
Ejemplo n.º 11
0
 def get_ordered_publishables(self, interface=IPublishable):
     assert interface.isOrExtends(IPublishable), "Invalid interface"
     result = [
         content for content in self.objectValues(
             meta_types_for_interface(interface))
         if not content.is_default()
     ]
     result.sort(key=IOrderManager(self).get_position)
     return result
Ejemplo n.º 12
0
    def test_upgrade_container_order(self):
        """Upgrade a document keep its position.
        """
        document = self.root.document
        order = IOrderManager(self.root)
        self.assertEqual(order.get_position(document), 0)
        self.assertEqual(order.get_position(self.root.folder), 1)
        self.assertEqual(document_upgrader.validate(document), True)
        self.assertNotEqual(document_upgrader.upgrade(document), document)

        upgraded = self.root.document
        order = IOrderManager(self.root)
        self.assertTrue(IDocument.providedBy(upgraded))
        self.assertEqual(order.get_position(upgraded), 0)
        self.assertEqual(order.get_position(self.root.folder), 1)
Ejemplo n.º 13
0
    def test_add_orderable(self):
        """We add an orderable in the folder. It is added to the order
        manager.
        """
        manager = IOrderManager(self.root.folder)
        factory = self.root.folder.manage_addProduct['Silva']

        # First item have position 0
        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            factory.manage_addMockupVersionedContent('item1', 'Item 1')
        item1 = self.root.folder._getOb('item1')
        self.assertEqual(manager.get_position(item1), 0)
        self.assertEqual(len(manager), 1)

        # Next item have position 1
        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            factory.manage_addMockupVersionedContent('item2', 'Item 2')
        item2 = self.root.folder._getOb('item2')
        self.assertEqual(manager.get_position(item2), 1)
        self.assertEqual(len(manager), 2)

        # The order is valid, repair return False.
        self.assertEqual(manager.repair(self.root.folder.objectValues()), False)
Ejemplo n.º 14
0
    def test_rename_orderable(self):
        """If you rename a content, its order must be keept (and not
        changed).
        """
        source = self.root.source
        manager = IOrderManager(source)
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            with IContainerManager(source).renamer() as renamer:
                renamer((source.item2, 'super2', None))

        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.super2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        # The order is valid, repair return False.
        self.assertEqual(manager.repair(source.objectValues()), False)
Ejemplo n.º 15
0
 def list_container_items(self, container, is_displayable):
     """List the given container items that are a candidates to be
     listed in the TOC.
     """
     reverse_sort = self.toc_sort_order.startswith('r')
     items = filter(is_displayable,
                    container.objectValues(self.toc_content_types))
     if self.toc_sort_order in ('alpha', 'reversealpha'):
         items.sort(key=lambda o: o.get_title_or_id(), reverse=reverse_sort)
     elif self.toc_sort_order in ('silva', 'reversesilva'):
         # determine silva sorting.
         # we should only have publishable content
         items.sort(key=IOrderManager(container).get_position,
                    reverse=reverse_sort)
     else:
         # chronologically by modification date
         items.sort(key=lambda o: o.get_modification_datetime(),
                    reverse=reverse_sort)
     return items
    def test_upgrade_container_order(self):
        """Upgrade a document keep its position.
        """
        document = self.root.document
        order = IOrderManager(self.root)
        self.assertEqual(order.get_position(document), 0)
        self.assertEqual(order.get_position(self.root.folder), 1)
        self.assertEqual(document_upgrader.validate(document), True)
        self.assertNotEqual(document_upgrader.upgrade(document), document)

        upgraded = self.root.document
        order = IOrderManager(self.root)
        self.assertTrue(IDocument.providedBy(upgraded))
        self.assertEqual(order.get_position(upgraded), 0)
        self.assertEqual(order.get_position(self.root.folder), 1)
Ejemplo n.º 17
0
    def test_remove_nonorderable(self):
        """If we remove an nonorderable content nothing is changed.
        """
        source = self.root.source
        manager = IOrderManager(source)
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            with IContainerManager(source).deleter() as deleter:
                self.assertEqual(deleter(source.asset1), source.asset1)

        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(len(manager), 3)

        asset1 = source._getOb('asset1', None)
        self.assertEqual(asset1, None)
Ejemplo n.º 18
0
    def test_reorder_orderable(self):
        """You can change the position of an orderable content.
        """
        source = self.root.source
        manager = IOrderManager(source)
        self.assertEqual(manager.get_position(source.item1), 0)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 2)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        self.assertEqual(manager.move(source.item1, 2), True)

        self.assertEqual(manager.get_position(source.item1), 2)
        self.assertEqual(manager.get_position(source.item2), 0)
        self.assertEqual(manager.get_position(source.item3), 1)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        self.assertEqual(manager.move(source.item2, 1), True)

        self.assertEqual(manager.get_position(source.item1), 2)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 0)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        # You can't move something out of the scope of movable things.
        self.assertEqual(manager.move(source.item3, -42), False)
        self.assertEqual(manager.move(source.item3, 42), False)
        # Or that doesn't belong here
        self.assertEqual(manager.move(source, 2), False)

        self.assertEqual(manager.get_position(source.item1), 2)
        self.assertEqual(manager.get_position(source.item2), 1)
        self.assertEqual(manager.get_position(source.item3), 0)
        self.assertEqual(manager.get_position(source.asset1), -1)
        self.assertEqual(len(manager), 3)

        # The order is valid, repair return False.
        self.assertEqual(manager.repair(source.objectValues()), False)
Ejemplo n.º 19
0
    def upgrade(self, doc):
        logger.info('Upgrading HTML in: %s.', content_path(doc))
        # ID + Title
        identifier = doc.id
        title = doc.get_title()
        parent = aq_parent(doc)

        # Create a new doccopy the annotation
        try:
            new_doc = self.create_document(parent,
                                           identifier + 'conv__silva30', title)
        except ValueError:
            logger.error('Cannot convert document: %s.', content_path(doc))
            return doc
        new_identifier = new_doc.getId()  # The id can have changed
        # Copy annotation
        copy_annotation(doc, new_doc)
        # Move references
        move_references(doc, new_doc)

        # Last closed version
        last_closed_version_id = doc.get_last_closed_version()
        if last_closed_version_id is not None:
            last_closed_version = doc._getOb(last_closed_version_id, None)
            if last_closed_version is not None:
                new_last_closed_version = new_doc.get_editable()
                self.copy_version(last_closed_version, new_last_closed_version,
                                  True)
                new_doc.approve_version()
                if new_doc.get_public_version():
                    # The version can already be expired
                    new_doc.close_version()
                new_doc.create_copy()

        # Published version
        public_version = doc.get_viewable()
        if public_version is not None:
            new_public_version = new_doc.get_editable()
            self.copy_version(public_version, new_public_version, True)
            new_doc.approve_version()

        # Editable version
        editable_version = doc.get_editable()
        if editable_version is not None:
            if public_version is not None:
                new_doc.create_copy()
            new_editable_version = new_doc.get_editable()
            self.copy_version(editable_version, new_editable_version)

        # Markers
        new_mark_mg = IMarkManager(new_doc)
        for marker in IMarkManager(doc).usedMarkers:
            new_mark_mg.add_marker(marker)

        # Delete old document and rename content to final id
        order_mg = IOrderManager(parent)
        position = order_mg.get_position(doc)
        parent.manage_delObjects([identifier])
        try:
            parent.manage_renameObject(new_identifier, identifier)
        except CopyError:
            try:
                parent._checkId(identifier)
            except BadRequest:
                logger.error(
                    "Could not replace document with '%s' identifier, renaming it to '%s_changed'.",
                    identifier, identifier)
                identifier += '_changed'
                parent.manage_renameObject(new_identifier, identifier)
            else:
                raise
        new_doc = parent[identifier]
        if position > -1:
            order_mg.move(new_doc, position)
        ICataloging(new_doc).reindex()
        return new_doc
Ejemplo n.º 20
0
    def upgrade(self, doc):
        logger.info(u'Upgrading HTML in: %s.', content_path(doc))
        # ID + Title
        identifier = doc.id
        title = doc.get_title()
        parent = aq_parent(doc)

        # Create a new doccopy the annotation
        try:
            new_doc = self.create_document(
                parent, identifier + 'conv__silva30', title)
        except ValueError:
            logger.error(u'Cannot convert document: %s.', content_path(doc))
            return doc
        new_identifier = new_doc.getId() # The id can have changed
        # Copy annotation
        copy_annotation(doc, new_doc)
        # Move references
        move_references(doc, new_doc)

        # Last closed version
        last_closed_version_id = doc.get_last_closed_version()
        if last_closed_version_id is not None:
            last_closed_version = doc._getOb(last_closed_version_id, None)
            if last_closed_version is not None:
                new_last_closed_version = new_doc.get_editable()
                self.copy_version(
                    last_closed_version, new_last_closed_version, True)
                new_doc.approve_version()
                if new_doc.get_public_version():
                    # The version can already be expired
                    new_doc.close_version()
                new_doc.create_copy()

        # Published version
        public_version = doc.get_viewable()
        if public_version is not None:
            new_public_version = new_doc.get_editable()
            self.copy_version(
                public_version, new_public_version, True)
            new_doc.approve_version()

        # Editable version
        editable_version = doc.get_editable()
        if editable_version is not None:
            if public_version is not None:
                new_doc.create_copy()
            new_editable_version = new_doc.get_editable()
            self.copy_version(
                editable_version, new_editable_version)

        # Markers
        new_mark_mg = IMarkManager(new_doc)
        for marker in IMarkManager(doc).usedMarkers:
            new_mark_mg.add_marker(marker)

        # Delete old document and rename content to final id
        order_mg = IOrderManager(parent)
        position = order_mg.get_position(doc)
        parent.manage_delObjects([identifier])
        try:
            parent.manage_renameObject(new_identifier, identifier)
        except CopyError:
            try:
                parent._checkId(identifier)
            except BadRequest:
                logger.error(
                    u"Could not replace document with '%s' identifier, renaming it to '%s_changed'.",
                    identifier, identifier)
                identifier += '_changed'
                parent.manage_renameObject(new_identifier, identifier)
            else:
                raise
        new_doc = parent[identifier]
        if position > -1:
            order_mg.move(new_doc, position)
        ICataloging(new_doc).reindex()
        return new_doc
Ejemplo n.º 21
0
    def test_move_orderable(self):
        """If you move an orderable, it is removed from the source
        order manager and added to the target order manager.
        """
        source = self.root.source
        target = self.root.target
        manager_source = IOrderManager(source)
        manager_target = IOrderManager(target)
        self.assertEqual(manager_source.get_position(source.item1), 0)
        self.assertEqual(manager_source.get_position(source.item2), 1)
        self.assertEqual(manager_source.get_position(source.item3), 2)
        self.assertEqual(manager_source.get_position(source.asset1), -1)
        self.assertEqual(len(manager_source), 3)
        self.assertEqual(len(manager_target), 1)

        with assertNotTriggersEvents('ContentOrderChangedEvent'):
            with IContainerManager(target).mover() as mover:
                mover(source.item2)

        item2 = source._getOb('item2', None)
        self.assertEqual(item2, None)
        item2 = target._getOb('item2', None)
        self.assertNotEqual(item2, None)

        self.assertEqual(manager_source.get_position(source.item1), 0)
        self.assertEqual(manager_source.get_position(source.item3), 1)
        self.assertEqual(len(manager_source), 2)
        self.assertEqual(manager_target.get_position(target.base1), 0)
        self.assertEqual(manager_target.get_position(target.item2), 1)
        self.assertEqual(len(manager_target), 2)

        # The order is valid, repair return False.
        self.assertEqual(manager_source.repair(source.objectValues()), False)
        self.assertEqual(manager_target.repair(target.objectValues()), False)