def _get_position_in_parent(obj): # Use IOrderedContainer interface to extract the object's manual ordering position parent = obj.aq_inner.aq_parent ordered = IOrderedContainer(parent, None) if ordered is not None: return ordered.getObjectPosition(obj.getId()) return 0
def set_positions_in_parent(self): """ Set positions of container object given by `id` and `position` """ data = json.loads(self.request.BODY) num_data = len(data) for i, item in enumerate(data): path = item['path'] position = item['position'] print(i, num_data, path, position) obj = self.context.restrictedTraverse(path, None) if obj is None: continue try: ordered = IOrderedContainer(obj.aq_parent) except (AttributeError, TypeError) as e: print(e) continue try: ordered.moveObjectToPosition(obj.getId(), position) except ValueError as e: print(e) continue obj.reindexObject(idxs=['getObjPositionInParent']) self.request.response.setStatus(204)
def test_export_ordering(self): # First create some content. app = self.layer["app"] portal = self.layer["portal"] login(app, SITE_OWNER_NAME) folder1 = api.content.create( container=portal, type="Folder", id="folder1", title="Folder 1" ) doc1 = api.content.create( container=folder1, type="Document", id="doc1", title="Document 1" ) doc2 = api.content.create( container=folder1, type="Document", id="doc2", title="Document 2" ) doc3 = api.content.create( container=folder1, type="Document", id="doc3", title="Document 3" ) transaction.commit() # Export. browser = self.open_page("@@export_ordering") browser.getForm(action="@@export_ordering").submit(name="form.submitted") contents = browser.contents if not browser.contents: contents = DATA[-1] data = json.loads(contents) # Turn the list into a dict for easier searching and comparing. data_uuid2order = {} for item in data: data_uuid2order[item["uuid"]] = item["order"] data_uuids = sorted(data_uuid2order.keys()) # All content UIDs are in the export: content_uuids = sorted([item.UID() for item in (folder1, doc1, doc2, doc3)]) self.assertListEqual(data_uuids, content_uuids) # All documents have the correct order: self.assertEqual(data_uuid2order[doc1.UID()], 0) self.assertEqual(data_uuid2order[doc2.UID()], 1) self.assertEqual(data_uuid2order[doc3.UID()], 2) # Reorder the documents. ordered = IOrderedContainer(folder1) ordered.moveObjectsToTop(["doc3"]) transaction.commit() # Export and check. browser = self.open_page("@@export_ordering") browser.getForm(action="@@export_ordering").submit(name="form.submitted") contents = browser.contents if not browser.contents: contents = DATA[-1] data = json.loads(contents) data_uuid2order = {} for item in data: data_uuid2order[item["uuid"]] = item["order"] self.assertEqual(data_uuid2order[doc3.UID()], 0) self.assertEqual(data_uuid2order[doc1.UID()], 1) self.assertEqual(data_uuid2order[doc2.UID()], 2)
def getObjPositionInParent(obj): """ Helper method for catalog based folder contents. """ parent = aq_parent(aq_inner(obj)) ordered = IOrderedContainer(parent, None) if ordered is not None: return ordered.getObjectPosition(obj.getId()) return 0
def set_position_in_parent(self): """ Set position of container object given by `id` and `position` """ data = json.loads(self.request.BODY) position = int(data["position"]) ordered = IOrderedContainer(self.context.aq_parent) ordered.moveObjectToPosition(self.context.getId(), position) self.request.response.setStatus(204)
def keys(param): """ Goal: order by level of folder, parent folder, position in folder,""" (obj, path) = param level = len(path.split('/')) parent = aq_parent(aq_inner(obj)) ordered = IOrderedContainer(parent, None) if ordered is not None: return (level, path, ordered.getObjectPosition(obj.getId())) return (level, path, 0)
def _getPositionInParent(obj): parent = aq_parent(aq_inner(obj)) ordered = IOrderedContainer(parent, None) if ordered is not None: pos = ordered.getObjectPosition(obj.getId()) else: pos = 0 return pos
def get_position_in_parent(obj, path): uid = IUUID(obj, None) if not uid: return parent = obj.__parent__ ordered = IOrderedContainer(parent, None) if ordered is not None: order = ordered.getObjectPosition(obj.getId()) results.append({"uuid": uid, "order": order}) return
def getObjPositionInParent(obj): """ Helper method for catalog based folder contents. Overwritten here to avoid problem during unindexing. """ parent = aq_parent(aq_inner(obj)) ordered = IOrderedContainer(parent, None) if ordered is not None: try: return ordered.getObjectPosition(obj.getId()) except ValueError: return 0 return 0
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 getObjPositionInParent(obj): """ Helper method for catalog based folder contents. >>> from Products.CMFPlone.CatalogTool import getObjPositionInParent >>> getObjPositionInParent(self.folder) 0 """ parent = aq_parent(aq_inner(obj)) ordered = IOrderedContainer(parent, None) if ordered is not None: return ordered.getObjectPosition(obj.getId()) return 0
def import_ordering(self, data): results = 0 total = len(data) for index, item in enumerate(data, start=1): obj = api.content.get(UID=item["uuid"]) if not obj: continue ordered = IOrderedContainer(obj.__parent__, None) if not ordered: continue ordered.moveObjectToPosition(obj.getId(), item["order"]) if not index % 1000: logger.info(u"Ordered {} ({}%) of {} items".format( index, round(index / total * 100, 2), total)) results += 1 return results
def __call__(self, config): parent = aq_parent(aq_inner(self.context)) klass = self.context.__class__ owner = self.context.getOwner() data = { '_classname': klass.__name__, '_class': klass.__module__ + '.' + klass.__name__, '_id': self.context.getId(), '_owner': owner and owner.getId(), '_path': '/'.join(self.context.getPhysicalPath()), '_type': self.context.portal_type } ordered_parent = IOrderedContainer(parent, None) if ordered_parent: data['_obj_position_in_parent'] = ordered_parent.getObjectPosition( self.context.getId()) return data
def __call__(self): if not self.is_setup_with_subinboxes(): log.warn('ConvertMainInboxes upgradestep skipped,' 'because it is not an setup with multiptle subinboxes') return main_inbox = self.get_main_inbox() local_roles = main_inbox.get_local_roles() position = IOrderedContainer(self.portal).getObjectPosition( main_inbox.getId()) # create temp container and move inbox-content inside temp_container = createContentInContainer(self.portal, 'opengever.inbox.container', title=u'Temp. Eingangskorb') self.move_all_items(source_container=main_inbox, target=temp_container) self.safe_delete(main_inbox) # create real inbox container and move temp-content inside inbox_container = createContentInContainer(self.portal, 'opengever.inbox.container', id='eingangskorb', title=u'Eingangskorb') self.move_all_items(source_container=temp_container, target=inbox_container) self.safe_delete(temp_container) # readd the local roles for principal, roles in local_roles: roles_list = [item for item in roles] inbox_container.manage_setLocalRoles(principal, roles_list) inbox_container.reindexObjectSecurity() # set original position self.portal.moveObject(inbox_container.getId(), position)
def get_position_in_parent(obj): parent = obj.aq_inner.aq_parent ordered = IOrderedContainer(parent, None) if ordered is not None: return ordered.getObjectPosition(obj.getId()) return 0
def __call__(self): log = self.mklog() real = timer() self.install_folderish_types() log("collective.folderishtypes installed.") catalog = api.portal.get_tool("portal_catalog") catalog.clearFindAndRebuild() log("Portal catalog has been rebuilt.") changed_base_classes = [ "plone.app.contenttypes.content.Document", "plone.app.contenttypes.content.NewsItem", "plone.app.contenttypes.content.Event", ] migrated = [] not_migrated = [] for brain in catalog(): obj = brain.getObject() old_class_name = dxmigration.get_old_class_name_string(obj) if old_class_name in changed_base_classes: prevented_delete = prevented_move = False obj_id = obj.getId() parent = aq_parent(aq_inner(obj)) if IPreventDelete.providedBy(obj): prevented_delete = True noLongerProvides(obj, IPreventDelete) if IPreventMoveOrRename.providedBy(obj): prevented_move = True noLongerProvides(obj, IPreventMoveOrRename) position_in_parent = None ordered = IOrderedContainer(parent, None) if ordered is not None: position_in_parent = ordered.getObjectPosition(obj_id) if dxmigration.migrate_base_class_to_new_class( obj, migrate_to_folderish=True): migrated.append(obj) if position_in_parent is not None: ordered.moveObject(obj_id, position_in_parent) if prevented_delete: alsoProvides(obj, IPreventDelete) if prevented_move: alsoProvides(obj, IPreventMoveOrRename) else: not_migrated.append(obj) if migrated: log("{0} objects have been migrated.".format(len(migrated))) if not_migrated: log( "{0} objects have NOT been migrated.".format( len(not_migrated)), level="warn", ) catalog.clearFindAndRebuild() log("Portal catalog has been rebuilt.") msg = "Processed folderish types migration in {0}.".format(real.next()) log(msg)