def signature_report(request, default_context=None): context = default_context params = get_validated_params(request) if isinstance(params, http.HttpResponseBadRequest): # There was an error in the form, let's return it. return params signature = request.GET.get('signature') if not signature: return http.HttpResponseBadRequest( '"signature" parameter is mandatory') context['signature'] = signature fields = sorted(x['name'] for x in SuperSearchFields().get().values() if x['is_exposed'] and x['is_returned'] and has_permissions(request.user, x['permissions_needed']) and x['name'] != 'signature' # exclude the signature field ) context['fields'] = [{ 'id': field, 'text': field.replace('_', ' ') } for field in fields] context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS context['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict(get_report_list_parameters(params)), True) return render(request, 'signature/signature_report.html', context)
def signature_report(request, params, default_context=None): context = default_context signature = request.GET.get('signature') if not signature: return http.HttpResponseBadRequest( '"signature" parameter is mandatory' ) context['signature'] = signature fields = sorted( x['name'] for x in SuperSearchFields().get().values() if x['is_exposed'] and x['is_returned'] and has_permissions(request.user, x['permissions_needed']) and x['name'] != 'signature' # exclude the signature field ) context['fields'] = [ {'id': field, 'text': field.replace('_', ' ')} for field in fields ] columns = request.GET.getlist('_columns') columns = [x for x in columns if x in fields] context['columns'] = columns or DEFAULT_COLUMNS sort = request.GET.getlist('_sort') sort = [x for x in sort if x in fields] context['sort'] = sort or DEFAULT_SORT context['channels'] = ','.join(settings.CHANNELS).split(',') context['channel'] = settings.CHANNEL context['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict( get_report_list_parameters(params) ), True ) return render(request, 'signature/signature_report.html', context)
def signature_report(request, default_context=None): context = default_context params = get_validated_params(request) if isinstance(params, http.HttpResponseBadRequest): # There was an error in the form, let's return it. return params signature = request.GET.get('signature') if not signature: return http.HttpResponseBadRequest( '"signature" parameter is mandatory' ) context['signature'] = signature fields = sorted( x['name'] for x in SuperSearchFields().get().values() if x['is_exposed'] and x['is_returned'] and has_permissions(request.user, x['permissions_needed']) and x['name'] != 'signature' # exclude the signature field ) context['fields'] = [ {'id': field, 'text': field.replace('_', ' ')} for field in fields ] context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS context['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict( get_report_list_parameters(params) ), True ) return render(request, 'signature/signature_report.html', context)
def signature_report(request, params, default_context=None): context = default_context signature = request.GET.get('signature') if not signature: return http.HttpResponseBadRequest( '"signature" parameter is mandatory' ) context['signature'] = signature fields = sorted( x['name'] for x in SuperSearchFields().get().values() if x['is_exposed'] and x['is_returned'] and has_permissions(request.user, x['permissions_needed']) and x['name'] != 'signature' # exclude the signature field ) context['fields'] = [ {'id': field, 'text': field.replace('_', ' ')} for field in fields ] context['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS context['channels'] = ','.join(settings.CHANNELS).split(',') context['channel'] = settings.CHANNEL context['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict( get_report_list_parameters(params) ), True ) return render(request, 'signature/signature_report.html', context)
for hit in search_results['facets']['signature']: sig = hit['term'] if sig in bugs: if 'bugs' in hit: hit['bugs'].extend(bugs[sig]) else: hit['bugs'] = bugs[sig] search_results['total_pages'] = int(math.ceil( search_results['total'] / float(results_per_page))) search_results['total_count'] = search_results['total'] data['query'] = search_results data['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict( get_report_list_parameters(params) ), True ) return render(request, 'supersearch/search_results.html', data) @waffle_switch('supersearch-all') @utils.json_view def search_fields(request): '''Return the JSON document describing the fields used by the JavaScript dynamic_form library. ''' form = get_supersearch_form(request) return form.get_fields_list()
def search_results(request): products = models.ProductsVersions().get() versions = models.CurrentVersions().get() platforms = models.Platforms().get() form = forms.SearchForm( products, versions, platforms, request.user.is_authenticated(), request.GET ) if not form.is_valid(): return http.HttpResponseBadRequest(str(form.errors)) params = {} for key in form.cleaned_data: if hasattr(form.fields[key], 'prefixed_value'): value = form.fields[key].prefixed_value else: value = form.cleaned_data[key] params[key] = value data = {} data['query'] = { 'total': 0, 'total_count': 0, 'total_pages': 0 } allowed_fields = ALL_POSSIBLE_FIELDS if request.user.is_authenticated(): allowed_fields += ADMIN_RESTRICTED_FIELDS current_query = request.GET.copy() if 'page' in current_query: del current_query['page'] data['params'] = current_query.copy() if '_columns' in data['params']: del data['params']['_columns'] if '_facets' in params: del data['params']['_facets'] params['_facets'] = request.GET.getlist('_facets') or DEFAULT_FACETS data['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS # Make sure only allowed fields are used params['_facets'] = [ x for x in params['_facets'] if x in allowed_fields ] data['columns'] = [ x for x in data['columns'] if x in allowed_fields ] try: current_page = int(request.GET.get('page', 1)) except ValueError: return http.HttpResponseBadRequest('Invalid page') if current_page <= 0: current_page = 1 results_per_page = 50 data['current_page'] = current_page data['results_offset'] = results_per_page * (current_page - 1) params['_results_number'] = results_per_page params['_results_offset'] = data['results_offset'] data['current_url'] = '%s?%s' % ( reverse('supersearch.search'), current_query.urlencode() ) api = SuperSearch() search_results = api.get(**params) if 'signature' in search_results['facets']: # Bugs for each signature signatures = [h['term'] for h in search_results['facets']['signature']] if signatures: bugs = defaultdict(list) bugs_api = models.Bugs() for b in bugs_api.get(signatures=signatures)['hits']: bugs[b['signature']].append(b['id']) for hit in search_results['facets']['signature']: sig = hit['term'] if sig in bugs: if 'bugs' in hit: hit['bugs'].extend(bugs[sig]) else: hit['bugs'] = bugs[sig] search_results['total_pages'] = int(math.ceil( search_results['total'] / float(results_per_page))) search_results['total_count'] = search_results['total'] data['query'] = search_results data['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict( get_report_list_parameters(params) ), True ) return render(request, 'supersearch/search_results.html', data)
for hit in search_results['facets']['signature']: sig = hit['term'] if sig in bugs: if 'bugs' in hit: hit['bugs'].extend(bugs[sig]) else: hit['bugs'] = bugs[sig] search_results['total_pages'] = int( math.ceil(search_results['total'] / float(results_per_page))) search_results['total_count'] = search_results['total'] data['query'] = search_results data['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict(get_report_list_parameters(params)), True) return render(request, 'supersearch/search_results.html', data) @waffle_switch('supersearch-all') @utils.json_view def search_fields(request): '''Return the JSON document describing the fields used by the JavaScript dynamic_form library. ''' form = get_supersearch_form(request) return form.get_fields_list() def get_report_list_parameters(source): '''Return a list of parameters that are compatible with the report/list
def search_results(request): products = models.ProductsVersions().get() versions = models.CurrentVersions().get() platforms = models.Platforms().get() form = forms.SearchForm(products, versions, platforms, request.user.has_perm("crashstats.view_pii"), request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(str(form.errors)) params = {} for key in form.cleaned_data: if hasattr(form.fields[key], "prefixed_value"): value = form.fields[key].prefixed_value else: value = form.cleaned_data[key] params[key] = value data = {} data["query"] = {"total": 0, "total_count": 0, "total_pages": 0} allowed_fields = ALL_POSSIBLE_FIELDS if request.user.has_perm("crashstats.view_pii"): allowed_fields += PII_RESTRICTED_FIELDS current_query = request.GET.copy() if "page" in current_query: del current_query["page"] data["params"] = current_query.copy() if "_columns" in data["params"]: del data["params"]["_columns"] if "_facets" in params: del data["params"]["_facets"] params["_facets"] = request.GET.getlist("_facets") or DEFAULT_FACETS data["columns"] = request.GET.getlist("_columns") or DEFAULT_COLUMNS # Make sure only allowed fields are used params["_facets"] = [x for x in params["_facets"] if x in allowed_fields] data["columns"] = [x for x in data["columns"] if x in allowed_fields] try: current_page = int(request.GET.get("page", 1)) except ValueError: return http.HttpResponseBadRequest("Invalid page") if current_page <= 0: current_page = 1 results_per_page = 50 data["current_page"] = current_page data["results_offset"] = results_per_page * (current_page - 1) params["_results_number"] = results_per_page params["_results_offset"] = data["results_offset"] data["current_url"] = "%s?%s" % (reverse("supersearch.search"), current_query.urlencode()) api = SuperSearch() search_results = api.get(**params) if "signature" in search_results["facets"]: # Bugs for each signature signatures = [h["term"] for h in search_results["facets"]["signature"]] if signatures: bugs = defaultdict(list) bugs_api = models.Bugs() for b in bugs_api.get(signatures=signatures)["hits"]: bugs[b["signature"]].append(b["id"]) for hit in search_results["facets"]["signature"]: sig = hit["term"] if sig in bugs: if "bugs" in hit: hit["bugs"].extend(bugs[sig]) else: hit["bugs"] = bugs[sig] search_results["total_pages"] = int(math.ceil(search_results["total"] / float(results_per_page))) search_results["total_count"] = search_results["total"] data["query"] = search_results data["report_list_query_string"] = urllib.urlencode(utils.sanitize_dict(get_report_list_parameters(params)), True) return render(request, "supersearch/search_results.html", data)
def search_results(request): products = models.ProductsVersions().get() versions = models.CurrentVersions().get() platforms = models.Platforms().get() form = forms.SearchForm(products, versions, platforms, request.user.is_authenticated(), request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(str(form.errors)) params = {} for key in form.cleaned_data: if hasattr(form.fields[key], 'prefixed_value'): value = form.fields[key].prefixed_value else: value = form.cleaned_data[key] params[key] = value data = {} data['query'] = {'total': 0, 'total_count': 0, 'total_pages': 0} allowed_fields = ALL_POSSIBLE_FIELDS if request.user.is_authenticated(): allowed_fields += ADMIN_RESTRICTED_FIELDS current_query = request.GET.copy() if 'page' in current_query: del current_query['page'] data['params'] = current_query.copy() if '_columns' in data['params']: del data['params']['_columns'] if '_facets' in params: del data['params']['_facets'] params['_facets'] = request.GET.getlist('_facets') or DEFAULT_FACETS data['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS # Make sure only allowed fields are used params['_facets'] = [x for x in params['_facets'] if x in allowed_fields] data['columns'] = [x for x in data['columns'] if x in allowed_fields] try: current_page = int(request.GET.get('page', 1)) except ValueError: return http.HttpResponseBadRequest('Invalid page') if current_page <= 0: current_page = 1 results_per_page = 50 data['current_page'] = current_page data['results_offset'] = results_per_page * (current_page - 1) params['_results_number'] = results_per_page params['_results_offset'] = data['results_offset'] data['current_url'] = '%s?%s' % (reverse('supersearch.search'), current_query.urlencode()) api = SuperSearch() search_results = api.get(**params) if 'signature' in search_results['facets']: # Bugs for each signature signatures = [h['term'] for h in search_results['facets']['signature']] if signatures: bugs = defaultdict(list) bugs_api = models.Bugs() for b in bugs_api.get(signatures=signatures)['hits']: bugs[b['signature']].append(b['id']) for hit in search_results['facets']['signature']: sig = hit['term'] if sig in bugs: if 'bugs' in hit: hit['bugs'].extend(bugs[sig]) else: hit['bugs'] = bugs[sig] search_results['total_pages'] = int( math.ceil(search_results['total'] / float(results_per_page))) search_results['total_count'] = search_results['total'] data['query'] = search_results data['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict(get_report_list_parameters(params)), True) return render(request, 'supersearch/search_results.html', data)
def search_results(request): '''Return the results of a search. ''' try: params = get_params(request) except ValidationError as e: # There was an error in the form, let's return it. return http.HttpResponseBadRequest(str(e)) data = {} data['query'] = { 'total': 0, 'total_count': 0, 'total_pages': 0 } allowed_fields = get_allowed_fields(request.user) current_query = request.GET.copy() if 'page' in current_query: del current_query['page'] data['params'] = current_query.copy() if '_columns' in data['params']: del data['params']['_columns'] if '_facets' in data['params']: del data['params']['_facets'] data['columns'] = request.GET.getlist('_columns') or DEFAULT_COLUMNS # Make sure only allowed fields are used data['columns'] = [ x for x in data['columns'] if x in allowed_fields ] # Copy the list of columns so that they can differ. params['_columns'] = list(data['columns']) # The uuid is always displayed in the UI so we need to make sure it is # always returned by the model. if 'uuid' not in params['_columns']: params['_columns'].append('uuid') # The `uuid` field is a special case, it is always displayed in the first # column of the table. Hence we do not want to show it again in the # auto-generated list of columns, so we its name from the list of # columns to display. if 'uuid' in data['columns']: data['columns'].remove('uuid') try: current_page = int(request.GET.get('page', 1)) except ValueError: return http.HttpResponseBadRequest('Invalid page') if current_page <= 0: current_page = 1 results_per_page = 50 data['current_page'] = current_page data['results_offset'] = results_per_page * (current_page - 1) params['_results_number'] = results_per_page params['_results_offset'] = data['results_offset'] data['current_url'] = '%s?%s' % ( reverse('supersearch.search'), current_query.urlencode() ) api = SuperSearchUnredacted() try: search_results = api.get(**params) except models.BadStatusCodeError as e: # We need to return the error message in some HTML form for jQuery to # pick it up. return http.HttpResponseBadRequest('<ul><li>%s</li></ul>' % e) if 'signature' in search_results['facets']: # Bugs for each signature signatures = [h['term'] for h in search_results['facets']['signature']] if signatures: bugs = defaultdict(list) bugs_api = models.Bugs() for b in bugs_api.get(signatures=signatures)['hits']: bugs[b['signature']].append(b['id']) for hit in search_results['facets']['signature']: sig = hit['term'] if sig in bugs: if 'bugs' in hit: hit['bugs'].extend(bugs[sig]) else: hit['bugs'] = bugs[sig] search_results['total_pages'] = int(math.ceil( search_results['total'] / float(results_per_page))) search_results['total_count'] = search_results['total'] data['query'] = search_results data['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict( get_report_list_parameters(params) ), True ) return render(request, 'supersearch/search_results.html', data)
def search_results(request): products = models.ProductsVersions().get() versions = models.CurrentVersions().get() platforms = models.Platforms().get() form = forms.SearchForm(products, versions, platforms, request.GET) if not form.is_valid(): return http.HttpResponseBadRequest(str(form.errors)) params = {} for key in form.cleaned_data: # if hasattr(form.fields[key], 'prefixed_value'): # value = form.fields[key].prefixed_value # else: value = form.cleaned_data[key] if key == 'date' and value: to_date = None from_date = None for i, item in enumerate(form.fields[key].prefixed_value): if item.startswith('<'): to_date = form.cleaned_data[key][i] elif item.startswith('>'): from_date = form.cleaned_data[key][i] params['end_date'] = to_date params['start_date'] = from_date continue if key == 'signature' and value: search_mode = 'is_exactly' if form.cleaned_data[key].startswith('~'): search_mode = 'contains' elif form.cleaned_data[key].startswith('$'): search_mode = 'starts_with' if search_mode != 'is_exactly': value = value[1:] params['search_mode'] = search_mode params[PARAMS_MAPPING.get(key, key)] = value data = {} data['query'] = { 'total': 0, 'total_count': 0, 'total_pages': 0 } current_query = request.GET.copy() if 'page' in current_query: del current_query['page'] data['params'] = current_query try: data['current_page'] = int(request.GET.get('page', 1)) except ValueError: return http.HttpResponseBadRequest('Invalid page') results_per_page = 100 data['results_offset'] = results_per_page * (data['current_page'] - 1) params['result_number'] = results_per_page params['result_offset'] = data['results_offset'] data['current_url'] = '%s?%s' % (reverse('supersearch.search'), current_query.urlencode()) api = models.Search() search_results = api.get(**params) search_results['total_pages'] = int(math.ceil( search_results['total'] / float(results_per_page))) search_results['total_count'] = search_results['total'] data['query'] = search_results data['report_list_query_string'] = urllib.urlencode( utils.sanitize_dict(current_query), True ) return render(request, 'supersearch/search_results.html', data)
for b in bugs_api.get(signatures=signatures)["hits"]: bugs[b["signature"]].append(b["id"]) for hit in search_results["facets"]["signature"]: sig = hit["term"] if sig in bugs: if "bugs" in hit: hit["bugs"].extend(bugs[sig]) else: hit["bugs"] = bugs[sig] search_results["total_pages"] = int(math.ceil(search_results["total"] / float(results_per_page))) search_results["total_count"] = search_results["total"] data["query"] = search_results data["report_list_query_string"] = urllib.urlencode(utils.sanitize_dict(get_report_list_parameters(params)), True) return render(request, "supersearch/search_results.html", data) @waffle_switch("supersearch-all") @utils.json_view def search_fields(request): products = models.ProductsVersions().get() versions = models.CurrentVersions().get() platforms = models.Platforms().get() form = forms.SearchForm( products, versions, platforms,