Merge lp:~ralsina/ubuntuone-control-panel/sort-shares into lp:ubuntuone-control-panel

Proposed by Roberto Alsina
Status: Merged
Approved by: Roberto Alsina
Approved revision: 334
Merged at revision: 330
Proposed branch: lp:~ralsina/ubuntuone-control-panel/sort-shares
Merge into: lp:ubuntuone-control-panel
Diff against target: 205 lines (+42/-68)
2 files modified
ubuntuone/controlpanel/gui/qt/folders.py (+3/-0)
ubuntuone/controlpanel/gui/qt/tests/test_folders.py (+39/-68)
To merge this branch: bzr merge lp:~ralsina/ubuntuone-control-panel/sort-shares
Reviewer Review Type Date Requested Status
dobey (community) Approve
Manuel de la Peña (community) Approve
Review via email: mp+108594@code.launchpad.net

Commit message

 - Enable folder list sorting (Fixes LP:1006385).

Description of the change

Enable sorting by the 1st column in the control panel's folder list.

This has one maybe unexpected side effect, which is that on languages where "My personal folders" is > "Shared by" you get the shares on top. I don't think that is really a problem.

The sort order is tested by test_process_info, which will compare the item order to case-insensitive-sorted data.

To post a comment you must log in.
Revision history for this message
Manuel de la Peña (mandel) :
review: Approve
Revision history for this message
dobey (dobey) :
review: Approve
Revision history for this message
Ubuntu One Auto Pilot (otto-pilot) wrote :
Download full text (147.4 KiB)

The attempt to merge lp:~ralsina/ubuntuone-control-panel/sort-shares into lp:ubuntuone-control-panel failed. Below is the output from the failed tests.

*** Running test suite for ubuntuone/controlpanel ***
ubuntuone.controlpanel.tests.test_replication_client
  ReplicationsTestCase
    test_exclude ... [OK]
    test_exclude_name_in_exclusions ... [OK]
    test_exclude_name_not_in_replications ... [OK]
    test_get_exclusions ... [OK]
    test_get_replications ... [OK]
    test_no_pairing_record ... [OK]
    test_replicate ... [OK]
    test_replicate_name_not_in_exclusions ... [OK]
    test_replicate_name_not_in_replications ... [OK]
ubuntuone.controlpanel.tests
  TestCase
    runTest ... [OK]
ubuntuone.controlpanel.tests.test_sd_client
  AutoconnectTestCase
    test_disable ... [OK]
    test_disable_throws_an_error ... [OK]
    test_enable ... [OK]
    test_enable_throws_an_error ... [OK]
    test_get_value ... [OK]
    test_get_value_throws_an_error ... [OK]
  BaseTestCase
    runTest ... [OK]
  BasicTestCase
    test_get_current_status ... [OK]
    test_get_current_status_error ... [OK]
    test_get_root_dir ... [OK]
    test_get_shares_dir ... [OK]
    test_get_shares_dir_link ... [OK]
  FileSyncTestCase
    test_connect_file_sync ... [OK]
    test_disable_file_sync ... [OK]
    test_disconnect_file_sync ... [OK]
    test_enable_file_sync ... [OK]
    test_file_sync_enabled ... [OK]
    test_set_status_changed_handler ... [OK]
    test_start_file_sync ... [OK]
    test_stop_file_sync ... [OK]
  FoldersTestCase
    test_create_folder ... [OK]
    test_create_folder_error ... [OK]
    test_get_folders ... [OK]
    test_get_folders_error ... [OK]
    test_subscribe_fold...

332. By Roberto Alsina

make test_focus_order not depend on the order of the items

333. By Roberto Alsina

no more tests relying on the order of the items on the display

Revision history for this message
dobey (dobey) wrote :

+ #self.assertTrue(item is None)

Why is this commented out?

review: Needs Fixing
334. By Roberto Alsina

removed remnant

Revision history for this message
Roberto Alsina (ralsina) wrote :

> + #self.assertTrue(item is None)
>
> Why is this commented out?

Leftover from old code. Removed in revno 334

