def get(self, request, project): """ List a Project's Users `````````````````````` Return a list of users seen within this project. :pparam string organization_slug: the slug of the organization. :pparam string project_slug: the slug of the project. :pparam string key: the tag key to look up. :auth: required :qparam string query: Limit results to users matching the given query. Prefixes should be used to suggest the field to match on: ``id``, ``email``, ``username``, ``ip``. For example, ``query=email:[email protected]`` """ queryset = EventUser.objects.filter(project_id=project.id) if request.GET.get("query"): try: field, identifier = request.GET["query"].strip().split(":", 1) except ValueError: return Response([]) # username and ip can return multiple eventuser objects if field in ("ip", "username"): queryset = queryset.filter( project_id=project.id, **{EventUser.attr_from_keyword(field): identifier}, ) else: try: queryset = [ queryset.get( project_id=project.id, **{EventUser.attr_from_keyword(field): identifier}, ) ] except EventUser.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) except KeyError: return Response([]) return Response(serialize(queryset, request.user)) return self.paginate( request=request, queryset=queryset, order_by="-date_added", paginator_cls=DateTimePaginator, on_results=lambda x: serialize(x, request.user), )
def get(self, request, project): """ List a Project's Users `````````````````````` Return a list of users seen within this project. :pparam string organization_slug: the slug of the organization. :pparam string project_slug: the slug of the project. :pparam string key: the tag key to look up. :auth: required :qparam string query: Limit results to users matching the given query. Prefixes should be used to suggest the field to match on: ``id``, ``email``, ``username``, ``ip``. For example, ``query=email:[email protected]`` """ queryset = EventUser.objects.filter(project_id=project.id) if request.GET.get("query"): pieces = request.GET["query"].strip().split(":", 1) if len(pieces) != 2: return Response([]) try: queryset = queryset.filter( **{u"{}__icontains".format(EventUser.attr_from_keyword(pieces[0])): pieces[1]} ) except KeyError: return Response([]) return self.paginate( request=request, queryset=queryset, order_by="-date_added", paginator_cls=DateTimePaginator, on_results=lambda x: serialize(x, request.user), )
def get_user_tag(project, key, value): # TODO(dcramer): do something with case of multiple matches try: lookup = EventUser.attr_from_keyword(key) euser = EventUser.objects.filter(project=project, **{lookup: value})[0] except (KeyError, IndexError): return "{}:{}".format(key, value) return euser.tag_value
def get_user_tag(project, key, value): # TODO(dcramer): do something with case of multiple matches try: lookup = EventUser.attr_from_keyword(key) euser = EventUser.objects.filter(project=project, **{lookup: value})[0] except (KeyError, IndexError): return '{}:{}'.format(key, value) return euser.tag_value
def test_attr_from_keyword(self): cases = [ ("id", "ident"), ("username", "username"), ("email", "email"), ("ip", "ip_address"), ] for keyword, attr in cases: assert EventUser.attr_from_keyword(keyword) == attr
def test_attr_from_keyword(self): cases = [ ('id', 'ident'), ('username', 'username'), ('email', 'email'), ('ip', 'ip_address'), ] for keyword, attr in cases: assert EventUser.attr_from_keyword(keyword) == attr
def test_attr_from_keyword(self): cases = [ ('id', 'ident'), ('username', 'username'), ('email', 'email'), ('ip', 'ip_address'), ] for keyword, attr in cases: assert EventUser.attr_from_keyword(keyword) == attr
def get_user_tag(project, key, value): # TODO(dcramer): do something with case of multiple matches try: lookup = EventUser.attr_from_keyword(key) euser = EventUser.objects.filter(project=project, **{lookup: value})[0] except (KeyError, IndexError): return u'{}:{}'.format(key, value) except DataError: raise InvalidQuery(u"malformed '{}:' query '{}'.".format(key, value)) return euser.tag_value
def get_user_tag(project, key, value): # TODO(dcramer): do something with case of multiple matches try: lookup = EventUser.attr_from_keyword(key) euser = EventUser.objects.filter( project_id=project.id, **{lookup: value})[0] except (KeyError, IndexError): return u'{}:{}'.format(key, value) except DataError: raise InvalidQuery(u"malformed '{}:' query '{}'.".format(key, value)) return euser.tag_value
def get_user_tag(projects, key, value): # TODO(dcramer): do something with case of multiple matches try: lookup = EventUser.attr_from_keyword(key) euser = EventUser.objects.filter( project_id__in=[p.id for p in projects], **{lookup: value})[0] except (KeyError, IndexError): return f"{key}:{value}" except DataError: raise InvalidQuery(f"malformed '{key}:' query '{value}'.") return euser.tag_value
def get_user_tag(projects, key, value): # TODO(dcramer): do something with case of multiple matches from sentry.models import EventUser # Django 1.9 setup issue try: lookup = EventUser.attr_from_keyword(key) euser = EventUser.objects.filter( project_id__in=[p.id for p in projects], **{lookup: value})[0] except (KeyError, IndexError): return u'{}:{}'.format(key, value) except DataError: raise InvalidQuery(u"malformed '{}:' query '{}'.".format(key, value)) return euser.tag_value
def serialize_eventusers(organization, item_list, user, lookup): if not item_list: return {} # We have no reliable way to map the tag value format # back into real EventUser rows. EventUser is only unique # per-project, and this is an organization aggregate. # This means a single value maps to multiple rows. filters = reduce( or_, [ Q(hash=EventUser.hash_from_tag(tag), project_id=project) for tag, project in item_list ], ) eu_by_key = {(eu.tag_value, eu.project_id): eu for eu in EventUser.objects.filter(filters)} projects = serialize_projects(organization, {i[1] for i in item_list}, user) rv = {} for tag, project in item_list: eu = eu_by_key.get((tag, project)) if eu is None: attr, value = tag.split(":", 1) eu = EventUser(project_id=project, **{EventUser.attr_from_keyword(attr): value}) rv[(tag, project)] = { HEALTH_ID_KEY: make_health_id(lookup, [eu.tag_value, eu.project_id]), "value": { "id": str(eu.id) if eu.id else None, "project": projects.get(eu.project_id), "hash": eu.hash, "tagValue": eu.tag_value, "identifier": eu.ident, "username": eu.username, "email": eu.email, "ipAddress": eu.ip_address, "dateCreated": eu.date_added, "label": eu.get_label(), "name": eu.get_display_name(), "geo": geo_by_addr(eu.ip_address), }, } return rv
def serialize_eventusers(organization, item_list, user, lookup): if not item_list: return {} # We have no reliable way to map the tag value format # back into real EventUser rows. EventUser is only unique # per-project, and this is an organization aggregate. # This means a single value maps to multiple rows. filters = reduce(or_, [ Q(hash=EventUser.hash_from_tag(tag), project_id=project) for tag, project in item_list ]) eu_by_key = {(eu.tag_value, eu.project_id): eu for eu in EventUser.objects.filter(filters)} projects = serialize_projects(organization, {i[1] for i in item_list}, user) rv = {} for tag, project in item_list: eu = eu_by_key.get((tag, project)) if eu is None: attr, value = tag.split(':', 1) eu = EventUser(project_id=project, **{EventUser.attr_from_keyword(attr): value}) rv[(tag, project)] = { HEALTH_ID_KEY: make_health_id(lookup, [eu.tag_value, eu.project_id]), 'value': { 'id': six.text_type(eu.id) if eu.id else None, 'project': projects.get(eu.project_id), 'hash': eu.hash, 'tagValue': eu.tag_value, 'identifier': eu.ident, 'username': eu.username, 'email': eu.email, 'ipAddress': eu.ip_address, 'dateCreated': eu.date_added, 'label': eu.get_label(), 'name': eu.get_display_name(), 'geo': geo_by_addr(eu.ip_address), }, } return rv
def serialize_eventusers(organization, item_list, user, lookup): if not item_list: return {} # We have no reliable way to map the tag value format # back into real EventUser rows. EventUser is only unique # per-project, and this is an organization aggregate. # This means a single value maps to multiple rows. filters = reduce(or_, [ Q(hash=EventUser.hash_from_tag(tag), project_id=project) for tag, project in item_list ]) eu_by_key = { (eu.tag_value, eu.project_id): eu for eu in EventUser.objects.filter(filters) } projects = serialize_projects(organization, {i[1] for i in item_list}, user) rv = {} for tag, project in item_list: eu = eu_by_key.get((tag, project)) if eu is None: attr, value = tag.split(':', 1) eu = EventUser(project_id=project, **{EventUser.attr_from_keyword(attr): value}) rv[(tag, project)] = { HEALTH_ID_KEY: make_health_id(lookup, [eu.tag_value, eu.project_id]), 'value': { 'id': six.text_type(eu.id) if eu.id else None, 'project': projects.get(eu.project_id), 'hash': eu.hash, 'tagValue': eu.tag_value, 'identifier': eu.ident, 'username': eu.username, 'email': eu.email, 'ipAddress': eu.ip_address, 'dateCreated': eu.date_added, 'label': eu.get_label(), 'name': eu.get_display_name(), 'geo': geo_by_addr(eu.ip_address), }, } return rv
def get(self, request, project): """ List a Project's Users `````````````````````` Return a list of users seen within this project. :pparam string organization_slug: the slug of the organization. :pparam string project_slug: the slug of the project. :pparam string key: the tag key to look up. :auth: required :qparam string query: Limit results to users matching the given query. Prefixes should be used to suggest the field to match on: ``id``, ``email``, ``username``, ``ip``. For example, ``query=email:[email protected]`` """ queryset = EventUser.objects.filter( project_id=project.id, ) if request.GET.get('query'): pieces = request.GET['query'].strip().split(':', 1) if len(pieces) != 2: return Response([]) try: queryset = queryset.filter( **{u'{}__icontains'.format(EventUser.attr_from_keyword(pieces[0])): pieces[1]} ) except KeyError: return Response([]) return self.paginate( request=request, queryset=queryset, order_by='-date_added', paginator_cls=DateTimePaginator, on_results=lambda x: serialize(x, request.user), )