sort by users on Themes (bug 694610)
This commit is contained in:
Родитель
7ae2bbca09
Коммит
98c18d5f86
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче