sort by users on Themes (bug 694610)

This commit is contained in:
Chris Van 2011-10-14 14:52:43 -07:00
Родитель 7ae2bbca09
Коммит 98c18d5f86
7 изменённых файлов: 77 добавлений и 57 удалений

Просмотреть файл

@ -456,7 +456,7 @@ def _side_nav(context, addon_type, cat):
else:
popular = 'users'
ctx = dict(request=request, base_url=base_url, categories=categories,
addon_type=addon_type, popular=popular)
addon_type=addon_type, popular=popular, amo=amo)
return jinja2.Markup(env.get_template('amo/side_nav.html').render(ctx))

Просмотреть файл

@ -1,8 +1,16 @@
{% set extras = (
('featured', _('Featured')),
(popular, _('Most Popular')),
('rating', _('Top Rated')),
) %}
{% if addon_type == amo.ADDON_THEME %}
{% set extras = (
('users', _('Most Popular')),
('rating', _('Top Rated')),
('created', _('Newest')),
) %}
{% else %}
{% set extras = (
('featured', _('Featured')),
(popular, _('Most Popular')),
('rating', _('Top Rated')),
) %}
{% endif %}
<nav id="side-nav" class="c">
<h2>{{ _('Explore') }}</h2>
<ul id="side-explore">

Просмотреть файл

