def put(self, request, group, note_id):
        if not request.user.is_authenticated():
            raise PermissionDenied(
                detail="Key doesn't have permission to edit Note")

        try:
            note = Activity.objects.get(
                group=group,
                type=Activity.NOTE,
                user=request.user,
                id=note_id,
            )
        except Activity.DoesNotExist:
            raise ResourceDoesNotExist

        serializer = NoteSerializer(data=request.data)

        if serializer.is_valid():
            # Would be nice to have a last_modified timestamp we could bump here
            note.data = dict(serializer.validated_data)
            note.save()

            return Response(serialize(note, request.user), status=200)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#2
0
    def post(self, request, group):
        serializer = NoteSerializer(data=request.DATA)
        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.object)

        if Activity.objects.filter(group=group,
                                   type=Activity.NOTE,
                                   user=request.user,
                                   data=data,
                                   datetime__gte=timezone.now() -
                                   timedelta(hours=1)).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                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=data,
        )

        activity.send_notification()

        return Response(serialize(activity, request.user), status=201)
示例#3
0
    def put(self, request, group, note_id):
        if not request.user.is_authenticated():
            raise PermissionDenied(
                detail="Key doesn't have permission to edit Note")

        try:
            note = Activity.objects.get(group=group,
                                        type=Activity.NOTE,
                                        user=request.user,
                                        id=note_id)
        except Activity.DoesNotExist:
            raise ResourceDoesNotExist

        serializer = NoteSerializer(data=request.data)

        if serializer.is_valid():
            payload = serializer.validated_data
            # TODO adding mentions to a note doesn't do subscriptions
            # or notifications. Should it?
            # Remove mentions as they shouldn't go into the database
            payload.pop("mentions", [])

            # Would be nice to have a last_modified timestamp we could bump here
            note.data.update(dict(payload))
            note.save()

            if note.data.get("external_id"):
                self.update_external_comment(request, group, note)
            return Response(serialize(note, request.user), status=200)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#4
0
    def post(self, request, group):
        serializer = NoteSerializer(data=request.DATA)
        if not serializer.is_valid():
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.object)

        if Activity.objects.filter(
            group=group,
            type=Activity.NOTE,
            user=request.user,
            data=data,
            datetime__gte=timezone.now() - timedelta(hours=1)
        ).exists():
            return Response('{"detail": "You have already posted that comment."}',
                            status=status.HTTP_400_BAD_REQUEST)

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment,
        )

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

        activity.send_notification()

        return Response(serialize(activity, request.user), status=201)
示例#5
0
    def put(self, request, group, note_id):
        if not request.user.is_authenticated():
            raise PermissionDenied(detail="Key doesn't have permission to edit Note")

        try:
            note = Activity.objects.get(
                group=group,
                type=Activity.NOTE,
                user=request.user,
                id=note_id,
            )
        except Activity.DoesNotExist:
            raise ResourceDoesNotExist

        serializer = NoteSerializer(data=request.DATA)

        if serializer.is_valid():
            # Would be nice to have a last_modified timestamp we could bump here
            note.data.update(dict(serializer.object))
            note.save()
            if note.data.get('external_id'):
                self.update_external_comment(request, group, note)
            return Response(serialize(note, request.user), status=200)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#6
0
    def post(self, request, group):
        serializer = NoteSerializer(
            data=request.data,
            context={
                'organization_id': group.organization.id,
                'projects': [group.project],
            },
        )

        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.validated_data)

        mentions = data.pop('mentions', [])

        if Activity.objects.filter(group=group,
                                   type=Activity.NOTE,
                                   user=request.user,
                                   data=data,
                                   datetime__gte=timezone.now() -
                                   timedelta(hours=1)).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST)

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment,
        )

        mentioned_users = extract_user_ids_from_mentions(
            group.organization.id, mentions)
        GroupSubscription.objects.bulk_subscribe(
            group=group,
            user_ids=mentioned_users['users'],
            reason=GroupSubscriptionReason.mentioned,
        )

        GroupSubscription.objects.bulk_subscribe(
            group=group,
            user_ids=mentioned_users['team_users'],
            reason=GroupSubscriptionReason.team_mentioned,
        )

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

        activity.send_notification()

        self.create_external_comment(request, group, activity)
        return Response(serialize(activity, request.user), status=201)
