def build_info_dict(resource=None, request=None): if resource is not None: return { 'api_version': 'v2', 'api_auth_type': resource.auth_method_name, 'api_client_username': str(resource.developer), 'api_enduser_username': str(resource.user), 'api_client_id': resource.client_id, 'api_client_name': resource.client_name, 'ip': resource.end_user_ip, 'api_request_protocol': resource.protocol, 'api_www': resource.contains_www } if request is not None: auth_method_name, developer, user, client_id, client_name, protocol,\ contains_www = get_authentication_details_form_request(request) return { 'api_version': 'v2', 'api_auth_type': auth_method_name, 'api_client_username': str(developer), 'api_enduser_username': str(user), 'api_client_id': client_id, 'api_client_name': client_name, 'ip': get_client_ip(request), 'api_request_protocol': protocol, 'api_www': contains_www }
def initial(self, request, *args, **kwargs): super(GenericAPIView, self).initial(request, *args, **kwargs) # Get request information and store it as class variable self.end_user_ip = get_client_ip(request) self.auth_method_name, self.developer, self.user, self.client_id, self.client_name \ = get_authentication_details_form_request(request)
def initial(self, request, *args, **kwargs): super(GenericAPIView, self).initial(request, *args, **kwargs) # Get request information and store it as class variable self.end_user_ip = get_client_ip(request) self.auth_method_name, self.developer, self.user, self.client_id, self.client_name, self.protocol,\ self.contains_www = get_authentication_details_form_request(request)
def initial(self, request, *args, **kwargs): super(OauthRequiredAPIView, self).initial(request, *args, **kwargs) # Get request information and store it as class variable self.end_user_ip = get_client_ip(request) self.auth_method_name, self.developer, self.user, self.client_id, self.client_name \ = get_authentication_details_form_request(request) # Check if using https throw_exception_if_not_https(request)
def initial(self, request, *args, **kwargs): super(WriteRequiredGenericAPIView, self).initial(request, *args, **kwargs) # Get request informationa dn store it as class variable self.end_user_ip = get_client_ip(request) self.auth_method_name, self.developer, self.user, self.client_id, self.client_name \ = get_authentication_details_form_request(request) # Check if using https throw_exception_if_not_https(request) # Check if client has write permissions if self.auth_method_name == "OAuth2": if "write" not in request.auth.scopes: raise UnauthorizedException(resource=self)
def initial(self, request, *args, **kwargs): super(WriteRequiredGenericAPIView, self).initial(request, *args, **kwargs) # Get request informationa dn store it as class variable self.end_user_ip = get_client_ip(request) self.auth_method_name, self.developer, self.user, self.client_id, self.client_name, self.protocol, \ self.contains_www = get_authentication_details_form_request(request) # Check if using https throw_exception_if_not_https(request) # Check if client has write permissions if self.auth_method_name == "OAuth2": if "write" not in request.auth.scopes: raise UnauthorizedException(resource=self)
def search(request): search_query = request.GET.get("q", "") filter_query = request.GET.get("f", "") filter_query_link_more_when_grouping_packs = filter_query.replace(' ','+') try: current_page = int(request.GET.get("page", 1)) except ValueError: current_page = 1 sort = request.GET.get("s", None) sort_options = forms.SEARCH_SORT_OPTIONS_WEB grouping = request.GET.get("g", "1") # Group by default actual_groupnig = grouping # If the query is filtered by pack, do not collapse sounds of the same pack (makes no sense) # If the query is thourhg ajax (for sources remix editing), do not collapse if "pack" in filter_query or request.GET.get("ajax", "") == "1": actual_groupnig = "" # Set default values id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename'] # Parse advanced search options advanced = request.GET.get("advanced", "") # if advanced search if advanced == "1" : a_tag = request.GET.get("a_tag", "") a_filename = request.GET.get("a_filename", "") a_description = request.GET.get("a_description", "") a_packname = request.GET.get("a_packname", "") a_soundid = request.GET.get("a_soundid", "") a_username = request.GET.get("a_username", "") # If none is selected use all (so other filter can be appleid) if a_tag or a_filename or a_description or a_packname or a_soundid or a_username != "" : # Initialize all weights to 0 id_weight = 0 tag_weight = 0 description_weight = 0 username_weight = 0 pack_tokenized_weight = 0 original_filename_weight = 0 # Set the weights of selected checkboxes if a_soundid != "" : id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] if a_tag != "" : tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] if a_description != "" : description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] if a_username != "" : username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] if a_packname != "" : pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] if a_filename != "" : original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename'] # ALLOW "q" empty queries #if search_query.strip() == "" sort = search_prepare_sort(sort, forms.SEARCH_SORT_OPTIONS_WEB) logger.info(u'Search (%s)' % json.dumps({ 'ip': get_client_ip(request), 'query': search_query, 'filter': filter_query, 'username': request.user.username, 'page': current_page, 'sort': sort[0], 'group_by_pack' : actual_groupnig, 'advanced': json.dumps({ 'search_in_tag': a_tag, 'search_in_filename': a_filename, 'search_in_description': a_description, 'search_in_packname': a_packname, 'search_in_soundid': a_soundid, 'search_in_username': a_username }) if advanced == "1" else "" })) query = search_prepare_query(search_query, filter_query, sort, current_page, settings.SOUNDS_PER_PAGE, id_weight, tag_weight, description_weight, username_weight, pack_tokenized_weight, original_filename_weight, grouping = actual_groupnig ) solr = Solr(settings.SOLR_URL) try: results = SolrResponseInterpreter(solr.select(unicode(query))) paginator = SolrResponseInterpreterPaginator(results, settings.SOUNDS_PER_PAGE) num_results = paginator.count non_grouped_number_of_results = results.non_grouped_number_of_matches page = paginator.page(current_page) error = False docs = results.docs resultids = [d.get("id") for d in docs] resultsounds = sounds.models.Sound.objects.bulk_query_id(resultids) allsounds = {} for s in resultsounds: allsounds[s.id] = s # allsounds will contain info from all the sounds returned by bulk_query_id. This should # be all sounds in docs, but if solr and db are not synchronised, it might happen that there # are ids in docs which are not found in bulk_query_id. To avoid problems we remove elements # in docs that have not been loaded in allsounds. docs = [doc for doc in docs if doc["id"] in allsounds] for d in docs: d["sound"] = allsounds[d["id"]] # clickusage tracking if settings.LOG_CLICKTHROUGH_DATA: request_full_path = request.get_full_path() # The session id of an unauthenticated user is different from the session id of the same user when # authenticated. request.session["searchtime_session_key"] = request.session.session_key if results.docs is not None: ids = [] for item in results.docs: ids.append(item["id"]) logger_click.info("QUERY : %s : %s : %s : %s" % (unicode(request_full_path).encode('utf-8'), request.session.session_key, unicode(ids).encode('utf-8'), unicode(current_page).encode('utf-8'))) except SolrException, e: logger.warning("search error: query: %s error %s" % (query, e)) error = True error_text = 'There was an error while searching, is your query correct?'
def get_request_information(self, request): # Get request information and store it as class variable # This information is mainly useful for logging self.end_user_ip = get_client_ip(request) self.auth_method_name, self.developer, self.user, self.client_id, self.client_name, self.protocol, \ self.contains_www = get_authentication_details_form_request(request)
def search(request): search_query = request.GET.get("q", "") filter_query = request.GET.get("f", "") filter_query_link_more_when_grouping_packs = filter_query.replace(' ', '+') # Generate array with information of filters filter_query_split = [] if filter_query != "": for filter_str in re.findall(r'[\w-]+:\"[^\"]+', filter_query): filter_str = filter_str + '"' filter_display = filter_str.replace('"', '') filter_name = filter_str.split(":")[0] if filter_name != "duration" and filter_name != "is_geotagged": if filter_name == "grouping_pack": val = filter_display.split(":")[1] filter_display = "pack:" + val.split("_")[1] filter = { 'name': filter_display, 'remove_url': filter_query.replace(filter_str, ''), } filter_query_split.append(filter) try: current_page = int(request.GET.get("page", 1)) except ValueError: current_page = 1 sort = request.GET.get("s", None) sort_options = forms.SEARCH_SORT_OPTIONS_WEB grouping = request.GET.get("g", "1") # Group by default # If the query is filtered by pack, do not collapse sounds of the same pack (makes no sense) # If the query is through AJAX (for sources remix editing), do not collapse if "pack" in filter_query or request.GET.get("ajax", "") == "1": grouping = "" # Set default values id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'original_filename'] # Parse advanced search options advanced = request.GET.get("advanced", "") advanced_search_params_dict = {} # if advanced search if advanced == "1": a_tag = request.GET.get("a_tag", "") a_filename = request.GET.get("a_filename", "") a_description = request.GET.get("a_description", "") a_packname = request.GET.get("a_packname", "") a_soundid = request.GET.get("a_soundid", "") a_username = request.GET.get("a_username", "") advanced_search_params_dict.update({ # These are stored in a dict to facilitate logging and passing to template 'a_tag': a_tag, 'a_filename': a_filename, 'a_description': a_description, 'a_packname': a_packname, 'a_soundid': a_soundid, 'a_username': a_username, }) # If none is selected use all (so other filter can be appleid) if a_tag or a_filename or a_description or a_packname or a_soundid or a_username != "": # Initialize all weights to 0 id_weight = 0 tag_weight = 0 description_weight = 0 username_weight = 0 pack_tokenized_weight = 0 original_filename_weight = 0 # Set the weights of selected checkboxes if a_soundid != "": id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] if a_tag != "": tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] if a_description != "": description_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'description'] if a_username != "": username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] if a_packname != "": pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'pack_tokenized'] if a_filename != "": original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'original_filename'] sort = search_prepare_sort(sort, forms.SEARCH_SORT_OPTIONS_WEB) logger.info(u'Search (%s)' % json.dumps({ 'ip': get_client_ip(request), 'query': search_query, 'filter': filter_query, 'username': request.user.username, 'page': current_page, 'sort': sort[0], 'group_by_pack': grouping, 'advanced': json.dumps(advanced_search_params_dict) if advanced == "1" else "" })) query = search_prepare_query(search_query, filter_query, sort, current_page, settings.SOUNDS_PER_PAGE, id_weight, tag_weight, description_weight, username_weight, pack_tokenized_weight, original_filename_weight, grouping=grouping) tvars = { 'error_text': None, 'filter_query': filter_query, 'filter_query_split': filter_query_split, 'search_query': search_query, 'grouping': grouping, 'advanced': advanced, 'sort': sort, 'sort_options': sort_options, 'filter_query_link_more_when_grouping_packs': filter_query_link_more_when_grouping_packs, 'current_page': current_page, } if advanced == "1": tvars.update(advanced_search_params_dict) try: non_grouped_number_of_results, facets, paginator, page, docs = perform_solr_query( query, current_page) resultids = [d.get("id") for d in docs] resultsounds = sounds.models.Sound.objects.bulk_query_id(resultids) allsounds = {} for s in resultsounds: allsounds[s.id] = s # allsounds will contain info from all the sounds returned by bulk_query_id. This should # be all sounds in docs, but if solr and db are not synchronised, it might happen that there # are ids in docs which are not found in bulk_query_id. To avoid problems we remove elements # in docs that have not been loaded in allsounds. docs = [doc for doc in docs if doc["id"] in allsounds] for d in docs: d["sound"] = allsounds[d["id"]] tvars.update({ 'paginator': paginator, 'page': page, 'docs': docs, 'facets': facets, 'non_grouped_number_of_results': non_grouped_number_of_results, }) except SolrException as e: logger.warning('Search error: query: %s error %s' % (query, e)) tvars.update({ 'error_text': 'There was an error while searching, is your query correct?' }) except Exception as e: logger.error('Could probably not connect to Solr - %s' % e) tvars.update({ 'error_text': 'The search server could not be reached, please try again later.' }) if request.GET.get("ajax", "") != "1": return render(request, 'search/search.html', tvars) else: return render(request, 'search/search_ajax.html', tvars)
def search(request): search_query = request.GET.get("q", "") filter_query = request.GET.get("f", "") filter_query_link_more_when_grouping_packs = filter_query.replace(' ', '+') # Generate array with information of filters filter_query_split = [] if filter_query != "": for filter_str in re.findall(r'[\w-]+:\"[^\"]+', filter_query): filter_str = filter_str + '"' filter_display = filter_str.replace('"', '') filter_name = filter_str.split(":")[0] if filter_name != "duration" and filter_name != "is_geotagged": if filter_name == "grouping_pack": val = filter_display.split(":")[1] filter_display = "pack:" + val.split("_")[1] filter = { 'name': filter_display, 'remove_url': filter_query.replace(filter_str, ''), } filter_query_split.append(filter) try: current_page = int(request.GET.get("page", 1)) except ValueError: current_page = 1 sort = request.GET.get("s", None) sort_options = forms.SEARCH_SORT_OPTIONS_WEB grouping = request.GET.get("g", "1") # Group by default actual_groupnig = grouping # If the query is filtered by pack, do not collapse sounds of the same pack (makes no sense) # If the query is thourhg ajax (for sources remix editing), do not collapse if "pack" in filter_query or request.GET.get("ajax", "") == "1": actual_groupnig = "" # Set default values id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'original_filename'] # Parse advanced search options advanced = request.GET.get("advanced", "") # if advanced search if advanced == "1": a_tag = request.GET.get("a_tag", "") a_filename = request.GET.get("a_filename", "") a_description = request.GET.get("a_description", "") a_packname = request.GET.get("a_packname", "") a_soundid = request.GET.get("a_soundid", "") a_username = request.GET.get("a_username", "") # If none is selected use all (so other filter can be appleid) if a_tag or a_filename or a_description or a_packname or a_soundid or a_username != "": # Initialize all weights to 0 id_weight = 0 tag_weight = 0 description_weight = 0 username_weight = 0 pack_tokenized_weight = 0 original_filename_weight = 0 # Set the weights of selected checkboxes if a_soundid != "": id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] if a_tag != "": tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] if a_description != "": description_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'description'] if a_username != "": username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] if a_packname != "": pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'pack_tokenized'] if a_filename != "": original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS[ 'original_filename'] # ALLOW "q" empty queries #if search_query.strip() == "" sort = search_prepare_sort(sort, forms.SEARCH_SORT_OPTIONS_WEB) logger.info(u'Search (%s)' % json.dumps({ 'ip': get_client_ip(request), 'query': search_query, 'filter': filter_query, 'username': request.user.username, 'page': current_page, 'sort': sort[0], 'group_by_pack': actual_groupnig, 'advanced': json.dumps({ 'search_in_tag': a_tag, 'search_in_filename': a_filename, 'search_in_description': a_description, 'search_in_packname': a_packname, 'search_in_soundid': a_soundid, 'search_in_username': a_username }) if advanced == "1" else "" })) query = search_prepare_query(search_query, filter_query, sort, current_page, settings.SOUNDS_PER_PAGE, id_weight, tag_weight, description_weight, username_weight, pack_tokenized_weight, original_filename_weight, grouping=actual_groupnig) solr = Solr(settings.SOLR_URL) try: results = SolrResponseInterpreter(solr.select(unicode(query))) paginator = SolrResponseInterpreterPaginator(results, settings.SOUNDS_PER_PAGE) num_results = paginator.count non_grouped_number_of_results = results.non_grouped_number_of_matches page = paginator.page(current_page) error = False docs = results.docs resultids = [d.get("id") for d in docs] resultsounds = sounds.models.Sound.objects.bulk_query_id(resultids) allsounds = {} for s in resultsounds: allsounds[s.id] = s # allsounds will contain info from all the sounds returned by bulk_query_id. This should # be all sounds in docs, but if solr and db are not synchronised, it might happen that there # are ids in docs which are not found in bulk_query_id. To avoid problems we remove elements # in docs that have not been loaded in allsounds. docs = [doc for doc in docs if doc["id"] in allsounds] for d in docs: d["sound"] = allsounds[d["id"]] except SolrException, e: logger.warning("search error: query: %s error %s" % (query, e)) error = True error_text = 'There was an error while searching, is your query correct?'
def search(request): search_query = request.GET.get("q", "") filter_query = request.GET.get("f", "") filter_query_link_more_when_grouping_packs = filter_query.replace(' ','+') # Generate array with information of filters filter_query_split = [] if filter_query != "": for filter_str in re.findall(r'[\w-]+:\"[^\"]+', filter_query): valid_filter = True filter_str = filter_str + '"' filter_display = filter_str.replace('"', '') filter_name = filter_str.split(":")[0] if filter_name != "duration" and filter_name != "is_geotagged": if filter_name == "grouping_pack": val = filter_display.split(":")[1] # If pack does not contain "_" then it's not a valid pack filter if "_" in val: filter_display = "pack:"+ val.split("_")[1] else: valid_filter = False if valid_filter: filter = { 'name': filter_display, 'remove_url': filter_query.replace(filter_str, ''), } filter_query_split.append(filter) try: current_page = int(request.GET.get("page", 1)) except ValueError: current_page = 1 sort = request.GET.get("s", None) sort_options = forms.SEARCH_SORT_OPTIONS_WEB grouping = request.GET.get("g", "1") # Group by default # If the query is filtered by pack, do not collapse sounds of the same pack (makes no sense) # If the query is through AJAX (for sources remix editing), do not collapse if "pack" in filter_query or request.GET.get("ajax", "") == "1": grouping = "" # Set default values id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename'] # Parse advanced search options advanced = request.GET.get("advanced", "") advanced_search_params_dict = {} # if advanced search if advanced == "1": a_tag = request.GET.get("a_tag", "") a_filename = request.GET.get("a_filename", "") a_description = request.GET.get("a_description", "") a_packname = request.GET.get("a_packname", "") a_soundid = request.GET.get("a_soundid", "") a_username = request.GET.get("a_username", "") advanced_search_params_dict.update({ # These are stored in a dict to facilitate logging and passing to template 'a_tag': a_tag, 'a_filename': a_filename, 'a_description': a_description, 'a_packname': a_packname, 'a_soundid': a_soundid, 'a_username': a_username, }) # If none is selected use all (so other filter can be appleid) if a_tag or a_filename or a_description or a_packname or a_soundid or a_username != "" : # Initialize all weights to 0 id_weight = 0 tag_weight = 0 description_weight = 0 username_weight = 0 pack_tokenized_weight = 0 original_filename_weight = 0 # Set the weights of selected checkboxes if a_soundid != "": id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] if a_tag != "": tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] if a_description != "": description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] if a_username != "": username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] if a_packname != "": pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] if a_filename != "": original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename'] sort = search_prepare_sort(sort, forms.SEARCH_SORT_OPTIONS_WEB) logger.info(u'Search (%s)' % json.dumps({ 'ip': get_client_ip(request), 'query': search_query, 'filter': filter_query, 'username': request.user.username, 'page': current_page, 'sort': sort[0], 'group_by_pack': grouping, 'advanced': json.dumps(advanced_search_params_dict) if advanced == "1" else "" })) query = search_prepare_query(search_query, filter_query, sort, current_page, settings.SOUNDS_PER_PAGE, id_weight, tag_weight, description_weight, username_weight, pack_tokenized_weight, original_filename_weight, grouping=grouping ) tvars = { 'error_text': None, 'filter_query': filter_query, 'filter_query_split': filter_query_split, 'search_query': search_query, 'grouping': grouping, 'advanced': advanced, 'sort': sort, 'sort_options': sort_options, 'filter_query_link_more_when_grouping_packs': filter_query_link_more_when_grouping_packs, 'current_page': current_page, } if advanced == "1": tvars.update(advanced_search_params_dict) try: non_grouped_number_of_results, facets, paginator, page, docs = perform_solr_query(query, current_page) resultids = [d.get("id") for d in docs] resultsounds = sounds.models.Sound.objects.bulk_query_id(resultids) allsounds = {} for s in resultsounds: allsounds[s.id] = s # allsounds will contain info from all the sounds returned by bulk_query_id. This should # be all sounds in docs, but if solr and db are not synchronised, it might happen that there # are ids in docs which are not found in bulk_query_id. To avoid problems we remove elements # in docs that have not been loaded in allsounds. docs = [doc for doc in docs if doc["id"] in allsounds] for d in docs: d["sound"] = allsounds[d["id"]] tvars.update({ 'paginator': paginator, 'page': page, 'docs': docs, 'facets': facets, 'non_grouped_number_of_results': non_grouped_number_of_results, }) except SolrException as e: logger.warning('Search error: query: %s error %s' % (query, e)) tvars.update({'error_text': 'There was an error while searching, is your query correct?'}) except Exception as e: logger.error('Could probably not connect to Solr - %s' % e) tvars.update({'error_text': 'The search server could not be reached, please try again later.'}) if request.GET.get("ajax", "") != "1": return render(request, 'search/search.html', tvars) else: return render(request, 'search/search_ajax.html', tvars)
def search(request): search_query = request.GET.get("q", "") filter_query = request.GET.get("f", "") filter_query_link_more_when_grouping_packs = filter_query.replace(' ','+') logger.info(u'Search (%s)' % json.dumps({ 'ip': get_client_ip(request), 'query': search_query, 'filter': filter_query, 'username': request.user.username })) try: current_page = int(request.GET.get("page", 1)) except ValueError: current_page = 1 sort = request.GET.get("s", None) sort_options = forms.SEARCH_SORT_OPTIONS_WEB grouping = request.GET.get("g", "1") # Group by default actual_groupnig = grouping # If the query is filtered by pack, do not collapse sounds of the same pack (makes no sense) # If the query is thourhg ajax (for sources remix editing), do not collapse if "pack" in filter_query or request.GET.get("ajax", "") == "1": actual_groupnig = "" # Set default values id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename'] # Parse advanced search options advanced = request.GET.get("advanced", "") # if advanced search if advanced == "1" : a_tag = request.GET.get("a_tag", "") a_filename = request.GET.get("a_filename", "") a_description = request.GET.get("a_description", "") a_packname = request.GET.get("a_packname", "") a_soundid = request.GET.get("a_soundid", "") a_username = request.GET.get("a_username", "") # If none is selected use all (so other filter can be appleid) if a_tag or a_filename or a_description or a_packname or a_soundid or a_username != "" : # Initialize all weights to 0 id_weight = 0 tag_weight = 0 description_weight = 0 username_weight = 0 pack_tokenized_weight = 0 original_filename_weight = 0 # Set the weights of selected checkboxes if a_soundid != "" : id_weight = settings.DEFAULT_SEARCH_WEIGHTS['id'] if a_tag != "" : tag_weight = settings.DEFAULT_SEARCH_WEIGHTS['tag'] if a_description != "" : description_weight = settings.DEFAULT_SEARCH_WEIGHTS['description'] if a_username != "" : username_weight = settings.DEFAULT_SEARCH_WEIGHTS['username'] if a_packname != "" : pack_tokenized_weight = settings.DEFAULT_SEARCH_WEIGHTS['pack_tokenized'] if a_filename != "" : original_filename_weight = settings.DEFAULT_SEARCH_WEIGHTS['original_filename'] # ALLOW "q" empty queries #if search_query.strip() == "" sort = search_prepare_sort(sort, forms.SEARCH_SORT_OPTIONS_WEB) query = search_prepare_query(search_query, filter_query, sort, current_page, settings.SOUNDS_PER_PAGE, id_weight, tag_weight, description_weight, username_weight, pack_tokenized_weight, original_filename_weight, grouping = actual_groupnig ) solr = Solr(settings.SOLR_URL) try: results = SolrResponseInterpreter(solr.select(unicode(query))) paginator = SolrResponseInterpreterPaginator(results, settings.SOUNDS_PER_PAGE) num_results = paginator.count non_grouped_number_of_results = results.non_grouped_number_of_matches page = paginator.page(current_page) error = False docs = results.docs resultids = [d.get("id") for d in docs] resultsounds = sounds.models.Sound.objects.bulk_query_id(resultids) allsounds = {} for s in resultsounds: allsounds[s.id] = s for d in docs: d["sound"] = allsounds[d["id"]] # clickusage tracking if settings.LOG_CLICKTHROUGH_DATA: request_full_path = request.get_full_path() # The session id of an unauthenticated user is different from the session id of the same user when # authenticated. request.session["searchtime_session_key"] = request.session.session_key if results.docs is not None: ids = [] for item in results.docs: ids.append(item["id"]) logger_click.info("QUERY : %s : %s : %s : %s" % (unicode(request_full_path).encode('utf-8'), request.session.session_key, unicode(ids).encode('utf-8'), unicode(current_page).encode('utf-8'))) except SolrException, e: logger.warning("search error: query: %s error %s" % (query, e)) error = True error_text = 'There was an error while searching, is your query correct?'