示例#1
0
    def get(self, request, group_id):
        """
        List an aggregate's available samples

        Return a list of sampled events bound to an aggregate.

            {method} {path}

        """
        group = Group.objects.get(
            id=group_id,
        )

        assert_perm(group, request.user, request.auth)

        events = Event.objects.filter(
            group=group
        )

        return self.paginate(
            request=request,
            queryset=events,
            # TODO(dcramer): we want to sort by datetime
            order_by='-id',
            on_results=lambda x: serialize(x, request.user),
        )
示例#2
0
    def get(self, request, project_id):
        """
        Retrieve event counts for a project

        **Draft:** This endpoint may change in the future without notice.

        Return a set of points representing a normalized timestamp and the
        number of events seen in the period.

            {method} {path}?since=1421092384.822244&until=1434052399.443363

        Query ranges are limited to Sentry's configured time-series resolutions.

        Parameters:

        - since: a timestamp to set the start of the query
        - until: a timestamp to set the end of the query
        - resolution: an explicit resolution to search for (i.e. 10s)

        **Note:** resolution should not be used unless you're familiar with Sentry
        internals as it's restricted to pre-defined values.
        """
        project = Project.objects.get_from_cache(id=project_id, )

        assert_perm(project, request.user, request.auth)

        data = tsdb.get_range(model=tsdb.models.project,
                              keys=[project.id],
                              **self._parse_args(request))[project.id]

        return Response(data)