Revision history for this message
dobey (dobey) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ubuntuone/controlpanel/gui/qt/folders.py'
2--- ubuntuone/controlpanel/gui/qt/folders.py 2012-05-29 14:30:36 +0000
3+++ ubuntuone/controlpanel/gui/qt/folders.py 2012-06-06 15:30:26 +0000
4@@ -137,6 +137,9 @@
5 headers.setResizeMode(SUBSCRIPTION_COL, headers.ResizeToContents)
6 headers.setResizeMode(EXPLORE_COL, headers.ResizeToContents)
7
8+ self.ui.folders.setSortingEnabled(True)
9+ self.ui.folders.sortByColumn(FOLDER_NAME_COL, QtCore.Qt.AscendingOrder)
10+
11 self.ui.share_publish_button.setText(FOLDERS_MANAGE_LABEL)
12 self.ui.share_publish_button.uri = MANAGE_FILES_LINK
13 QtGui.QApplication.instance().focusChanged.connect(self.focus_changed)
14
15=== modified file 'ubuntuone/controlpanel/gui/qt/tests/test_folders.py'
16--- ubuntuone/controlpanel/gui/qt/tests/test_folders.py 2012-05-29 17:18:55 +0000
17+++ ubuntuone/controlpanel/gui/qt/tests/test_folders.py 2012-06-06 15:30:26 +0000
18@@ -24,7 +24,7 @@
19 import shutil
20 import sys
21
22-from PyQt4 import QtGui
23+from PyQt4 import QtCore, QtGui
24 from twisted.internet import defer
25 from ubuntuone.devtools.handlers import MementoHandler
26 from ubuntuone.devtools.testcases import skipIfOS
27@@ -244,28 +244,21 @@
28
29 def test_process_info(self):
30 """The volumes info is processed when ready."""
31+ folders = self.ui.ui.folders
32 self.ui.process_info(FAKE_VOLUMES_INFO)
33- folders = self.ui.ui.folders
34-
35 root = folders.invisibleRootItem()
36 self.assertEqual(len(FAKE_VOLUMES_INFO), root.childCount())
37
38- treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)
39 for name, _, volumes in FAKE_VOLUMES_INFO:
40 name = _build_name(name)
41-
42- # get first child, matching "My Folders"
43- item = treeiter.value()
44- self.assertFalse(item.is_empty)
45-
46+ items = folders.findItems(name, QtCore.Qt.MatchFixedString
47+ | QtCore.Qt.MatchCaseSensitive | QtCore.Qt.MatchRecursive,
48+ gui.FOLDER_NAME_COL)
49+ self.assertEqual(1, len(items))
50+ item = items[0]
51 self.assert_folder_group_header_correct(item, name)
52-
53 self.assertEqual(len(volumes), item.childCount())
54- sorted_vols = sorted(volumes, key=operator.itemgetter('path'))
55- for volume in sorted_vols:
56- treeiter += 1
57- item = treeiter.value() # get child folder
58- self.assertTrue(item is not None)
59+ for volume in volumes:
60
61 name = volume['path'].replace(USER_HOME + os.path.sep, '')
62 expected_path = volume['path']
63@@ -278,12 +271,14 @@
64 else:
65 icon_name = gui.SHARE_ICON_NAME
66
67+ items = folders.findItems(name, QtCore.Qt.MatchFixedString |
68+ QtCore.Qt.MatchCaseSensitive | QtCore.Qt.MatchRecursive,
69+ gui.FOLDER_NAME_COL)
70+ self.assertEqual(1, len(items))
71+ item = items[0]
72 self.assert_folder_row_correct(item, name, icon_name, volume,
73 tweaked_path=expected_path)
74
75- treeiter += 1
76- item = treeiter.value()
77-
78 def test_process_info_clears_the_list(self):
79 """The old volumes info is cleared before updated."""
80 self.ui.process_info(FAKE_VOLUMES_INFO)
81@@ -305,9 +300,10 @@
82
83 child_index = 0
84 root = self.ui.ui.folders.invisibleRootItem()
85- for name, _, _ in FAKE_VOLUMES_NO_FREE_SPACE_INFO:
86- name = _build_name(name)
87-
88+ names = [_build_name(name) for name, _, _ in
89+ FAKE_VOLUMES_NO_FREE_SPACE_INFO]
90+ names.sort(key=lambda x: x.lower())
91+ for name in names:
92 item = root.child(child_index)
93 self.assertFalse(item.is_empty)
94 self.assert_folder_group_header_correct(item, name)
95@@ -414,34 +410,23 @@
96 """Ensure that the inner widgets are in the correct tab order."""
97 self.ui.process_info(FAKE_VOLUMES_INFO)
98 folders = self.ui.ui.folders
99-
100 widget = self.ui.ui.folders.nextInFocusChain()
101 treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)
102- for name, _, volumes in FAKE_VOLUMES_INFO:
103- item = treeiter.value()
104- sorted_vols = sorted(volumes, key=operator.itemgetter('path'))
105- for volume in sorted_vols:
106+ while treeiter.value():
107+ if treeiter.value().parent() is None: # Top-levels
108 treeiter += 1
109- item = treeiter.value() # get child folder
110-
111- name = volume['path'].replace(USER_HOME + os.path.sep, '')
112- if volume['type'] == self.ui.backend.SHARE_TYPE:
113- name = volume['name']
114- self.assertEqual(unicode(item.text(gui.FOLDER_NAME_COL)), name)
115-
116- actual_name = unicode(self.ui.widget_items[widget].text(0))
117- if volume['type'] != self.ui.backend.ROOT_TYPE:
118- self.assertIsInstance(widget, QtGui.QCheckBox)
119- self.assertEqual(actual_name, name)
120- widget = widget.nextInFocusChain()
121-
122- if not self.ui.remote_folders:
123- self.assertIsInstance(widget, QtGui.QPushButton)
124- self.assertEqual(actual_name, name)
125- widget = widget.nextInFocusChain()
126-
127+ continue
128+ if self.ui.remote_folders:
129+ self.assertIsInstance(widget, QtGui.QCheckBox)
130+ # ROOT volume has no checkbox
131+ elif treeiter.value().text(1) or self.ui.remote_folders:
132+ self.assertIsInstance(widget, QtGui.QPushButton)
133+ else:
134+ self.assertIsInstance(widget, QtGui.QCheckBox)
135+ widget = widget.nextInFocusChain()
136+ self.assertIsInstance(widget, QtGui.QPushButton)
137+ widget = widget.nextInFocusChain()
138 treeiter += 1
139- item = treeiter.value()
140
141 def test_widget_dict(self):
142 """Ensure the widget_items dictionary is full."""
143@@ -995,13 +980,17 @@
144 def assert_folder_added(self, path, volume_id=None, item=None):
145 """A entry for 'path' was added to the folder list."""
146 folders = self.ui.ui.folders
147- if item is None: # grab the last one added
148- item = folders.topLevelItem(folders.topLevelItemCount() - 1)
149
150 if path == MUSIC_PATH:
151 display_name = gui.MUSIC_DISPLAY_NAME
152 else:
153 display_name = path.replace(USER_HOME + os.path.sep, '')
154+ if item is None: # search for it
155+ items = folders.findItems(display_name,
156+ QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive,
157+ gui.FOLDER_NAME_COL)
158+ self.assertEqual(len(items), 1)
159+ item = items[0]
160 self.assertEqual(display_name,
161 unicode(item.text(gui.LOCAL_SUBSCRIPTION_COL)))
162
163@@ -1094,10 +1083,6 @@
164 # the following will execute update_sizes once
165 # will fill in all the path sizes for the already added folders
166 self.timer.timeout.emit()
167-
168- folders = self.ui.ui.folders
169- treeiter = gui.QtGui.QTreeWidgetItemIterator(folders)
170-
171 volumes = []
172 for _, _, vols in volumes_info:
173 volumes.extend(vols)
174@@ -1108,28 +1093,14 @@
175 not bool(volume['subscribed'])):
176 # non-folders or unsubscribed should not appear in the tree
177 continue
178-
179- item = treeiter.value()
180- self.assertTrue(item is not None)
181 self.assert_folder_added(volume['path'],
182- volume_id=volume['volume_id'], item=item)
183-
184- treeiter += 1
185- item = treeiter.value()
186-
187+ volume_id=volume['volume_id'])
188 for folder in gui.default_folders(USER_HOME):
189 valid = yield self.validate_path(folder)
190 if not valid:
191 continue # invalid folders should not appear in the tree
192-
193- item = treeiter.value()
194- self.assertTrue(item is not None)
195- self.assert_folder_added(folder, volume_id=None, item=item)
196-
197- treeiter += 1
198- item = treeiter.value()
199-
200- self.assertTrue(item is None)
201+ self.assert_folder_added(folder, volume_id=None, item=None)
202+
203 self.assert_space_header_correct(ACCOUNT_INFO['quota_used'])
204
205 @defer.inlineCallbacks

Subscribers

People subscribed via source and target branches