def queryset(self): """Get items based on ID or search by name.""" results = Addon.objects.none() q = self.request.GET.get(self.key) if q: try: pk = int(q) except ValueError: pk = None qs = None if pk: qs = Addon.objects.public().filter(id=int(q)) elif len(q) > 2: qs = (Addon.search_public().query( or_=name_only_query(q.lower()))) if waffle.switch_is_active('boost-webextensions-in-search'): qs = qs.score({ # Boost webextensions if the waffle switch is enabled. 'weight': WEBEXTENSIONS_WEIGHT, 'filter': { 'term': { 'current_version.files.is_webextension': True } } }) if qs: results = qs.filter(type__in=self.types) return results
def _personas(request): """Handle the request for persona searches.""" initial = dict(request.GET.items()) # Ignore these filters since return the same results for Firefox # as for Thunderbird, etc. initial.update(appver=None, platform=None) form = ESSearchForm(initial, type=amo.ADDON_PERSONA) form.is_valid() qs = Addon.search_public() filters = ['sort'] mapping = { 'downloads': '-weekly_downloads', 'users': '-average_daily_users', 'rating': '-bayesian_rating', 'created': '-created', 'name': 'name.raw', 'updated': '-last_updated', 'hotness': '-hotness' } results = _filter_search(request, qs, form.cleaned_data, filters, sorting=mapping, sorting_default='-average_daily_users', types=[amo.ADDON_PERSONA]) form_data = form.cleaned_data.get('q', '') search_opts = {} search_opts['limit'] = form.cleaned_data.get('pp', DEFAULT_NUM_PERSONAS) page = form.cleaned_data.get('page') or 1 search_opts['offset'] = (page - 1) * search_opts['limit'] pager = amo.utils.paginate(request, results, per_page=search_opts['limit']) categories, filter, base, category = personas_listing_view(request) context = { 'pager': pager, 'form': form, 'categories': categories, 'query': form_data, 'filter': filter, 'search_placeholder': 'themes' } return render(request, 'search/personas.html', context)
def queryset(self): """Get items based on ID or search by name.""" results = Addon.objects.none() q = self.request.GET.get(self.key) if q: try: pk = int(q) except ValueError: pk = None qs = None if pk: qs = Addon.objects.public().filter(id=int(q)) elif len(q) > 2: qs = Addon.search_public().filter_query_string(q.lower()) if qs: results = qs.filter(type__in=self.types) return results
def _personas(request): """Handle the request for persona searches.""" initial = dict(request.GET.items()) # Ignore these filters since return the same results for Firefox # as for Thunderbird, etc. initial.update(appver=None, platform=None) form = ESSearchForm(initial, type=amo.ADDON_PERSONA) form.is_valid() qs = Addon.search_public() filters = ['sort'] mapping = { 'downloads': '-weekly_downloads', 'users': '-average_daily_users', 'rating': '-bayesian_rating', 'created': '-created', 'name': 'name.raw', 'updated': '-last_updated', 'hotness': '-hotness'} results = _filter_search(request, qs, form.cleaned_data, filters, sorting=mapping, sorting_default='-average_daily_users', types=[amo.ADDON_PERSONA]) form_data = form.cleaned_data.get('q', '') search_opts = {} search_opts['limit'] = form.cleaned_data.get('pp', DEFAULT_NUM_PERSONAS) page = form.cleaned_data.get('page') or 1 search_opts['offset'] = (page - 1) * search_opts['limit'] pager = amo.utils.paginate(request, results, per_page=search_opts['limit']) categories, filter, base, category = personas_listing_view(request) context = { 'pager': pager, 'form': form, 'categories': categories, 'query': form_data, 'filter': filter, 'search_placeholder': 'themes'} return render(request, 'search/personas.html', context)
def search(request, tag_name=None): APP = request.APP types = (amo.ADDON_EXTENSION, amo.ADDON_THEME, amo.ADDON_DICT, amo.ADDON_SEARCH, amo.ADDON_LPAPP) category = request.GET.get('cat') if category == 'collections': extra_params = {'sort': {'newest': 'created'}} else: extra_params = None fixed = fix_search_query(request.GET, extra_params=extra_params) if fixed is not request.GET: return http.HttpResponsePermanentRedirect( urlparams(request.path, **fixed)) facets = request.GET.copy() # In order to differentiate between "all versions" and an undefined value, # we use "any" instead of "" in the frontend. if 'appver' in facets and facets['appver'] == 'any': facets['appver'] = '' form = ESSearchForm(facets or {}) form.is_valid() # Let the form try to clean data. form_data = form.cleaned_data if tag_name: form_data['tag'] = tag_name if category == 'collections': return _collections(request) elif category == 'themes' or form_data.get('atype') == amo.ADDON_PERSONA: return _personas(request) sort, extra_sort = split_choices(form.sort_choices, 'created') if form_data.get('atype') == amo.ADDON_SEARCH: # Search add-ons should not be searched by ADU, so replace 'Users' # sort with 'Weekly Downloads'. sort, extra_sort = list(sort), list(extra_sort) sort[1] = extra_sort[1] del extra_sort[1] # Perform search, using aggregation so that we can build the facets UI. # Note that we don't need to aggregate on platforms, that facet it built # from our constants directly, using the current application for this # request (request.APP). appversion_field = 'current_version.compatible_apps.%s.max' % APP.id qs = (Addon.search_public().filter(app=APP.id).aggregate( tags={'terms': { 'field': 'tags' }}, appversions={'terms': { 'field': appversion_field }}, categories={'terms': { 'field': 'category', 'size': 200 }})) filters = ['atype', 'appver', 'cat', 'sort', 'tag', 'platform'] mapping = { 'users': '-average_daily_users', 'rating': '-bayesian_rating', 'created': '-created', 'name': 'name_sort', 'downloads': '-weekly_downloads', 'updated': '-last_updated', 'hotness': '-hotness' } qs = _filter_search(request, qs, form_data, filters, mapping, types=types) pager = amo.utils.paginate(request, qs) ctx = { 'is_pjax': request.META.get('HTTP_X_PJAX'), 'pager': pager, 'query': form_data, 'form': form, 'sort_opts': sort, 'extra_sort_opts': extra_sort, 'sorting': sort_sidebar(request, form_data, form), 'sort': form_data.get('sort'), } if not ctx['is_pjax']: aggregations = pager.object_list.aggregations ctx.update({ 'tag': tag_name, 'categories': category_sidebar(request, form_data, aggregations), 'platforms': platform_sidebar(request, form_data), 'versions': version_sidebar(request, form_data, aggregations), 'tags': tag_sidebar(request, form_data, aggregations), }) return render(request, 'search/results.html', ctx)
def search(request, tag_name=None, template=None): APP = request.APP types = (amo.ADDON_EXTENSION, amo.ADDON_THEME, amo.ADDON_DICT, amo.ADDON_SEARCH, amo.ADDON_LPAPP) category = request.GET.get('cat') if category == 'collections': extra_params = {'sort': {'newest': 'created'}} else: extra_params = None fixed = fix_search_query(request.GET, extra_params=extra_params) if fixed is not request.GET: return http.HttpResponsePermanentRedirect(urlparams(request.path, **fixed)) facets = request.GET.copy() # In order to differentiate between "all versions" and an undefined value, # we use "any" instead of "" in the frontend. if 'appver' in facets and facets['appver'] == 'any': facets['appver'] = '' form = ESSearchForm(facets or {}) form.is_valid() # Let the form try to clean data. form_data = form.cleaned_data if tag_name: form_data['tag'] = tag_name if category == 'collections': return _collections(request) elif category == 'themes' or form_data.get('atype') == amo.ADDON_PERSONA: return _personas(request) sort, extra_sort = split_choices(form.sort_choices, 'created') if form_data.get('atype') == amo.ADDON_SEARCH: # Search add-ons should not be searched by ADU, so replace 'Users' # sort with 'Weekly Downloads'. sort, extra_sort = list(sort), list(extra_sort) sort[1] = extra_sort[1] del extra_sort[1] # Perform search, using aggregation so that we can build the facets UI. # Note that we don't need to aggregate on platforms, that facet it built # from our constants directly, using the current application for this # request (request.APP). qs = (Addon.search_public().filter(app=APP.id) .aggregate(tags={'terms': {'field': 'tags'}}, appversions={'terms': {'field': 'appversion.%s.max' % APP.id}}, categories={'terms': {'field': 'category', 'size': 200}})) filters = ['atype', 'appver', 'cat', 'sort', 'tag', 'platform'] mapping = {'users': '-average_daily_users', 'rating': '-bayesian_rating', 'created': '-created', 'name': 'name_sort', 'downloads': '-weekly_downloads', 'updated': '-last_updated', 'hotness': '-hotness'} qs = _filter_search(request, qs, form_data, filters, mapping, types=types) pager = amo.utils.paginate(request, qs) ctx = { 'is_pjax': request.META.get('HTTP_X_PJAX'), 'pager': pager, 'query': form_data, 'form': form, 'sort_opts': sort, 'extra_sort_opts': extra_sort, 'sorting': sort_sidebar(request, form_data, form), 'sort': form_data.get('sort'), } if not ctx['is_pjax']: aggregations = pager.object_list.aggregations ctx.update({ 'tag': tag_name, 'categories': category_sidebar(request, form_data, aggregations), 'platforms': platform_sidebar(request, form_data), 'versions': version_sidebar(request, form_data, aggregations), 'tags': tag_sidebar(request, form_data, aggregations), }) return render(request, template, ctx)