Beispiel #1
0
 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
Beispiel #9
0
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
Beispiel #10
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
Beispiel #12
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
Beispiel #13
0
    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
Beispiel #14
0
    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)
Beispiel #15
0
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
Beispiel #16
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)