示例#7
0
    def post(self, request: Request, group) -> Response:
        serializer = NoteSerializer(
            data=request.data,
            context={
                "organization": group.organization,
                "organization_id": group.organization.id,
                "projects": [group.project],
            },
        )

        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.validated_data)

        mentions = data.pop("mentions", [])

        if Activity.objects.filter(
                group=group,
                type=Activity.NOTE,
                user=request.user,
                data=data,
                datetime__gte=timezone.now() - timedelta(hours=1),
        ).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST,
            )

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment)

        mentioned_users = extract_user_ids_from_mentions(
            group.organization.id, mentions)
        GroupSubscription.objects.bulk_subscribe(
            group=group,
            user_ids=mentioned_users["users"],
            reason=GroupSubscriptionReason.mentioned)

        GroupSubscription.objects.bulk_subscribe(
            group=group,
            user_ids=mentioned_users["team_users"],
            reason=GroupSubscriptionReason.team_mentioned,
        )

        activity = Activity.objects.create_group_activity(
            group,
            ActivityType.NOTE,
            user=extract_lazy_object(request.user),
            data=data)

        self.create_external_comment(request, group, activity)
        return Response(serialize(activity, request.user), status=201)
示例#8
0
    def post(self, request, group):
        serializer = NoteSerializer(data=request.DATA,
                                    context={'group': group})

        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.object)
        mentions = data.pop('mentions', [])

        if Activity.objects.filter(group=group,
                                   type=Activity.NOTE,
                                   user=request.user,
                                   data=data,
                                   datetime__gte=timezone.now() -
                                   timedelta(hours=1)).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST)

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment,
        )

        if mentions:
            users = User.objects.filter(id__in=mentions)
            for user in users:
                GroupSubscription.objects.subscribe(
                    group=group,
                    user=user,
                    reason=GroupSubscriptionReason.mentioned,
                )

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

        activity.send_notification()

        return Response(serialize(activity, request.user), status=201)
示例#9
0
    def put(self, request: Request, group, note_id) -> Response:
        if not request.user.is_authenticated:
            raise PermissionDenied(detail="Key doesn't have permission to edit Note")

        try:
            note = Activity.objects.get(
                group=group, type=Activity.NOTE, user=request.user, id=note_id
            )
        except Activity.DoesNotExist:
            raise ResourceDoesNotExist

        serializer = NoteSerializer(data=request.data, context={"organization": group.organization})

        if serializer.is_valid():
            payload = serializer.validated_data
            # TODO adding mentions to a note doesn't do subscriptions
            # or notifications. Should it?
            # Remove mentions as they shouldn't go into the database
            payload.pop("mentions", [])

            # Would be nice to have a last_modified timestamp we could bump here
            note.data.update(dict(payload))
            note.save()

            if note.data.get("external_id"):
                self.update_external_comment(request, group, note)

            webhook_data = {
                "comment_id": note.id,
                "timestamp": note.datetime,
                "comment": note.data.get("text"),
                "project_slug": note.project.slug,
            }

            comment_updated.send_robust(
                project=group.project,
                user=request.user,
                group=group,
                data=webhook_data,
                sender="put",
            )
            return Response(serialize(note, request.user), status=200)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
示例#10
0
    def post(self, request, group):
        serializer = NoteSerializer(data=request.DATA,
                                    context={'group': group})

        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.object)

        mentions = data.pop('mentions', [])

        if Activity.objects.filter(group=group,
                                   type=Activity.NOTE,
                                   user=request.user,
                                   data=data,
                                   datetime__gte=timezone.now() -
                                   timedelta(hours=1)).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST)

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment,
        )

        actors = Actor.resolve_many(mentions)
        actor_mentions = seperate_resolved_actors(actors)

        for user in actor_mentions.get('users'):
            GroupSubscription.objects.subscribe(
                group=group,
                user=user,
                reason=GroupSubscriptionReason.mentioned,
            )

        mentioned_teams = actor_mentions.get('teams')

        mentioned_team_users = list(
            User.objects.filter(
                sentry_orgmember_set__organization_id=group.project.
                organization_id,
                sentry_orgmember_set__organizationmemberteam__team__in=
                mentioned_teams,
                sentry_orgmember_set__organizationmemberteam__is_active=True,
                is_active=True,
            ).exclude(
                id__in={u.id
                        for u in actor_mentions.get('users')}).values_list(
                            'id', flat=True))

        GroupSubscription.objects.bulk_subscribe(
            group=group,
            user_ids=mentioned_team_users,
            reason=GroupSubscriptionReason.team_mentioned,
        )

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

        activity.send_notification()

        # sync Sentry comments to external issues
        if features.has('organizations:internal-catchall',
                        group.organization,
                        actor=request.user):
            external_issue_ids = GroupLink.objects.filter(
                project_id=group.project_id,
                group_id=group.id,
                linked_type=GroupLink.LinkedType.issue,
            ).values_list('linked_id', flat=True)

            for external_issue_id in external_issue_ids:
                post_comment.apply_async(kwargs={
                    'external_issue_id': external_issue_id,
                    'data': data,
                })
        return Response(serialize(activity, request.user), status=201)
