Пример #1
0
 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)
Пример #2
0
    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
Пример #3
0
    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)
Пример #4
0
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
Пример #5
0
    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
Пример #6
0
 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
Пример #7
0
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
Пример #8
0
 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
Пример #9
0
 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)
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
 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
Пример #14
0
 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