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)
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)
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
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)
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)
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)
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
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)
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)
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
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)
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)
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)
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_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)
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)
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
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
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)