Skip to content

Commit 68fb9af

Browse files
committed
feat: add support for name on api token endpoints
1 parent 37a4884 commit 68fb9af

3 files changed

Lines changed: 40 additions & 0 deletions

File tree

src/sentry/api/endpoints/api_tokens.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.utils.decorators import method_decorator
44
from django.views.decorators.cache import never_cache
55
from rest_framework import serializers
6+
from rest_framework.fields import CharField
67
from rest_framework.permissions import IsAuthenticated
78
from rest_framework.request import Request
89
from rest_framework.response import Response
@@ -21,6 +22,7 @@
2122

2223

2324
class ApiTokenSerializer(serializers.Serializer):
25+
name = CharField(max_length=255, allow_blank=True, required=False)
2426
scopes = MultipleChoiceField(required=True, choices=settings.SENTRY_SCOPES)
2527

2628

@@ -62,6 +64,7 @@ def post(self, request: Request) -> Response:
6264

6365
token = ApiToken.objects.create(
6466
user_id=request.user.id,
67+
name=result.get("name", None),
6568
scope_list=result["scopes"],
6669
refresh_token=None,
6770
expires_at=None,

src/sentry/api/serializers/models/apitoken.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ def serialize(self, obj, attrs, user, **kwargs):
2121
data = {
2222
"id": str(obj.id),
2323
"scopes": obj.get_scopes(),
24+
"name": obj.name,
2425
"application": attrs["application"],
2526
"expiresAt": obj.expires_at,
2627
"dateCreated": obj.date_added,

tests/sentry/api/endpoints/test_api_tokens.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,42 @@ def test_invalid_choice(self):
8181
assert response.status_code == 400
8282
assert not ApiToken.objects.filter(user=self.user).exists()
8383

84+
def test_with_name(self):
85+
self.login_as(self.user)
86+
url = reverse("sentry-api-0-api-tokens")
87+
response = self.client.post(
88+
url,
89+
data={"name": "testname1", "scopes": ["event:read"]},
90+
)
91+
assert response.status_code == 201
92+
93+
token = ApiToken.objects.get(user=self.user)
94+
assert token.name == "testname1"
95+
96+
response = self.client.get(url)
97+
assert response.status_code == 200, response.content
98+
assert len(response.data) == 1
99+
100+
assert response.data[0]["name"] == "testname1"
101+
102+
def test_without_name(self):
103+
self.login_as(self.user)
104+
url = reverse("sentry-api-0-api-tokens")
105+
response = self.client.post(
106+
url,
107+
data={"scopes": ["event:read"]},
108+
)
109+
assert response.status_code == 201
110+
111+
token = ApiToken.objects.get(user=self.user)
112+
assert token.name is None
113+
114+
response = self.client.get(url)
115+
assert response.status_code == 200, response.content
116+
assert len(response.data) == 1
117+
118+
assert response.data[0]["name"] is None
119+
84120

85121
@control_silo_test
86122
class ApiTokensDeleteTest(APITestCase):

0 commit comments

Comments
 (0)