def test_invalid(self): filters = [ SearchFilter(SearchKey("status"), "=", SearchValue("wrong")) ] with self.assertRaises(InvalidSearchQuery, expected_regex="invalid status value"): convert_query_values(filters, [self.project], self.user, None)
def test_valid(self): for status_string, status_val in STATUS_CHOICES.items(): filters = [SearchFilter(SearchKey("status"), "=", SearchValue(status_string))] result = convert_query_values(filters, [self.project], self.user, None) assert result[0].value.raw_value == status_val filters = [SearchFilter(SearchKey("status"), "=", SearchValue(status_val))] result = convert_query_values(filters, [self.project], self.user, None) assert result[0].value.raw_value == status_val
def test_invalid(self): filters = [SearchFilter(SearchKey("status"), "=", SearchValue("wrong"))] with self.assertRaises(InvalidSearchQuery, expected_regex="invalid status value"): convert_query_values(filters, [self.project], self.user, None) filters = [AggregateFilter(AggregateKey("count_unique(user)"), ">", SearchValue("1"))] with self.assertRaises( InvalidSearchQuery, expected_regex="Aggregate filters (count_unique(user)) are not supported in issue searches.", ): convert_query_values(filters, [self.project], self.user, None)
def build_query_params_from_request(request, organization, projects, environments): query_kwargs = {"projects": projects, "sort_by": request.GET.get("sort", DEFAULT_SORT_OPTION)} limit = request.GET.get("limit") if limit: try: query_kwargs["limit"] = int(limit) except ValueError: raise ValidationError("invalid limit") # TODO: proper pagination support if request.GET.get("cursor"): try: query_kwargs["cursor"] = Cursor.from_string(request.GET.get("cursor")) except ValueError: raise ParseError(detail="Invalid cursor parameter.") query = request.GET.get("query", "is:unresolved").strip() if query: try: search_filters = convert_query_values( parse_search_query(query), projects, request.user, environments ) except InvalidSearchQuery as e: raise ValidationError(u"Your search query could not be parsed: {}".format(e.message)) validate_search_filter_permissions(organization, search_filters, request.user) query_kwargs["search_filters"] = search_filters return query_kwargs
def _count(self, request, query, organization, projects, environments, extra_query_kwargs=None): query_kwargs = {"projects": projects} query = query.strip() if query: search_filters = convert_query_values(parse_search_query(query), projects, request.user, environments) validate_search_filter_permissions(organization, search_filters, request.user) query_kwargs["search_filters"] = search_filters if extra_query_kwargs is not None: assert "environment" not in extra_query_kwargs query_kwargs.update(extra_query_kwargs) query_kwargs["environments"] = environments if environments else None query_kwargs["max_hits"] = ISSUES_COUNT_MAX_HITS_LIMIT result = search.query(**query_kwargs) return result.hits
def test_valid_converter(self): filters = [SearchFilter(SearchKey("assigned_to"), "=", SearchValue("me"))] expected = value_converters["assigned_to"]( filters[0].value.raw_value, [self.project], self.user, None ) filters = convert_query_values(filters, [self.project], self.user, None) assert filters[0].value.raw_value == expected
def build_query_params_from_request(request, organization, projects, environments): query_kwargs = { 'projects': projects, 'sort_by': request.GET.get('sort', DEFAULT_SORT_OPTION), } limit = request.GET.get('limit') if limit: try: query_kwargs['limit'] = int(limit) except ValueError: raise ValidationError('invalid limit') # TODO: proper pagination support cursor = request.GET.get('cursor') if cursor: query_kwargs['cursor'] = Cursor.from_string(cursor) query = request.GET.get('query', 'is:unresolved').strip() if query: try: search_filters = convert_query_values( parse_search_query(query), projects, request.user, environments, ) except InvalidSearchQuery as e: raise ValidationError(u'Your search query could not be parsed: {}'.format(e.message)) validate_search_filter_permissions(organization, search_filters) query_kwargs['search_filters'] = search_filters return query_kwargs
def test_valid_converter(self): filters = [SearchFilter(SearchKey('assigned_to'), '=', SearchValue('me'))] expected = value_converters['assigned_to']( filters[0].value.raw_value, [self.project], self.user, ) filters = convert_query_values(filters, [self.project], self.user) assert filters[0].value.raw_value == expected
def build_search_filter(self, query, projects=None, user=None, environments=None): user = user if user is not None else self.user projects = projects if projects is not None else [self.project] return convert_query_values(parse_search_query(query), projects, user, environments)
def build_query_params_from_request(request, organization, projects, environments): query_kwargs = { 'projects': projects, 'sort_by': request.GET.get('sort', DEFAULT_SORT_OPTION), } limit = request.GET.get('limit') if limit: try: query_kwargs['limit'] = int(limit) except ValueError: raise ValidationError('invalid limit') # TODO: proper pagination support cursor = request.GET.get('cursor') if cursor: query_kwargs['cursor'] = Cursor.from_string(cursor) query = request.GET.get('query', 'is:unresolved').strip() use_new_filters = request.GET.get('use_new_filters', '1') == '1' if query: try: query_kwargs.update( parse_query(projects, query, request.user, environments)) except InvalidQuery as e: raise ValidationError( u'Your search query could not be parsed: {}'.format(e.message)) try: search_filters = convert_query_values( parse_search_query(query), projects, request.user, environments, ) except Exception: # TODO: Catch less broad exceptions when we're confident in these # new filters logging.exception( 'Error occurred while parsing new style search query') search_filters = [] # If something goes wrong here we just want to use the working # filters use_new_filters = False if use_new_filters: validate_search_filter_permissions(organization, search_filters) query_kwargs['search_filters'] = search_filters query_kwargs['use_new_filters'] = use_new_filters return query_kwargs
def build_query_params_from_request( request: Request, organization: "Organization", projects: Sequence["Project"], environments: Optional[Sequence["Environment"]], ) -> MutableMapping[str, Any]: query_kwargs = { "projects": projects, "sort_by": request.GET.get("sort", DEFAULT_SORT_OPTION) } limit = request.GET.get("limit") if limit: try: query_kwargs["limit"] = int(limit) except ValueError: raise ValidationError("invalid limit") # TODO: proper pagination support if request.GET.get("cursor"): try: query_kwargs["cursor"] = Cursor.from_string( request.GET.get("cursor")) except ValueError: raise ParseError(detail="Invalid cursor parameter.") query = request.GET.get("query", "is:unresolved").strip() sentry_sdk.set_tag("search.query", query) sentry_sdk.set_tag("search.sort", query) if projects: sentry_sdk.set_tag("search.projects", len(projects) if len(projects) <= 5 else ">5") if environments: sentry_sdk.set_tag( "search.environments", len(environments) if len(environments) <= 5 else ">5") if query: try: search_filters = convert_query_values(parse_search_query(query), projects, request.user, environments) except InvalidSearchQuery as e: raise ValidationError(f"Error parsing search query: {e}") validate_search_filter_permissions(organization, search_filters, request.user) query_kwargs["search_filters"] = search_filters return query_kwargs
def build_query_params_from_request(request, organization, projects, environments): query_kwargs = { 'projects': projects, 'sort_by': request.GET.get('sort', DEFAULT_SORT_OPTION), } limit = request.GET.get('limit') if limit: try: query_kwargs['limit'] = int(limit) except ValueError: raise ValidationError('invalid limit') # TODO: proper pagination support cursor = request.GET.get('cursor') if cursor: query_kwargs['cursor'] = Cursor.from_string(cursor) query = request.GET.get('query', 'is:unresolved').strip() if query: try: query_kwargs.update( parse_query(projects, query, request.user, environments)) except InvalidQuery as e: raise ValidationError( u'Your search query could not be parsed: {}'.format(e.message)) try: search_filters = convert_query_values( parse_search_query(query), projects, request.user, environments, ) except InvalidSearchQuery as e: raise ValidationError( u'Your search query could not be parsed: {}'.format(e.message)) validate_search_filter_permissions(organization, search_filters) query_kwargs['search_filters'] = search_filters return query_kwargs
def test_no_converter(self): search_val = SearchValue("me") filters = [SearchFilter(SearchKey("something"), "=", search_val)] filters = convert_query_values(filters, [self.project], self.user, None) assert filters[0].value.raw_value == search_val.raw_value
def test_no_converter(self): search_val = SearchValue('me') filters = [SearchFilter(SearchKey('something'), '=', search_val)] filters = convert_query_values(filters, [self.project], self.user) assert filters[0].value.raw_value == search_val.raw_value