def search(request, tag_name=None): # If the form is invalid we still want to have a query. query = request.REQUEST.get('q', '') search_opts = { 'meta': ('versions', 'categories', 'tags'), 'version': None, } form = SearchForm(request) form.is_valid() # Let the form try to clean data. # TODO(davedash): remove this feature when we remove Application for # the search advanced form # Redirect if appid != request.APP.id appid = form.cleaned_data['appid'] if request.APP.id != appid: new_app = amo.APP_IDS.get(appid) return HttpResponseRedirect( urlresolvers.get_app_redirect(new_app)) category = form.cleaned_data.get('cat') if category == 'collections': return _collections(request) elif category == 'personas': return _personas(request) # TODO: Let's change the form values to something less gross when # Remora dies in a fire. query = form.cleaned_data['q'] addon_type = form.cleaned_data.get('atype', 0) tag = tag_name if tag_name is not None else form.cleaned_data.get('tag') page = form.cleaned_data['page'] last_updated = form.cleaned_data.get('lup') sort = form.cleaned_data.get('sort') search_opts['version'] = form.cleaned_data.get('lver') search_opts['limit'] = form.cleaned_data.get('pp', DEFAULT_NUM_RESULTS) search_opts['platform'] = form.cleaned_data.get('pid', amo.PLATFORM_ALL) search_opts['sort'] = sort search_opts['app'] = request.APP.id search_opts['offset'] = (page - 1) * search_opts['limit'] delta_dict = { '1 day ago': timedelta(days=1), '1 week ago': timedelta(days=7), '1 month ago': timedelta(days=30), '3 months ago': timedelta(days=90), '6 months ago': timedelta(days=180), '1 year ago': timedelta(days=365), } delta = delta_dict.get(last_updated) if delta: search_opts['before'] = int( time.mktime((datetime.now() - delta).timetuple())) if category: search_opts['category'] = category elif addon_type: search_opts['type'] = addon_type search_opts['tag'] = tag client = SearchClient() try: results = client.query(query, **search_opts) except SearchError: return jingo.render(request, 'search/down.html', locals(), status=503) version_filters = client.meta['versions'] # If we are filtering by a version, make sure we explicitly list it. if search_opts['version']: try: version_filters += (version_int(search_opts['version']),) except UnicodeEncodeError: pass # We didn't want to list you anyway. versions = _get_versions(request, client.meta['versions'], search_opts['version']) categories = _get_categories(request, client.meta['categories'], addon_type, category) tags = _get_tags(request, client.meta['tags'], tag) sort_tabs = _get_sorts(request, sort) pager = amo.utils.paginate(request, results, search_opts['limit']) return jingo.render(request, 'search/results.html', { 'pager': pager, 'query': query, 'tag': tag, 'versions': versions, 'categories': categories, 'tags': tags, 'sort_tabs': sort_tabs, 'sort': sort})
def search(request, tag_name=None): # If the form is invalid we still want to have a query. query = request.REQUEST.get('q', '') search_opts = { 'meta': ('versions', 'categories', 'tags', 'platforms'), 'version': None, } form = SearchForm(request) form.is_valid() # Let the form try to clean data. # TODO(davedash): remove this feature when we remove Application for # the search advanced form # Redirect if appid != request.APP.id appid = form.cleaned_data['appid'] if request.APP.id != appid: new_app = amo.APP_IDS.get(appid) return HttpResponseRedirect( urlresolvers.get_app_redirect(new_app)) category = form.cleaned_data.get('cat') if category == 'collections': return _collections(request) elif category == 'personas': return _personas(request) # TODO: Let's change the form values to something less gross when # Remora dies in a fire. query = form.cleaned_data['q'] addon_type = form.cleaned_data.get('atype', 0) tag = tag_name if tag_name is not None else form.cleaned_data.get('tag') if tag_name: search_opts['show_personas'] = True page = form.cleaned_data['page'] sort = form.cleaned_data.get('sort') search_opts['version'] = form.cleaned_data.get('lver') search_opts['limit'] = form.cleaned_data.get('pp', DEFAULT_NUM_RESULTS) search_opts['platform'] = form.cleaned_data.get('pid', amo.PLATFORM_ALL) search_opts['sort'] = sort search_opts['app'] = request.APP.id search_opts['offset'] = (page - 1) * search_opts['limit'] if category: search_opts['category'] = category elif addon_type: search_opts['type'] = addon_type search_opts['tag'] = tag client = SearchClient() try: results = client.query(query, **search_opts) except SearchError, e: log.error('Sphinx Error: %s' % e) return jingo.render(request, 'search/down.html', locals(), status=503)