Merge lp:~mvo/software-center/screenshots-sorting into lp:software-center

Proposed by Michael Vogt
Status: Merged
Merged at revision: 2737
Proposed branch: lp:~mvo/software-center/screenshots-sorting
Merge into: lp:software-center
Diff against target: 117 lines (+39/-15)
3 files modified
softwarecenter/db/application.py (+18/-4)
softwarecenter/ui/gtk3/widgets/thumbnail.py (+4/-10)
test/test_database.py (+17/-1)
To merge this branch: bzr merge lp:~mvo/software-center/screenshots-sorting
Reviewer Review Type Date Requested Status
Gary Lasker (community) Approve
Review via email: mp+92360@code.launchpad.net

Description of the change

Small branch that ensures the multiple screenshots are sorted properly when they come from the json API

To post a comment you must log in.
Revision history for this message
Gary Lasker (gary-lasker) wrote :

Cool! Thanks mvo!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'softwarecenter/db/application.py'
2--- softwarecenter/db/application.py 2012-02-02 13:31:14 +0000
3+++ softwarecenter/db/application.py 2012-02-09 20:20:24 +0000
4@@ -32,7 +32,7 @@
5 from softwarecenter.paths import (APP_INSTALL_CHANNELS_PATH,
6 SOFTWARE_CENTER_ICON_CACHE_DIR,
7 )
8-from softwarecenter.utils import utf8, split_icon_ext
9+from softwarecenter.utils import utf8, split_icon_ext, version_compare
10 from softwarecenter.region import get_region_cached, REGIONTAG
11
12 LOG = logging.getLogger(__name__)
13@@ -566,6 +566,20 @@
14 except:
15 LOG.exception("failed to load content")
16
17+ def _sort_screenshots_by_best_version(self, screenshot_list):
18+ """ take a screenshot result dict from screenshots.debian.org
19+ and sort it
20+ """
21+ my_version = self.version
22+ # remove all versions we don't have
23+ for item in screenshot_list[:]:
24+ if version_compare(my_version, item["version"]) < 0:
25+ screenshot_list.remove(item)
26+ # now sort from high to low
27+ return sorted(
28+ screenshot_list,
29+ cmp=lambda a,b: version_compare(a["version"], b["version"]),
30+ reverse=True)
31
32 def _gio_screenshots_json_download_complete_cb(self, source, result, path):
33 try:
34@@ -574,7 +588,6 @@
35 # ignore read errors, most likely transient
36 return
37 if content is not None:
38- import json
39 content = json.loads(content)
40
41 if isinstance(content, dict):
42@@ -585,8 +598,9 @@
43 screenshot_list = []
44
45 # save for later and emit
46- self._screenshot_list = screenshot_list
47- self.emit("screenshots-available", screenshot_list)
48+ self._screenshot_list = self._sort_screenshots_by_best_version(
49+ screenshot_list)
50+ self.emit("screenshots-available", self._screenshot_list)
51 return
52
53 @property
54
55=== modified file 'softwarecenter/ui/gtk3/widgets/thumbnail.py'
56--- softwarecenter/ui/gtk3/widgets/thumbnail.py 2012-01-24 09:54:42 +0000
57+++ softwarecenter/ui/gtk3/widgets/thumbnail.py 2012-02-09 20:20:24 +0000
58@@ -471,19 +471,13 @@
59
60 # if there are multiple screenshots
61 n = data.get_n_screenshots()
62-
63 if n <= 1:
64 return
65
66- # get a random selection of thumbnails from those avaialble
67- import random
68- seq = random.sample(
69- range(n),
70- min(n, ThumbnailGallery.THUMBNAIL_MAX_COUNT))
71-
72- seq.sort()
73-
74- for i in seq:
75+ # pick the first ones, the data is sorted by most appropriate
76+ # version first - if at some later point we have a lot of
77+ # screenshots we could consider randomizing again
78+ for i in range(min(n, ThumbnailGallery.THUMBNAIL_MAX_COUNT)):
79 url = data.get_nth_small_screenshot(i)
80 self._create_thumbnail_for_url(i, url)
81
82
83=== modified file 'test/test_database.py'
84--- test/test_database.py 2012-02-02 13:31:14 +0000
85+++ test/test_database.py 2012-02-09 20:20:24 +0000
86@@ -49,6 +49,22 @@
87 self.cache = get_pkg_info()
88 self.cache.open()
89
90+ def test_multiple_versions_sorting(self):
91+ db = get_test_db()
92+ app = Application("", "software-center")
93+ details = AppDetails(db, application=app)
94+ details._pkg = Mock()
95+ details._pkg.installed = Mock()
96+ details._pkg.installed.version = "2.0"
97+ self.assertEqual(details.version, "2.0")
98+ v1 = { "version" : "1.0", }
99+ v2 = { "version" : "2.0", }
100+ v3 = { "version" : "3.0", }
101+ screenshots_list = [ v1, v2, v3 ]
102+ res = details._sort_screenshots_by_best_version(screenshots_list)
103+ self.assertEqual(res, [ v2, v1 ])
104+
105+
106 def test_update_from_desktop_file(self):
107 # ensure we index with german locales to test i18n
108 os.environ["LANGUAGE"] = "de"
109@@ -224,7 +240,7 @@
110 details = app.get_details(db)
111 distro = get_distro().get_codename()
112 self.assertEqual(app.request, 'channel=' + distro + '-partner')
113-
114+
115 def ensure_installation_date_and_lazy_history_loading(self, appdetails):
116 # we run two tests, the first is to ensure that we get a
117 # result from installation_data immediately (at this point the

Subscribers

People subscribed via source and target branches