Skip to content

Commit

Permalink
implement sort feature
Browse files Browse the repository at this point in the history
  • Loading branch information
petschki committed Oct 24, 2019
1 parent 0190611 commit 922fc38
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
2 changes: 2 additions & 0 deletions news/812.feature
@@ -0,0 +1,2 @@
- add `sort` feature to resort all folder items
[petschki]
29 changes: 29 additions & 0 deletions src/plone/restapi/deserializer/mixins.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from plone.folder.interfaces import IExplicitOrdering
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.interfaces.siteroot import IPloneSiteRoot
from zExceptions import BadRequest

Expand All @@ -19,6 +20,12 @@ def handle_ordering(self, data):

self.reorderItems(obj_id, delta, subset_ids)

if "sort" in data:
# resort folder items with given parameters
sort_on = data["sort"]["on"]
sort_order = data["sort"]["order"]
self.resortAllItemsInContext(sort_on, sort_order)

def reorderItems(self, obj_id, delta, subset_ids):
# Based on wildcard.foldercontents.viewsItemOrder
ordering = self.getOrdering()
Expand All @@ -42,6 +49,28 @@ def reorderItems(self, obj_id, delta, subset_ids):
delta = int(delta)
ordering.moveObjectsByDelta([obj_id], delta, subset_ids=subset_ids)

def resortAllItemsInContext(self, sort_on, sort_order):
# Based on plone.app.content.browser.contents.rearrange
ordering = self.getOrdering()
if ordering is None:
msg = "Content ordering is not supported by this resource"
raise BadRequest(msg)

catalog = getToolByName(self.context, 'portal_catalog')
query = {
'path': {
'query': '/'.join(self.context.getPhysicalPath()),
'depth': 1
},
'sort_on': sort_on,
'show_inactive': True
}
brains = catalog(**query)
if sort_order in ('reverse', 'descending'):
brains = [b for b in reversed(brains)]
for idx, brain in enumerate(brains):
ordering.moveObjectToPosition(brain.id, idx)

def getOrdering(self):
if IPloneSiteRoot.providedBy(self.context):
return self.context
Expand Down
35 changes: 35 additions & 0 deletions src/plone/restapi/tests/mixin_ordering.py
Expand Up @@ -224,3 +224,38 @@ def test_reorder_subsetids(self):
self.deserialize(body=json.dumps(data), context=self.folder)

self.assertEqual(u"Client/server ordering mismatch", str(cm.exception))

def test_resort_all_items(self):
self.assertEqual(
[
"doc1",
"doc2",
"doc3",
"doc4",
"doc5",
"doc6",
"doc7",
"doc8",
"doc9",
], # noqa
self.folder.contentIds(),
)

# Normal
# Move to top
data = {"sort": {"on": "id", "order": "descending"}}
self.deserialize(body=json.dumps(data), context=self.folder)
self.assertEqual(
[
"doc9",
"doc8",
"doc7",
"doc6",
"doc5",
"doc4",
"doc3",
"doc2",
"doc1",
], # noqa
self.folder.contentIds(),
)

0 comments on commit 922fc38

Please sign in to comment.