Skip to content

Commit

Permalink
Restore support for ordered folders
Browse files Browse the repository at this point in the history
  • Loading branch information
viktordick committed Oct 3, 2018
1 parent 6fba729 commit a24b947
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 25 deletions.
23 changes: 15 additions & 8 deletions src/OFS/ObjectManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -866,7 +866,8 @@ def last_modified(self, ob):
except (DateTimeError, AttributeError):
return ''

security.declareProtected(view_management_screens, 'manage_get_sortedObjects')
security.declareProtected(view_management_screens,
'manage_get_sortedObjects')
def manage_get_sortedObjects(self, sortkey, revkey):
'''
Return dictionaries used for the management page, sorted by sortkey
Expand All @@ -877,26 +878,34 @@ def manage_get_sortedObjects(self, sortkey, revkey):
is the ID of the object as known by the parent and 'obj' is the child
object.
'''
if sortkey not in ['title', 'meta_type', 'get_size', '_p_mtime']:
if sortkey not in ['position', 'title', 'meta_type', 'get_size',
'_p_mtime']:
sortkey = 'id'

items = []
for id, obj in self.objectItems():
item = {'id': id, 'obj': obj}
if sortkey != 'id' and hasattr(obj, sortkey):
if sortkey not in ['id', 'position'] and hasattr(obj, sortkey):
# add the attribute by which we need to sort
item[sortkey] = getattr(obj, sortkey)
items.append(item)

if sortkey == 'position':
# native ordering of Ordered Folders
if revkey == 'desc':
return list(reversed(items))
else:
return items

if sortkey in ['id', 'title', 'meta_type']:
sort_func = 'strcoll'
else:
sort_func = 'cmp'

sorted_items = zope.sequencesort.sort(
items,
((sortkey, sort_func, revkey), ),
mapping = 1
items,
((sortkey, sort_func, revkey), ),
mapping=1
)

# remove the additional attribute
Expand All @@ -905,8 +914,6 @@ def manage_get_sortedObjects(self, sortkey, revkey):
for item in sorted_items
]



# Don't InitializeClass, there is a specific __class_init__ on ObjectManager
# InitializeClass(ObjectManager)

Expand Down
46 changes: 32 additions & 14 deletions src/OFS/tests/testSorting.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,53 @@ def setUp(self):

uf = self.app.acl_users
uf.userFolderAddUser('manager', 'manager_pass', ['Manager'], [])

self.app.manage_addFolder('sortingTest')
self.app.sortingTest.manage_addFile('File1')
self.app.sortingTest.manage_addFile('File2')
self.app.sortingTest.File1.update_data(u'hällo'.encode('utf-8'))
self.app.manage_addOrderedFolder('sortingTestOrdered')
for folder in [self.app.sortingTest, self.app.sortingTestOrdered]:
folder.manage_addFile('File2')
folder.manage_addFile('File1')
folder.File1.update_data(u'hällo'.encode('utf-8'))

self.browser = Testing.testbrowser.Browser()
self.browser.addHeader(
'Authorization',
'basic {}'.format(codecs.encode(
b'manager:manager_pass', 'base64').decode()))

def check_order(self, expect_1_before_2):
found_1_before_2 = (
self.browser.contents.find('File2') >
self.browser.contents.find('File1')
)
self.assertEqual(found_1_before_2, expect_1_before_2)

def test_sortby(self):
base_url = 'http://localhost/sortingTest/manage_main?skey=%s&rkey=%s'

def do_assert(one_before_two):
one_before_two_found = (
self.browser.contents.find('File2') >
self.browser.contents.find('File1')
)
self.assertEqual(one_before_two, one_before_two_found)

self.browser.open(base_url % ('id', 'asc'))
do_assert(one_before_two=True)
self.check_order(expect_1_before_2=True)

self.browser.open(base_url % ('id', 'desc'))
do_assert(one_before_two=False)
self.check_order(expect_1_before_2=False)

self.browser.open(base_url % ('get_size', 'asc'))
do_assert(one_before_two=False)
self.check_order(expect_1_before_2=False)

self.browser.open(base_url % ('get_size', 'desc'))
do_assert(one_before_two=True)
self.check_order(expect_1_before_2=True)

def test_sortby_ordered(self):
base_url = 'http://localhost/sortingTestOrdered/manage_main?'

self.browser.open(base_url)
self.check_order(expect_1_before_2=False)

self.browser.open(base_url + 'rkey=desc')
self.check_order(expect_1_before_2=True)

self.browser.open(base_url + 'skey=id&rkey=asc')
self.check_order(expect_1_before_2=True)

self.browser.open(base_url + 'skey=id&rkey=desc')
self.check_order(expect_1_before_2=False)
33 changes: 31 additions & 2 deletions src/OFS/zpt/main.zpt
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
<main class="container-fluid">
<form name="objectItems" method="post"
tal:define="
has_order_support python:getattr(here.aq_explicit, 'has_order_support', 0);
sm modules/AccessControl/SecurityManagement/getSecurityManager;
skey python:request.get('skey','id');
default_sort python: 'position' if has_order_support else 'id';
skey python:request.get('skey',default_sort);
rkey python:request.get('rkey','asc');
rkey_alt python:request.get('rkey','asc')=='asc' and 'desc' or 'asc';
rkey_alt python:'desc' if rkey=='asc' else 'asc';
obs python: here.manage_get_sortedObjects(sortkey = skey, revkey = rkey);
"
tal:attributes="action string:${request/URL1}/">
Expand Down Expand Up @@ -147,6 +149,33 @@
value="Import/Export"
tal:condition="python:sm.checkPermission('Import/Export objects', context)" />
</div>
<div class="container-fluid">
<div class="form-group row zmi-controls"
tal:condition="python: has_order_support and sm.checkPermission('Manage properties', context)">
<input type="submit" name="manage_move_objects_up:method"
value="Move up" title="Move selected items up"
class="btn btn-primary" />
<span>/</span>
<input type="submit" name="manage_move_objects_down:method"
value="Move down" title="Move selected items down"
class="btn btn-primary" />
<span>by</span>
<div class="col-xs-2">
<select class="form-control" name="delta:int">
<option tal:repeat="val python:range(1,min(5,len(obs)))"
tal:content="val"/>
<option tal:repeat="val python:range(5,len(obs),5)"
tal:content="val"/>
</select>
</div>
<input type="submit" name="manage_move_objects_to_top:method"
value="Move to top" class="btn btn-primary"
title="Move selected items to top" />
<input type="submit" name="manage_move_objects_to_bottom:method"
value="Move to bottom" class="btn btn-primary"
title="Move selected items to bottom" />
</div>
</div>
</tal:not-empty>

<tal:empty condition="not:obs">
Expand Down
6 changes: 5 additions & 1 deletion src/zmi/styles/resources/zmi_base.css
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ form.zmi-upload {
}


/* TAB NVAIGATION */
/* TAB NAVIGATION */
.zmi nav .nav-tabs .nav-item:first-child {
margin-left: 1em;
}
Expand Down Expand Up @@ -226,6 +226,10 @@ form.zmi-upload {
.zmi table.objectItems tr.checked {
background-color:#007bff1c !important;
}
.zmi form[name="objectItems"] div.zmi-controls.row span {
padding: .375rem .25rem;
min-width: initial;
}


/* Table Object-Items: Sorting Links*/
Expand Down

0 comments on commit a24b947

Please sign in to comment.