示例#11
0
    def post(self, request, group):
        serializer = NoteSerializer(data=request.DATA, context={'group': group})

        if not serializer.is_valid():
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.object)

        mentions = data.pop('mentions', [])

        if Activity.objects.filter(
            group=group,
            type=Activity.NOTE,
            user=request.user,
            data=data,
            datetime__gte=timezone.now() - timedelta(hours=1)
        ).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST
            )

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment,
        )

        actors = Actor.resolve_many(mentions)
        actor_mentions = seperate_resolved_actors(actors)

        for user in actor_mentions.get('users'):
            GroupSubscription.objects.subscribe(
                group=group,
                user=user,
                reason=GroupSubscriptionReason.mentioned,
            )

        mentioned_teams = actor_mentions.get('teams')

        mentioned_team_users = list(
            User.objects.filter(
                sentry_orgmember_set__organization_id=group.project.organization_id,
                sentry_orgmember_set__organizationmemberteam__team__in=mentioned_teams,
                sentry_orgmember_set__organizationmemberteam__is_active=True,
                is_active=True,
            ).exclude(id__in={u.id for u in actor_mentions.get('users')})
            .values_list('id', flat=True)
        )

        GroupSubscription.objects.bulk_subscribe(
            group=group,
            user_ids=mentioned_team_users,
            reason=GroupSubscriptionReason.team_mentioned,
        )

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

        activity.send_notification()
        return Response(serialize(activity, request.user), status=201)
示例#12
0
    def post(self, request, work_batch_id):
        serializer = NoteSerializer(data=request.data,
                                    context={'work_batch': work_batch_id})

        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.validated_data)

        mentions = data.pop('mentions', [])

        if Activity.objects.filter(
                work_batch_id=work_batch_id,
                type=Activity.NOTE,
                user=request.user,
                data=data,  # TODO: Hash instead?
                datetime__gte=timezone.now() - timedelta(hours=1)).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST)

        actors = Actor.resolve_many(mentions)
        actor_mentions = seperate_resolved_actors(actors)

        for user in actor_mentions.get('users'):
            GroupSubscription.objects.subscribe(
                group=1,
                user=user,
                reason=GroupSubscriptionReason.mentioned,
            )

        # mentioned_teams = actor_mentions.get('teams')

        # mentioned_team_users = list(
        #     User.objects.filter(
        #         sentry_orgmember_set__organization_id=1,
        #         sentry_orgmember_set__organizationmemberteam__team__in=mentioned_teams,
        #         sentry_orgmember_set__organizationmemberteam__is_active=True,
        #         is_active=True,
        #     ).exclude(id__in={u.id for u in actor_mentions.get('users')})
        #     .values_list('id', flat=True)
        # )

        # TODO!
        # GroupSubscription.objects.bulk_subscribe(
        #     group=1,
        #     user_ids=mentioned_team_users,
        #     reason=GroupSubscriptionReason.team_mentioned,
        # )

        # TODO: Org id!
        activity = Activity.objects.create(
            work_batch_id=work_batch_id,
            type=Activity.NOTE,
            user=extract_lazy_object(request.user),
            data=data,
            project_id=1,  # TODO: should not be required
        )

        activity.send_notification()

        return Response(serialize(activity, request.user), status=201)
示例#13
0
    def post(self, request, group):
        serializer = NoteSerializer(data=request.DATA,
                                    context={'group': group})

        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        data = dict(serializer.object)

        mentions = data.pop('mentions', [])

        if Activity.objects.filter(group=group,
                                   type=Activity.NOTE,
                                   user=request.user,
                                   data=data,
                                   datetime__gte=timezone.now() -
                                   timedelta(hours=1)).exists():
            return Response(
                '{"detail": "You have already posted that comment."}',
                status=status.HTTP_400_BAD_REQUEST)

        GroupSubscription.objects.subscribe(
            group=group,
            user=request.user,
            reason=GroupSubscriptionReason.comment,
        )

        actors = Actor.resolve_many(mentions)
        actor_mentions = seperate_resolved_actors(actors)

        for user in actor_mentions.get('users'):
            GroupSubscription.objects.subscribe(
                group=group,
                user=user,
                reason=GroupSubscriptionReason.mentioned,
            )

        mentioned_teams = actor_mentions.get('teams')

        mentioned_team_users = User.objects.filter(
            sentry_orgmember_set__organization_id=group.project.
            organization_id,
            sentry_orgmember_set__organizationmemberteam__team__in=
            mentioned_teams,
            sentry_orgmember_set__organizationmemberteam__is_active=True,
            is_active=True,
        ).exclude(id__in={u.id
                          for u in actor_mentions.get('users')})

        for user in mentioned_team_users:
            GroupSubscription.objects.subscribe(
                group=group,
                user=user,
                reason=GroupSubscriptionReason.team_mentioned,
            )

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

        activity.send_notification()
        return Response(serialize(activity, request.user), status=201)