@ -1,6 +1,6 @@
{% set extras = (
('featured', _('Featured')),
('popular', _('Most Popular')),
('users', _('Most Popular')),
('rating', _('Top Rated')),
) %}
@ -23,7 +23,12 @@
{{ section('extensions', _('Extensions'), url('browse.extensions'), extras, extensions) }}
{{ section('personas', _('Personas'), url('browse.personas'), extras, personas) }}
{% if themes %}
{{ section('themes', _('Themes'), url('browse.themes'), extras, themes) }}
{% set theme_extras = (
('users', _('Most Popular')),
('rating', _('Top Rated')),
('created', _('Newest')),
) %}
{{ section('themes', _('Themes'), url('browse.themes'), theme_extras, themes) }}
{% endif %}
{% set collection_extras = (
('featured', _('Featured')),

Просмотреть файл

@ -83,10 +83,7 @@ class CategoriesRss(AddonFeedMixin, Feed):
def items(self, category):
"""Return the Addons for this Category to be output as RSS <item>'s"""
# TODO(cvan): Remove the `is_impala` argument once the new listing
# page/RSS feeds go live.
addons, _ = addon_listing(self.request, [self.TYPE], default='updated',
is_impala=True)
addons, _ = addon_listing(self.request, [self.TYPE], default='updated')
if category:
addons = addons.filter(categories__id=category.id)
return addons[:20]

Просмотреть файл

@ -26,7 +26,7 @@ from addons.utils import FeaturedManager
from applications.models import Application
from bandwagon.models import Collection, CollectionAddon, FeaturedCollection
from browse import views, feeds
from browse.views import locale_display_name, ImpalaAddonFilter
from browse.views import locale_display_name, AddonFilter, ThemeFilter
from translations.models import Translation
from translations.query import order_by_translation
from versions.models import Version
@ -313,7 +313,7 @@ class TestThemes(amo.tests.TestCase):
def test_default_sort(self):
"""Default sort should be by featured."""
response = self.client.get(self.url)
eq_(response.context['sorting'], 'featured')
eq_(response.context['sorting'], 'users')
def test_unreviewed(self):
pop = urlparams(self.url, sort='popular')
@ -325,30 +325,41 @@ class TestThemes(amo.tests.TestCase):
response = self.client.get(pop)
eq_(len(response.context['addons'].object_list), 2)
def _get_sort(self, sort):
response = self.client.get(urlparams(self.url, sort=sort))
eq_(response.context['sorting'], sort)
return [a.id for a in response.context['addons'].object_list]
def _get_sort(self, sort, key=None, reverse=False, sel_class='opt'):
r = self.client.get(urlparams(self.url, sort=sort))
sel = pq(r.content)('#sorter ul > li.selected')
eq_(sel.find('a').attr('class'), sel_class)
eq_(r.context['sorting'], sort)
a = r.context['addons'].object_list
ids = list(a)
eq_(ids, sorted(a, key=lambda x: getattr(x, key), reverse=reverse))
def test_download_sort(self):
ids = self._get_sort('popular')
eq_(ids, [3615, 6704])
def test_name_sort(self):
ids = self._get_sort('name')
eq_(ids, [3615, 6704])
def test_created_sort(self):
ids = self._get_sort('created')
eq_(ids, [6704, 3615])
def test_updated_sort(self):
ids = self._get_sort('updated')
eq_(ids, [6704, 3615])
def test_users_sort(self):
ids = self._get_sort('users', 'average_daily_users', reverse=True)
def test_rating_sort(self):
ids = self._get_sort('rating')
eq_(ids, [6704, 3615])
ids = self._get_sort('rating', 'bayesian_rating', reverse=True)
def test_newest_sort(self):
ids = self._get_sort('created', 'created', reverse=True)
def test_name_sort(self):
ids = self._get_sort('name', 'name', sel_class='extra-opt')
def test_featured_sort(self):
ids = self._get_sort('featured', sel_class='extra-opt')
def test_downloads_sort(self):
ids = self._get_sort('popular', 'weekly_downloads', reverse=True,
sel_class='extra-opt')
def test_updated_sort(self):
ids = self._get_sort('updated', 'last_updated', reverse=True,
sel_class='extra-opt')
def test_hotness_sort(self):
ids = self._get_sort('hotness', 'hotness', reverse=True,
sel_class='extra-opt')
def test_category_sidebar(self):
c = Category.objects.filter(weight__gte=0).values_list('id', flat=True)
@ -454,7 +465,7 @@ class TestFeeds(amo.tests.TestCase):
self.reset_featured_addons()
self.url = reverse('browse.extensions')
self.rss_url = reverse('browse.extensions.rss')
self.filter = ImpalaAddonFilter
self.filter = AddonFilter
def _check_feed(self, browse_url, rss_url, sort='featured'):
"""

Просмотреть файл

@ -50,15 +50,6 @@ Locale = collections.namedtuple('Locale', 'locale display native dicts packs')
class AddonFilter(BaseFilter):
opts = (('name', _lazy(u'Name')),
('updated', _lazy(u'Updated')),
('created', _lazy(u'Created')),
('popular', _lazy(u'Downloads')),
('users', _lazy(u'Users')),
('rating', _lazy(u'Rating')))
class ImpalaAddonFilter(AddonFilter):
opts = (('featured', _lazy(u'Featured')),
('users', _lazy(u'Most Users')),
('rating', _lazy(u'Top Rated')),
@ -69,6 +60,17 @@ class ImpalaAddonFilter(AddonFilter):
('hotness', _lazy(u'Up & Coming')))
class ThemeFilter(AddonFilter):
opts = (('users', _lazy(u'Most Users')),
('rating', _lazy(u'Top Rated')),
('created', _lazy(u'Newest')))
extras = (('name', _lazy(u'Name')),
('featured', _lazy(u'Featured')),
('popular', _lazy(u'Weekly Downloads')),
('updated', _lazy(u'Recently Updated')),
('hotness', _lazy(u'Up & Coming')))
class AppFilter(AddonFilter):
opts = (('featured', _lazy(u'Featured')),
('downloads', _lazy(u'Weekly Downloads')),
@ -83,23 +85,19 @@ class ESAddonFilter(ESBaseFilter):
opts = AddonFilter.opts
def addon_listing(request, addon_types, Filter=AddonFilter, default='popular',
is_impala=False):
def addon_listing(request, addon_types, filter_=AddonFilter,
default='popular'):
# Set up the queryset and filtering for themes & extension listing pages.
status = [amo.STATUS_PUBLIC, amo.STATUS_LITE,
amo.STATUS_LITE_AND_NOMINATED]
if is_impala:
if addon_types == [amo.ADDON_WEBAPP]:
Filter = AppFilter
else:
Filter = ImpalaAddonFilter
default = 'featured'
if filter_ == AddonFilter and addon_types == [amo.ADDON_WEBAPP]:
filter_ = AppFilter
qs = (Addon.objects.listed(request.APP, *status)
.filter(type__in=addon_types))
filter = Filter(request, qs, 'sort', default)
filter = filter_(request, qs, 'sort', default)
return filter.qs, filter
@ -160,7 +158,8 @@ def themes(request, category=None):
q = Category.objects.filter(application=request.APP.id, type=TYPE)
category = get_object_or_404(q, slug=category)
addons, filter = addon_listing(request, [TYPE], is_impala=True)
addons, filter = addon_listing(request, [TYPE], default='users',
filter_=ThemeFilter)
sorting = filter.field
src = 'cb-btn-%s' % sorting
dl_src = 'cb-dl-%s' % sorting
@ -187,7 +186,7 @@ def extensions(request, category=None, template=None):
if not sort and not request.MOBILE and category and category.count > 4:
return category_landing(request, category)
addons, filter = addon_listing(request, [TYPE], is_impala=True)
addons, filter = addon_listing(request, [TYPE], default='featured')
sorting = filter.field
src = 'cb-btn-%s' % sorting
dl_src = 'cb-dl-%s' % sorting

Просмотреть файл

@ -46,7 +46,7 @@ def app_list(request, category=None):
return category_landing(request, category, TYPE,
AppCategoryLandingFilter)
addons, filter = addon_listing(request, [TYPE], is_impala=True)
addons, filter = addon_listing(request, [TYPE])
sorting = filter.field
src = 'cb-btn-%s' % sorting
dl_src = 'cb-dl-%s' % sorting