Skip to content

Commit dbdf3e5

Browse files
committed
Add the ability to mark broadcasts as seen
1 parent 0e9cf25 commit dbdf3e5

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

src/sentry/api/endpoints/broadcast_index.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
from __future__ import absolute_import
22

3+
from django.db import IntegrityError, transaction
4+
from rest_framework import serializers
35
from rest_framework.permissions import IsAuthenticated
46
from rest_framework.response import Response
57

68
from sentry.api.base import Endpoint
79
from sentry.api.serializers import serialize
8-
from sentry.models import Broadcast
10+
from sentry.models import Broadcast, BroadcastSeen
11+
12+
13+
class BroadcastSerializer(serializers.Serializer):
14+
hasSeen = serializers.BooleanField()
915

1016

1117
class BroadcastIndexEndpoint(Endpoint):
@@ -17,3 +23,28 @@ def get(self, request):
1723
))
1824

1925
return Response(serialize(broadcasts, request.user))
26+
27+
def put(self, request):
28+
serializer = BroadcastSerializer(data=request.DATA, partial=True)
29+
if not serializer.is_valid():
30+
return Response(serializer.errors, status=400)
31+
32+
result = serializer.object
33+
34+
# limit scope of query
35+
queryset = Broadcast.objects.filter(
36+
is_active=True,
37+
)[:100]
38+
39+
if result.get('hasSeen'):
40+
for broadcast in queryset:
41+
try:
42+
with transaction.atomic():
43+
BroadcastSeen.objects.create(
44+
broadcast=broadcast,
45+
user=request.user,
46+
)
47+
except IntegrityError:
48+
pass
49+
50+
return Response(result)

tests/sentry/api/endpoints/test_broadcast_index.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
from django.core.urlresolvers import reverse
44

5-
from sentry.models import Broadcast
5+
from sentry.models import Broadcast, BroadcastSeen
66
from sentry.testutils import APITestCase
77

88

9-
class BroadcastIndexTest(APITestCase):
9+
class BroadcastListTest(APITestCase):
1010
def test_simple(self):
1111
broadcast1 = Broadcast.objects.create(message='bar', is_active=True)
1212
Broadcast.objects.create(message='foo', is_active=False)
@@ -17,3 +17,26 @@ def test_simple(self):
1717
assert response.status_code == 200
1818
assert len(response.data) == 1
1919
assert response.data[0]['id'] == str(broadcast1.id)
20+
21+
22+
class BroadcastUpdateTest(APITestCase):
23+
def test_simple(self):
24+
broadcast1 = Broadcast.objects.create(message='bar', is_active=True)
25+
broadcast2 = Broadcast.objects.create(message='foo', is_active=False)
26+
27+
self.login_as(user=self.user)
28+
url = reverse('sentry-api-0-broadcast-index')
29+
response = self.client.put(url, {
30+
'hasSeen': '1'
31+
})
32+
assert response.status_code == 200
33+
assert response.data['hasSeen'] == True
34+
35+
assert BroadcastSeen.objects.filter(
36+
user=self.user,
37+
broadcast=broadcast1,
38+
).exists()
39+
assert not BroadcastSeen.objects.filter(
40+
user=self.user,
41+
broadcast=broadcast2,
42+
).exists()

0 commit comments

Comments
 (0)