def get_snuba_query_args(self, request, organization, params): query = request.GET.get('query') group_ids = request.GET.getlist('group') if group_ids: # TODO(mark) This parameter should be removed in the long term. # Instead of using this parameter clients should use `issue.id` # in their query string. try: group_ids = set(map(int, filter(None, group_ids))) except ValueError: raise OrganizationEventsError('Invalid group parameter. Values must be numbers') projects = Project.objects.filter( organization=organization, group__id__in=group_ids, ).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params['issue.id'] = list(group_ids) params['project_id'] = list(set([p.id for p in projects] + params['project_id'])) try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) sort = request.GET.getlist('sort') if sort: snuba_args['orderby'] = sort # Deprecated. `sort` should be used as it is supported by # more endpoints. orderby = request.GET.getlist('orderby') if orderby and 'orderby' not in snuba_args: snuba_args['orderby'] = orderby if request.GET.get('rollup'): try: snuba_args['rollup'] = int(request.GET.get('rollup')) except ValueError: raise OrganizationEventsError('rollup must be an integer.') fields = request.GET.getlist('field')[:] if fields: try: snuba_args.update(resolve_field_list(fields, snuba_args)) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has( 'organizations:boolean-search', organization, actor=request.user ) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.') return snuba_args
def get_snuba_query_args(self, request, organization): params = self.get_filter_params(request, organization) group_ids = set(map(int, request.GET.getlist('group'))) if group_ids: projects = Project.objects.filter( organization=organization, group__id__in=group_ids, ).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params['issue.id'] = list(group_ids) params['project_id'] = list( set([p.id for p in projects] + params['project_id'])) query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has('organizations:boolean-search', organization, actor=request.user) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.' ) return snuba_args
def get_snuba_query_args_legacy(self, request, organization): params = self.get_filter_params(request, organization) group_ids = request.GET.getlist("group") if group_ids: # TODO(mark) This parameter should be removed in the long term. # Instead of using this parameter clients should use `issue.id` # in their query string. try: group_ids = set(map(int, filter(None, group_ids))) except ValueError: raise OrganizationEventsError("Invalid group parameter. Values must be numbers") projects = Project.objects.filter( organization=organization, group__id__in=group_ids ).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params["group_ids"] = list(group_ids) params["project_id"] = list(set([p.id for p in projects] + params["project_id"])) query = request.GET.get("query") try: _filter = get_filter(query, params) except InvalidSearchQuery as e: raise OrganizationEventsError(six.text_type(e)) snuba_args = { "start": _filter.start, "end": _filter.end, "conditions": _filter.conditions, "filter_keys": _filter.filter_keys, } return snuba_args
def get_snuba_query_args_v2(self, request, organization): params = self.get_filter_params(request, organization) query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) fields = request.GET.getlist('fields') if fields: snuba_args['selected_columns'] = fields else: raise OrganizationEventsError('No fields requested.') groupby = request.GET.getlist('groupby') if groupby: snuba_args['groupby'] = groupby orderby = request.GET.get('orderby') if orderby: snuba_args['orderby'] = orderby # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has('organizations:boolean-search', organization, actor=request.user) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.' ) return snuba_args
def _validate_keys(self, request): keys = request.GET.getlist('key') if not keys: raise OrganizationEventsError('Tag keys must be specified.') for key in keys: if not tagstore.is_valid_key(key): raise OrganizationEventsError('Tag key %s is not valid.' % key) return keys
def _validate_key(self, request): key = request.GET.get("key") if not key: raise OrganizationEventsError("Tag key must be specified.") if not tagstore.is_valid_key(key): raise OrganizationEventsError("Tag key %s is not valid." % key) return key
def get_snuba_query_args_v2(self, request, organization, params): query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) fields = request.GET.getlist('field')[:] aggregations = [] groupby = request.GET.getlist('groupby') special_fields = set() if fields: # If project.name is requested, get the project.id from Snuba so we # can use this to look up the name in Sentry if 'project.name' in fields: fields.remove('project.name') if 'project.id' not in fields: fields.append('project.id') for field in fields[:]: if field in SPECIAL_FIELDS: special_fields.add(field) special_field = deepcopy(SPECIAL_FIELDS[field]) fields.remove(field) fields.extend(special_field.get('fields', [])) aggregations.extend(special_field.get('aggregations', [])) groupby.extend(special_field.get('groupby', [])) snuba_args['selected_columns'] = fields self._filter_unspecified_special_fields_in_conditions( snuba_args, special_fields) if aggregations: snuba_args['aggregations'] = aggregations if groupby: snuba_args['groupby'] = groupby orderby = request.GET.getlist('orderby') if orderby: snuba_args['orderby'] = orderby # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has('organizations:boolean-search', organization, actor=request.user) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.' ) return snuba_args
def get_snuba_query_args(self, request, organization): params = self.get_filter_params(request, organization) try: return get_snuba_query_args(query=request.GET.get('query'), params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message)
def get_snuba_query_args(self, request, organization, params): query = request.GET.get("query") try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) sort = request.GET.getlist("sort") if sort: snuba_args["orderby"] = sort # Deprecated. `sort` should be used as it is supported by # more endpoints. orderby = request.GET.getlist("orderby") if orderby and "orderby" not in snuba_args: snuba_args["orderby"] = orderby if request.GET.get("rollup"): try: snuba_args["rollup"] = int(request.GET.get("rollup")) except ValueError: raise OrganizationEventsError("rollup must be an integer.") fields = request.GET.getlist("field")[:] if fields: try: snuba_args.update(resolve_field_list(fields, snuba_args)) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) reference_event_id = request.GET.get("referenceEvent") if reference_event_id: reference_event = find_reference_event(snuba_args, reference_event_id) snuba_args["conditions"] = get_reference_event_conditions( snuba_args, reference_event.snuba_data) # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has("organizations:boolean-search", organization, actor=request.user) if snuba_args.pop("has_boolean_terms", False) and not has_boolean_op_flag: raise OrganizationEventsError( "Boolean search operator OR and AND not allowed in this search." ) return snuba_args
def get_snuba_filter(self, request, organization, params=None): if params is None: params = self.get_filter_params(request, organization) query = request.GET.get("query") try: return get_filter(query, params) except InvalidSearchQuery as e: raise OrganizationEventsError(six.text_type(e))
def get_snuba_query_args_legacy(self, request, organization): params = self.get_filter_params(request, organization) group_ids = request.GET.getlist("group") if group_ids: # TODO(mark) This parameter should be removed in the long term. # Instead of using this parameter clients should use `issue.id` # in their query string. try: group_ids = set(map(int, filter(None, group_ids))) except ValueError: raise OrganizationEventsError( "Invalid group parameter. Values must be numbers") projects = Project.objects.filter( organization=organization, group__id__in=group_ids).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params["issue.id"] = list(group_ids) params["project_id"] = list( set([p.id for p in projects] + params["project_id"])) query = request.GET.get("query") try: _filter = get_filter(query, params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) snuba_args = { "start": _filter.start, "end": _filter.end, "conditions": _filter.conditions, "filter_keys": _filter.filter_keys, } # 'legacy' endpoints cannot access transactions dataset. # as they often have assumptions about which columns are returned. dataset = snuba.detect_dataset(snuba_args, aliased_conditions=True) if dataset != snuba.Dataset.Events: raise OrganizationEventsError( "Invalid query. You cannot reference non-events data in this endpoint." ) return snuba_args
def get_snuba_query_args(self, request, organization, params): query = request.GET.get("query") try: filter = get_filter(query, params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) snuba_args = { "start": filter.start, "end": filter.end, "conditions": filter.conditions, "filter_keys": filter.filter_keys, } sort = request.GET.getlist("sort") if sort: snuba_args["orderby"] = sort # Deprecated. `sort` should be used as it is supported by # more endpoints. orderby = request.GET.getlist("orderby") if orderby and "orderby" not in snuba_args: snuba_args["orderby"] = orderby if request.GET.get("rollup"): try: snuba_args["rollup"] = int(request.GET.get("rollup")) except ValueError: raise OrganizationEventsError("rollup must be an integer.") fields = request.GET.getlist("field")[:] if fields: try: snuba_args.update(resolve_field_list(fields, snuba_args)) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) reference_event_id = request.GET.get("referenceEvent") if reference_event_id: snuba_args["conditions"] = get_reference_event_conditions( snuba_args, reference_event_id ) return snuba_args
def get_snuba_query_args(self, request, organization): params = self.get_filter_params(request, organization) group_ids = request.GET.getlist('group') if group_ids: try: group_ids = set(map(int, filter(None, group_ids))) except ValueError: raise OrganizationEventsError('Invalid group parameter. Values must be numbers') projects = Project.objects.filter( organization=organization, group__id__in=group_ids, ).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params['issue.id'] = list(group_ids) params['project_id'] = list(set([p.id for p in projects] + params['project_id'])) query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) # Filter out special aggregates. conditions = [] for condition in snuba_args.get('conditions', []): field_name = condition[0] if isinstance(field_name, (list, tuple)) or field_name not in SPECIAL_FIELDS: conditions.append(condition) snuba_args['conditions'] = conditions # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has( 'organizations:boolean-search', organization, actor=request.user ) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.') return snuba_args
def get_snuba_query_args(self, request, organization): params = self.get_filter_params(request, organization) query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has('organizations:boolean-search', organization, actor=request.user) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.' ) return snuba_args
def get_snuba_query_args_v2(self, request, organization, params): query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) fields = request.GET.getlist('field')[:] if fields: # If project.name is requested, get the project.id from Snuba so we # can use this to look up the name in Sentry if 'project.name' in fields: fields.remove('project.name') if 'project.id' not in fields: fields.append('project.id') snuba_args['selected_columns'] = fields aggregations = request.GET.getlist('aggregation') if aggregations: snuba_args['aggregations'] = [ aggregation.split(',') for aggregation in aggregations ] groupby = request.GET.getlist('groupby') if groupby: snuba_args['groupby'] = groupby orderby = request.GET.get('orderby') if orderby: snuba_args['orderby'] = orderby # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has('organizations:boolean-search', organization, actor=request.user) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.' ) return snuba_args
def _validate_project_ids(self, request, organization, snuba_args): project_ids = snuba_args["filter_keys"]["project_id"] has_global_views = features.has( "organizations:global-views", organization, actor=request.user ) if not has_global_views and len(project_ids) > 1: raise OrganizationEventsError("You cannot view events from multiple projects.") return project_ids
def get_snuba_query_args_legacy(self, request, organization): params = self.get_filter_params(request, organization) group_ids = request.GET.getlist('group') if group_ids: # TODO(mark) This parameter should be removed in the long term. # Instead of using this parameter clients should use `issue.id` # in their query string. try: group_ids = set(map(int, filter(None, group_ids))) except ValueError: raise OrganizationEventsError('Invalid group parameter. Values must be numbers') projects = Project.objects.filter( organization=organization, group__id__in=group_ids, ).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params['issue.id'] = list(group_ids) params['project_id'] = list(set([p.id for p in projects] + params['project_id'])) query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) # Filter out special aggregates. self._filter_unspecified_special_fields_in_conditions(snuba_args, set()) # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has( 'organizations:boolean-search', organization, actor=request.user ) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.') return snuba_args
def get_snuba_query_args_v2(self, request, organization, params): query = request.GET.get('query') try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) fields = request.GET.getlist('field')[:] aggregations = [] groupby = request.GET.getlist('groupby') if fields: # If project.name is requested, get the project.id from Snuba so we # can use this to look up the name in Sentry if 'project.name' in fields: fields.remove('project.name') if 'project.id' not in fields: fields.append('project.id') for field in fields[:]: if field in SPECIAL_FIELDS: special_field = deepcopy(SPECIAL_FIELDS[field]) fields.remove(field) fields.extend(special_field.get('fields', [])) aggregations.extend(special_field.get('aggregations', [])) groupby.extend(special_field.get('groupby', [])) snuba_args['selected_columns'] = fields conditions = snuba_args.get('conditions') # Add special fields to aggregations if missing if conditions: for condition in conditions: field = condition[0] if isinstance(field, (list, tuple)): continue if field in SPECIAL_FIELDS: aggregation_included = False for aggregate in aggregations: if aggregate[2] == field: aggregation_included = True break if not aggregation_included: aggregations.extend(deepcopy(SPECIAL_FIELDS[field]).get('aggregations', [])) if aggregations: snuba_args['aggregations'] = aggregations if groupby: snuba_args['groupby'] = groupby orderby = request.GET.getlist('orderby') if orderby: snuba_args['orderby'] = orderby # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has( 'organizations:boolean-search', organization, actor=request.user ) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.') return snuba_args
def get_snuba_query_args(self, request, organization, params): query = request.GET.get('query') group_ids = request.GET.getlist('group') if group_ids: try: group_ids = set(map(int, filter(None, group_ids))) except ValueError: raise OrganizationEventsError( 'Invalid group parameter. Values must be numbers') projects = Project.objects.filter( organization=organization, group__id__in=group_ids, ).distinct() if any(p for p in projects if not request.access.has_project_access(p)): raise PermissionDenied params['issue.id'] = list(group_ids) params['project_id'] = list( set([p.id for p in projects] + params['project_id'])) try: snuba_args = get_snuba_query_args(query=query, params=params) except InvalidSearchQuery as exc: raise OrganizationEventsError(exc.message) fields = request.GET.getlist('field')[:] aggregations = [] groupby = request.GET.getlist('groupby') special_fields = set() if fields: # If project.name is requested, get the project.id from Snuba so we # can use this to look up the name in Sentry if 'project.name' in fields: fields.remove('project.name') if 'project.id' not in fields: fields.append('project.id') for field in fields[:]: if field in SPECIAL_FIELDS: special_fields.add(field) special_field = deepcopy(SPECIAL_FIELDS[field]) fields.remove(field) fields.extend(special_field.get('fields', [])) aggregations.extend(special_field.get('aggregations', [])) groupby.extend(special_field.get('groupby', [])) snuba_args['selected_columns'] = fields self._filter_unspecified_special_fields_in_conditions( snuba_args, special_fields) if aggregations: snuba_args['aggregations'] = aggregations if groupby: snuba_args['groupby'] = groupby orderby = request.GET.getlist('orderby') if orderby: snuba_args['orderby'] = orderby # TODO(lb): remove once boolean search is fully functional has_boolean_op_flag = features.has('organizations:boolean-search', organization, actor=request.user) if snuba_args.pop('has_boolean_terms', False) and not has_boolean_op_flag: raise OrganizationEventsError( 'Boolean search operator OR and AND not allowed in this search.' ) return snuba_args