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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)