Skip to content

Commit db3b2e7

Browse files
feat(controller): Add users:list
1 parent fd291ca commit db3b2e7

5 files changed

Lines changed: 50 additions & 1 deletion

File tree

api/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
The **api** Django app presents a RESTful web API for interacting with the **deis** system.
33
"""
44

5-
__version__ = '1.2.0'
5+
__version__ = '1.3.0'

api/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,4 @@ def run_tests(self, test_labels, extra_tests=None, **kwargs):
5959
from .test_perm import * # noqa
6060
from .test_release import * # noqa
6161
from .test_scheduler import * # noqa
62+
from .test_users import * # noqa

api/tests/test_users.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
2+
from __future__ import unicode_literals
3+
4+
from django.contrib.auth.models import User
5+
from django.test import TestCase
6+
from rest_framework.authtoken.models import Token
7+
8+
9+
class TestUsers(TestCase):
10+
""" Tests users endpoint"""
11+
12+
fixtures = ['tests.json']
13+
14+
def test_super_user_can_list(self):
15+
url = '/v1/users/'
16+
17+
user = User.objects.get(username='autotest')
18+
token = Token.objects.get(user=user)
19+
20+
response = self.client.get(url,
21+
HTTP_AUTHORIZATION='token {}'.format(token))
22+
23+
self.assertEqual(response.status_code, 200)
24+
self.assertEqual(len(response.data['results']), 2)
25+
self.assertEqual(response.data['results'][0]['username'], 'autotest')
26+
self.assertEqual(response.data['results'][1]['username'], 'autotest2')
27+
28+
def test_non_super_user_cannot_list(self):
29+
url = '/v1/users/'
30+
31+
user = User.objects.get(username='autotest2')
32+
token = Token.objects.get(user=user)
33+
34+
response = self.client.get(url,
35+
HTTP_AUTHORIZATION='token {}'.format(token))
36+
self.assertEqual(response.status_code, 403)

api/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,6 @@
8686
views.CertificateViewSet.as_view({'get': 'retrieve', 'delete': 'destroy'})),
8787
url(r'^certs/?',
8888
views.CertificateViewSet.as_view({'get': 'list', 'post': 'create'})),
89+
# list users
90+
url(r'^users/', views.UserView.as_view({'get': 'list'})),
8991
)

api/views.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,3 +385,13 @@ def destroy(self, request, **kwargs):
385385
user.is_superuser = user.is_staff = False
386386
user.save(update_fields=['is_superuser', 'is_staff'])
387387
return Response(status=status.HTTP_204_NO_CONTENT)
388+
389+
390+
class UserView(BaseDeisViewSet):
391+
"""A Viewset for interacting with User objects."""
392+
model = User
393+
serializer_class = serializers.UserSerializer
394+
permission_classes = [permissions.IsAdmin]
395+
396+
def get_queryset(self):
397+
return self.model.objects.exclude(username='AnonymousUser')

0 commit comments

Comments
 (0)