示例#3
0
    def delete(self, request, project_id, key):
        """
        Remove all occurances of the given tag key.

            {method} {path}

        """
        project = Project.objects.get(
            id=project_id,
        )

        tagkey = TagKey.objects.get(
            project=project,
            key=key,
        )

        assert_perm(tagkey, request.user, request.auth)

        updated = TagKey.objects.filter(
            id=tagkey.id,
            status=TagKeyStatus.VISIBLE,
        ).update(status=TagKeyStatus.PENDING_DELETION)
        if updated:
            delete_tag_key.delay(object_id=tagkey.id)

            AuditLogEntry.objects.create(
                organization=project.organization,
                actor=request.user,
                ip_address=request.META['REMOTE_ADDR'],
                target_object=tagkey.id,
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
示例#4
0
    def get(self, request, organization_slug):
        organization = Organization.objects.get_from_cache(
            slug=organization_slug,
        )

        assert_perm(organization, request.user, request.auth)

        team_list = Team.objects.get_for_user(
            organization=organization,
            user=request.user,
        )

        project_list = []
        for team in team_list:
            project_list.extend(Project.objects.get_for_user(
                team=team,
                user=request.user,
            ))
        project_list.sort(key=lambda x: x.name)

        team_map = dict(
            (t.id, c) for (t, c) in zip(team_list, serialize(team_list, request.user)),
        )

        context = []
        for project, pdata in zip(project_list, serialize(project_list, request.user)):
            pdata['team'] = team_map[project.team_id]
            context.append(pdata)

        return Response(context)
示例#5
0
    def get(self, request, project_id):
        """
        List a project's releases

        Retrieve a list of releases for a given project.

            {method} {path}

        """
        project = Project.objects.get(
            id=project_id,
        )

        assert_perm(project, request.user, request.auth)

        queryset = Release.objects.filter(
            project=project,
        ).order_by('-date_added')

        return self.paginate(
            request=request,
            queryset=queryset,
            # TODO(dcramer): we want to sort by date_added
            order_by='-id',
            on_results=lambda x: serialize(x, request.user),
        )
    def delete(self, request, project_id, key):
        """
        Remove all occurances of the given tag key.

            {method} {path}

        """
        project = Project.objects.get(id=project_id, )

        tagkey = TagKey.objects.get(
            project=project,
            key=key,
        )

        assert_perm(tagkey, request.user, request.auth)

        if tagkey.status == TagKeyStatus.VISIBLE:
            tagkey.update(status=TagKeyStatus.PENDING_DELETION)
            delete_tag_key.delay(object_id=tagkey.id)

            AuditLogEntry.objects.create(
                organization=project.organization,
                actor=request.user,
                ip_address=request.META['REMOTE_ADDR'],
                target_object=tagkey.id,
                event=AuditLogEntryEvent.TAGKEY_REMOVE,
                data=tagkey.get_audit_log_data(),
            )

        return Response(status=204)
示例#7
0
    def get(self, request, team_id):
        team = Team.objects.get(id=team_id)

        assert_perm(team, request.user, request.auth)

        projects = Project.objects.get_for_user(
            team=team,
            user=request.user,
        )

        if not projects:
            return Response([])

        data = tsdb.get_range(
            model=tsdb.models.project,
            keys=[p.id for p in projects],
            **self._parse_args(request)
        ).values()

        summarized = []
        for n in range(len(data[0])):
            total = sum(d[n][1] for d in data)
            summarized.append((data[0][n][0], total))

        return Response(summarized)
示例#8
0
    def post(self, request, group_id):
        group = Group.objects.get(
            id=group_id,
        )

        assert_perm(group, request.user, request.auth)

        form = NewNoteForm(request.DATA)
        if not form.is_valid():
            return Response('{"error": "form"}', status=status.HTTP_400_BAD_REQUEST)

        if Activity.objects.filter(
            group=group,
            type=Activity.NOTE,
            user=request.user,
            data=form.cleaned_data,
            datetime__gte=timezone.now() - timedelta(hours=1)
        ).exists():
            return Response('{"error": "duplicate"}', status=status.HTTP_400_BAD_REQUEST)

        activity = Activity.objects.create(
            group=group,
            project=group.project,
            type=Activity.NOTE,
            user=extract_lazy_object(request.user),
            data=form.cleaned_data,
        )

        # TODO: move this into the queue
        activity.send_notification()

        return Response(serialize(activity, request.user), status=201)
示例#9
0
    def put(self, request, project_id):
        project = Project.objects.get(id=project_id)

        assert_perm(project, request.user, request.auth, access=MEMBER_ADMIN)

        serializer = ProjectSerializer(project, data=request.DATA, partial=True)

        if serializer.is_valid():
            project = serializer.save()

            options = request.DATA.get('options', {})
            if 'sentry:origins' in options:
                project.update_option('sentry:origins', options['sentry:origins'].split('\n'))
            if 'sentry:resolve_age' in options:
                project.update_option('sentry:resolve_age', int(options['sentry:resolve_age']))

            AuditLogEntry.objects.create(
                organization=project.organization,
                actor=request.user,
                ip_address=request.META['REMOTE_ADDR'],
                target_object=project.id,
                event=AuditLogEntryEvent.PROJECT_EDIT,
                data=project.get_audit_log_data(),
            )

            data = serialize(project, request.user)
            data['options'] = {
                'sentry:origins': '\n'.join(project.get_option('sentry:origins', None) or []),
                'sentry:resolve_age': int(project.get_option('sentry:resolve_age', 0)),
            }
            return Response(data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#10
0
    def put(self, request, team_id):
        team = Team.objects.get(id=team_id)

        assert_perm(team, request.user, request.auth, access=OrganizationMemberType.ADMIN)

        # TODO(dcramer): this permission logic is duplicated from the
        # transformer
        if request.user.is_superuser or team.owner_id == request.user.id:
            serializer = TeamAdminSerializer(team, data=request.DATA, partial=True)
        else:
            serializer = TeamSerializer(team, data=request.DATA, partial=True)

        if serializer.is_valid():
            team = serializer.save()

            AuditLogEntry.objects.create(
                organization=team.organization,
                actor=request.user,
                ip_address=request.META['REMOTE_ADDR'],
                target_object=team.id,
                event=AuditLogEntryEvent.TEAM_EDIT,
                data=team.get_audit_log_data(),
            )

            return Response(serialize(team, request.user))

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#11
0
    def put(self, request, project_id):
        project = Project.objects.get(id=project_id)

        assert_perm(project, request.user, request.auth, access=MEMBER_ADMIN)

        serializer = ProjectSerializer(project,
                                       data=request.DATA,
                                       partial=True)

        if serializer.is_valid():
            project = serializer.save()

            options = request.DATA.get('options', {})
            if 'sentry:origins' in options:
                project.update_option('sentry:origins',
                                      options['sentry:origins'].split('\n'))
            if 'sentry:resolve_age' in options:
                project.update_option('sentry:resolve_age',
                                      int(options['sentry:resolve_age']))

            data = serialize(project, request.user)
            data['options'] = {
                'sentry:origins':
                '\n'.join(project.get_option('sentry:origins', None) or []),
                'sentry:resolve_age':
                int(project.get_option('sentry:resolve_age', 0)),
            }
            return Response(data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#12
0
    def post(self, request, group_id):
        group = Group.objects.get(
            id=group_id,
        )

        assert_perm(group, request.user, request.auth)

        now = timezone.now()

        group.resolved_at = now

        happened = Group.objects.filter(
            id=group.id,
        ).exclude(status=STATUS_RESOLVED).update(
            status=STATUS_RESOLVED,
            resolved_at=now,
        )

        if happened:
            create_or_update(
                Activity,
                project=group.project,
                group=group,
                type=Activity.SET_RESOLVED,
                user=request.user,
            )

        return Response()
示例#13
0
    def get(self, request, team_id):
        """
        Return a list of the trending groups for a given team.

        The resulting query will find groups which have been seen since the
        cutoff date, and then sort those by score, returning the highest scoring
        groups first.
        """
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth)

        minutes = int(request.REQUEST.get("minutes", 15))
        limit = min(100, int(request.REQUEST.get("limit", 10)))

        project_list = Project.objects.get_for_user(user=request.user, team=team)

        project_dict = dict((p.id, p) for p in project_list)

        cutoff = timedelta(minutes=minutes)
        cutoff_dt = timezone.now() - cutoff

        group_list = list(
            Group.objects.filter(
                project__in=project_dict.keys(), status=GroupStatus.UNRESOLVED, last_seen__gte=cutoff_dt
            )
            .extra(select={"sort_value": "score"})
            .order_by("-score")[:limit]
        )

        for group in group_list:
            group._project_cache = project_dict.get(group.project_id)

        return Response(serialize(group_list, request.user))
示例#14
0
    def post(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        form = NewNoteForm(request.DATA)
        if not form.is_valid():
            return Response('{"error": "form"}',
                            status=status.HTTP_400_BAD_REQUEST)

        if Activity.objects.filter(group=group,
                                   type=Activity.NOTE,
                                   user=request.user,
                                   data=form.cleaned_data,
                                   datetime__gte=timezone.now() -
                                   timedelta(hours=1)).exists():
            return Response('{"error": "duplicate"}',
                            status=status.HTTP_400_BAD_REQUEST)

        activity = Activity.objects.create(
            group=group,
            project=group.project,
            type=Activity.NOTE,
            user=extract_lazy_object(request.user),
            data=form.cleaned_data,
        )

        # TODO: move this into the queue
        activity.send_notification()

        return Response(serialize(activity, request.user), status=201)
示例#15
0
    def get(self, request, event_id):
        event = Event.objects.get(id=event_id)

        assert_perm(event, request.user, request.auth)

        Event.objects.bind_nodes([event], 'data')

        base_qs = Event.objects.filter(
            group=event.group_id, ).exclude(id=event.id)
        try:
            next_event = base_qs.filter(
                datetime__gte=event.datetime).order_by('datetime')[0:1].get()
        except Event.DoesNotExist:
            next_event = None

        try:
            prev_event = base_qs.filter(
                datetime__lte=event.datetime).order_by('-datetime')[0:1].get()
        except Event.DoesNotExist:
            prev_event = None

        data = serialize(event, request.user)

        if next_event:
            data['nextEventID'] = str(next_event.id)
        else:
            data['nextEventID'] = None
        if prev_event:
            data['previousEventID'] = str(prev_event.id)
        else:
            data['previousEventID'] = None

        data['entries'] = self._get_entries(request, event)

        return Response(data)
示例#16
0
    def delete(self, request, team_id):
        team = Team.objects.get(id=team_id)

        assert_perm(team, request.user, request.auth, access=OrganizationMemberType.ADMIN)

        if team.project_set.filter(id=settings.SENTRY_PROJECT).exists():
            return Response('{"error": "Cannot remove team containing default project."}',
                            status=status.HTTP_403_FORBIDDEN)

        team.update(status=TeamStatus.PENDING_DELETION)

        # we delay the task for 5 minutes so we can implement an undo
        kwargs = {'object_id': team.id}
        delete_team.apply_async(kwargs=kwargs, countdown=60 * 5)

        AuditLogEntry.objects.create(
            organization=team.organization,
            actor=request.user,
            ip_address=request.META['REMOTE_ADDR'],
            target_object=team.id,
            event=AuditLogEntryEvent.TEAM_REMOVE,
            data=team.get_audit_log_data(),
        )

        return Response(status=204)
示例#17
0
    def get(self, request, group_id):
        """
        Retrieve an aggregate

        Return details on an individual aggregate.

            {method} {path}

        """
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        data = serialize(group, request.user)

        # TODO: these probably should be another endpoint
        activity = self._get_activity(request, group, num=7)
        seen_by = self._get_seen_by(request, group)

        data.update({
            'activity': serialize(activity, request.user),
            'seenBy': serialize(seen_by, request.user),
        })

        return Response(data)
示例#18
0
    def get(self, request, project_id):
        """
        Retrieve event counts for a project

        **Draft:** This endpoint may change in the future without notice.

        Return a set of points representing a normalized timestamp and the
        number of events seen in the period.

            {method} {path}?since=1421092384.822244&until=1434052399.443363

        Query ranges are limited to Sentry's configured time-series resolutions.

        Parameters:

        - since: a timestamp to set the start of the query
        - until: a timestamp to set the end of the query
        - resolution: an explicit resolution to search for (i.e. 10s)

        **Note:** resolution should not be used unless you're familiar with Sentry
        internals as it's restricted to pre-defined values.
        """
        project = Project.objects.get_from_cache(id=project_id)

        assert_perm(project, request.user, request.auth)

        data = tsdb.get_range(model=tsdb.models.project, keys=[project.id], **self._parse_args(request))[project.id]

        return Response(data)
示例#19
0
    def delete(self, request, project_id):
        """
        Permanently remove the given groups.

        Only queries by 'id' are accepted.

            {method} {path}?id=1&id=2&id=3

        If any ids are out of scope this operation will succeed without any data
        mutation
        """
        project = Project.objects.get_from_cache(
            id=project_id,
        )

        assert_perm(project, request.user, request.auth)

        group_ids = request.GET.getlist('id')
        if group_ids:
            group_list = Group.objects.filter(project=project, id__in=group_ids)
            # filter down group ids to only valid matches
            group_ids = [g.id for g in group_list]
        else:
            # missing any kind of filter
            return Response(status=400)

        if not group_ids:
            return Response(status=204)

        # TODO(dcramer): set status to pending deletion
        for group in group_list:
            delete_group.delay(object_id=group.id)

        return Response(status=204)
示例#20
0
    def get(self, request, group_id):
        """
        Retrieve an aggregate

        Return details on an individual aggregate.

            {method} {path}

        """
        group = Group.objects.get(
            id=group_id,
        )

        assert_perm(group, request.user, request.auth)

        data = serialize(group, request.user)

        # TODO: these probably should be another endpoint
        activity = self._get_activity(request, group, num=7)
        seen_by = self._get_seen_by(request, group)

        data.update({
            'activity': serialize(activity, request.user),
            'seenBy': serialize(seen_by, request.user),
        })

        return Response(data)
示例#21
0
    def post(self, request, group_id):
        group = Group.objects.get(id=group_id)

        assert_perm(group, request.user, request.auth)

        serializer = GroupAssigneeSerializer(data=request.DATA)

        if serializer.is_valid():
            user = serializer.object.user
            now = timezone.now()

            assignee, created = GroupAssignee.objects.get_or_create(
                group=group, defaults={"project": group.project, "user": user, "date_added": now}
            )

            if not created:
                affected = (
                    GroupAssignee.objects.filter(group=group).exclude(user=user).update(user=user, date_added=now)
                )
            else:
                affected = True

            if affected:
                create_or_update(
                    Activity, project=group.project, group=group, type=Activity.ASSIGNED, user=request.user
                )

            return Response()

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#22
0
    def delete(self, request, team_id):
        team = Team.objects.get(id=team_id)

        assert_perm(team,
                    request.user,
                    request.auth,
                    access=OrganizationMemberType.ADMIN)

        if team.project_set.filter(id=settings.SENTRY_PROJECT).exists():
            return Response(
                '{"error": "Cannot remove team containing default project."}',
                status=status.HTTP_403_FORBIDDEN)

        team.update(status=TeamStatus.PENDING_DELETION)

        # we delay the task for 5 minutes so we can implement an undo
        kwargs = {'object_id': team.id}
        delete_team.apply_async(kwargs=kwargs, countdown=60 * 5)

        AuditLogEntry.objects.create(
            organization=team.organization,
            actor=request.user,
            ip_address=request.META['REMOTE_ADDR'],
            target_object=team.id,
            event=AuditLogEntryEvent.TEAM_REMOVE,
            data=team.get_audit_log_data(),
        )

        return Response(status=204)
示例#23
0
    def get(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth)

        results = list(Project.objects.get_for_user(request.user, team=team))

        return Response(serialize(results, request.user))
示例#24
0
    def get(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth)

        data = sorted(AccessGroup.objects.filter(team=team), key=lambda x: x.name)

        return Response(serialize(data, request.user))
示例#25
0
    def post(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        group.delete()

        return Response()
示例#26
0
    def get(self, request, group_id):
        group = Group.objects.get(id=group_id)

        assert_perm(group, request.user, request.auth)

        event = group.get_latest_event()

        return HttpResponseRedirect(reverse("sentry-api-0-event-details", kwargs={"event_id": event.id}))
    def get(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth)

        data = sorted(AccessGroup.objects.filter(team=team), key=lambda x: x.name)

        return Response(serialize(data, request.user))
示例#28
0
    def get(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        data = tsdb.get_range(model=tsdb.models.group,
                              keys=[group.id],
                              **self._parse_args(request))[group.id]

        return Response(data)
示例#29
0
    def post(self, request, group_id):
        group = Group.objects.get(
            id=group_id,
        )

        assert_perm(group, request.user, request.auth)

        group.delete()

        return Response()
示例#30
0
    def get(self, request, group_id):
        group = Group.objects.get(id=group_id)

        assert_perm(group, request.user)

        event = group.get_latest_event()

        return HttpResponseRedirect(reverse('sentry-api-0-event-details', kwargs={
            'event_id': event.id,
        }))
示例#31
0
    def get(self, request, project_id):
        project = Project.objects.get(id=project_id, )

        assert_perm(project, request.user, request.auth)

        data = tsdb.get_range(model=tsdb.models.project,
                              keys=[project.id],
                              **self._parse_args(request))[project.id]

        return Response(data)
示例#32
0
    def get(self, request, user_id):
        if user_id == 'me':
            user_id = request.user.id

        user = User.objects.get(id=user_id)

        assert_perm(user, request.user, request.auth)

        data = serialize(user, request.user)

        return Response(data)
    def delete(self, request, organization_slug, member_id):
        try:
            organization = Organization.objects.get_from_cache(
                slug=organization_slug,
            )
        except Organization.DoesNotExist:
            return Response(status=404)

        assert_perm(organization, request.user, request.auth)

        if request.user.is_superuser:
            authorizing_access = OrganizationMemberType.OWNER
        else:
            authorizing_access = OrganizationMember.objects.get(
                organization=organization,
                user=request.user,
            ).type

        try:
            om = OrganizationMember.objects.filter(
                organization=organization,
                id=member_id,
                type__gte=authorizing_access,
            ).select_related('user').get()
        except OrganizationMember.DoesNotExist:
            return Response(status=404)

        if self._is_only_owner(om):
            return Response(status=403)

        audit_data = om.get_audit_log_data()

        if om.user_id == organization.owner_id:
            # TODO(dcramer): while we still maintain an owner field on
            # organization we need to ensure it transfers
            organization.owner = OrganizationMember.objects.filter(
                type=OrganizationMemberType.OWNER,
            ).exclude(id=om.id)[0].user
            organization.save()

        om.delete()

        AuditLogEntry.objects.create(
            organization=organization,
            actor=request.user,
            ip_address=request.META['REMOTE_ADDR'],
            target_object=om.id,
            target_user=om.user,
            event=AuditLogEntryEvent.MEMBER_REMOVE,
            data=audit_data,
        )

        return Response(status=204)
示例#34
0
    def get(self, request, project_id):
        project = Project.objects.get(id=project_id)

        assert_perm(project, request.user, request.auth)

        data = serialize(project, request.user)
        data['options'] = {
            'sentry:origins': '\n'.join(project.get_option('sentry:origins', None) or []),
            'sentry:resolve_age': int(project.get_option('sentry:resolve_age', 0)),
        }

        return Response(data)
示例#35
0
    def get(self, request, organization_slug):
        organization = Organization.objects.get_from_cache(
            slug=organization_slug,
        )

        assert_perm(organization, request.user, request.auth)

        group = request.GET.get('group')
        if not group:
            keys = [organization.id]
        elif group == 'project':
            team_list = Team.objects.get_for_user(
                organization=organization,
                user=request.user,
            )

            project_list = []
            for team in team_list:
                project_list.extend(Project.objects.get_for_user(
                    team=team,
                    user=request.user,
                ))
            keys = [p.id for p in project_list]
        else:
            raise ValueError('Invalid group: %s' % group)

        if not keys:
            return Response([])

        stat = request.GET.get('stat', 'received')
        if stat == 'received':
            if group == 'project':
                stat_model = tsdb.models.project_total_received
            else:
                stat_model = tsdb.models.organization_total_received
        elif stat == 'rejected':
            if group == 'project':
                stat_model = tsdb.models.project_total_rejected
            else:
                stat_model = tsdb.models.organization_total_rejected
        else:
            raise ValueError('Invalid stat: %s' % stat)

        data = tsdb.get_range(
            model=stat_model,
            keys=keys,
            **self._parse_args(request)
        )

        if not group:
            data = data[organization.id]

        return Response(data)
示例#36
0
    def put(self, request, project_id):
        """
        Update a project

        Update various attributes and configurable settings for the given project.

            {method} {path}
            {{
              "name": "My Project Name",
              "options": {{
                "sentry:origins": "*"
              }}
            }}

        """
        project = Project.objects.get(id=project_id)

        assert_perm(project, request.user, request.auth, access=MEMBER_ADMIN)

        serializer = ProjectSerializer(project,
                                       data=request.DATA,
                                       partial=True)

        if serializer.is_valid():
            project = serializer.save()

            options = request.DATA.get('options', {})
            if 'sentry:origins' in options:
                project.update_option('sentry:origins',
                                      options['sentry:origins'].split('\n'))
            if 'sentry:resolve_age' in options:
                project.update_option('sentry:resolve_age',
                                      int(options['sentry:resolve_age']))

            AuditLogEntry.objects.create(
                organization=project.organization,
                actor=request.user,
                ip_address=request.META['REMOTE_ADDR'],
                target_object=project.id,
                event=AuditLogEntryEvent.PROJECT_EDIT,
                data=project.get_audit_log_data(),
            )

            data = serialize(project, request.user)
            data['options'] = {
                'sentry:origins':
                '\n'.join(project.get_option('sentry:origins', None) or []),
                'sentry:resolve_age':
                int(project.get_option('sentry:resolve_age', 0)),
            }
            return Response(data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#37
0
    def get(self, request, group_id):
        group = Group.objects.get(id=group_id)

        assert_perm(group, request.user, request.auth)

        event = group.get_latest_event()

        return HttpResponseRedirect(
            reverse('sentry-api-0-event-details',
                    kwargs={
                        'event_id': event.id,
                    }))
示例#38
0
    def get(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        events = Event.objects.filter(group=group)

        return self.paginate(
            request=request,
            queryset=events,
            order_by='-datetime',
            on_results=lambda x: serialize(x, request.user),
        )
示例#39
0
    def get(self, request, organization_slug):
        organization = Organization.objects.get_from_cache(
            slug=organization_slug, )

        assert_perm(organization, request.user, request.auth)

        group = request.GET.get('group')
        if not group:
            keys = [organization.id]
        elif group == 'project':
            team_list = Team.objects.get_for_user(
                organization=organization,
                user=request.user,
            )

            project_list = []
            for team in team_list:
                project_list.extend(
                    Project.objects.get_for_user(
                        team=team,
                        user=request.user,
                    ))
            keys = [p.id for p in project_list]
        else:
            raise ValueError('Invalid group: %s' % group)

        if not keys:
            return Response([])

        stat = request.GET.get('stat', 'received')
        if stat == 'received':
            if group == 'project':
                stat_model = tsdb.models.project_total_received
            else:
                stat_model = tsdb.models.organization_total_received
        elif stat == 'rejected':
            if group == 'project':
                stat_model = tsdb.models.project_total_rejected
            else:
                stat_model = tsdb.models.organization_total_rejected
        else:
            raise ValueError('Invalid stat: %s' % stat)

        data = tsdb.get_range(model=stat_model,
                              keys=keys,
                              **self._parse_args(request))

        if not group:
            data = data[organization.id]

        return Response(data)
示例#40
0
    def put(self, request, project_id):
        """
        Update a project

        Update various attributes and configurable settings for the given project.

            {method} {path}
            {{
              "name": "My Project Name",
              "options": {{
                "sentry:origins": "*"
              }}
            }}

        """
        project = Project.objects.get(id=project_id)

        assert_perm(project, request.user, request.auth, access=MEMBER_ADMIN)

        serializer = ProjectSerializer(project, data=request.DATA, partial=True)

        if serializer.is_valid():
            project = serializer.save()

            options = request.DATA.get('options', {})
            if 'sentry:origins' in options:
                project.update_option('sentry:origins', options['sentry:origins'].split('\n'))
            if 'sentry:resolve_age' in options:
                project.update_option('sentry:resolve_age', int(options['sentry:resolve_age']))
            if 'sentry:scrub_data' in options:
                project.update_option('sentry:scrub_data', bool(options['sentry:scrub_data']))
            if 'sentry:sensitive_fields' in options:
                project.update_option('sentry:sensitive_fields', options['sentry:sensitive_fields'])

            AuditLogEntry.objects.create(
                organization=project.organization,
                actor=request.user,
                ip_address=request.META['REMOTE_ADDR'],
                target_object=project.id,
                event=AuditLogEntryEvent.PROJECT_EDIT,
                data=project.get_audit_log_data(),
            )

            data = serialize(project, request.user)
            data['options'] = {
                'sentry:origins': '\n'.join(project.get_option('sentry:origins', None) or []),
                'sentry:resolve_age': int(project.get_option('sentry:resolve_age', 0)),
            }
            return Response(data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#41
0
    def get(self, request, project_id):
        project = Project.objects.get(id=project_id)

        assert_perm(project, request.user, request.auth)

        data = serialize(project, request.user)
        data['options'] = {
            'sentry:origins':
            '\n'.join(project.get_option('sentry:origins', None) or []),
            'sentry:resolve_age':
            int(project.get_option('sentry:resolve_age', 0)),
        }

        return Response(data)
示例#42
0
    def get(self, request, project_id):
        project = Project.objects.get(id=project_id, )

        assert_perm(project, request.user, request.auth)

        queryset = Release.objects.filter(
            project=project, ).order_by('-date_added')

        return self.paginate(
            request=request,
            queryset=queryset,
            order_by='-date_added',
            on_results=lambda x: serialize(x, request.user),
        )
示例#43
0
    def get(self, request, project_id):
        project = Project.objects.get(
            id=project_id,
        )

        assert_perm(project, request.user)

        data = tsdb.get_range(
            model=tsdb.models.project,
            keys=[project.id],
            **self._parse_args(request)
        )[project.id]

        return Response(data)
示例#44
0
    def get(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth)

        member_list = serialize(
            list(team.member_set.select_related('user')),
            request.user)
        member_list.extend(serialize(
            list(team.pending_member_set.all()),
            request.user))
        member_list.sort(key=lambda x: x['email'])

        return Response(member_list)
示例#45
0
    def get(self, request, team_id):
        """
        Retrieve a team.

        Return details on an individual team.

            {method} {path}

        """
        team = Team.objects.get(id=team_id)

        assert_perm(team, request.user, request.auth)

        return Response(serialize(team, request.user))
示例#46
0
    def post(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth, access=MEMBER_ADMIN)

        serializer = AccessGroupSerializer(data=request.DATA)

        if serializer.is_valid():
            access_group = serializer.object
            access_group.team = team
            access_group.managed = False
            access_group.save()
            return Response(serialize(access_group, request.user), status=201)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#47
0
    def get(self, request, group_id):
        group = Group.objects.get(
            id=group_id,
        )

        assert_perm(group, request.user, request.auth)

        data = tsdb.get_range(
            model=tsdb.models.group,
            keys=[group.id],
            **self._parse_args(request)
        )[group.id]

        return Response(data)
示例#48
0
    def get(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user)

        member_list = serialize(
            list(team.member_set.select_related('user')),
            request.user)
        member_list.extend(serialize(
            list(team.pending_member_set.all()),
            request.user))
        member_list.sort(key=lambda x: x['email'])

        return Response(member_list)
示例#49
0
    def post(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        bookmark = GroupBookmark(
            project=group.project,
            group=group,
            user=request.user,
        )

        bookmark.save()

        return Response()
示例#50
0
    def get(self, request, release_id):
        """
        Retrieve an release

        Return details on an individual release.

            {method} {path}

        """
        release = Release.objects.get(id=release_id)

        assert_perm(release, request.user, request.auth)

        return Response(serialize(release, request.user))
    def post(self, request, team_id):
        team = Team.objects.get_from_cache(id=team_id)

        assert_perm(team, request.user, request.auth, access=MEMBER_ADMIN)

        serializer = AccessGroupSerializer(data=request.DATA)

        if serializer.is_valid():
            access_group = serializer.object
            access_group.team = team
            access_group.managed = False
            access_group.save()
            return Response(serialize(access_group, request.user), status=201)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#52
0
    def put(self, request, user_id):
        if user_id == 'me':
            user_id = request.user.id

        user = User.objects.get(id=user_id)

        assert_perm(user, request.user, request.auth)

        serializer = UserSerializer(user, data=request.DATA, partial=True)

        if serializer.is_valid():
            user = serializer.save()
            return Response(serialize(user, request.user))

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#53
0
    def get(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        notes = Activity.objects.filter(
            group=group,
            type=Activity.NOTE,
        ).select_related('user')

        return self.paginate(
            request=request,
            queryset=notes,
            order_by='-datetime',
            on_results=lambda x: serialize(x, request.user),
        )
示例#54
0
    def post(self, request, group_id):
        group = Group.objects.get(id=group_id, )

        assert_perm(group, request.user, request.auth)

        instance, created = create_or_update(GroupSeen,
                                             group=group,
                                             user=extract_lazy_object(
                                                 request.user),
                                             project=group.project,
                                             defaults={
                                                 'last_seen': timezone.now(),
                                             })
        if created:
            return Response(status=201)
        return Response(status=204)