Skip to content

Commit

Permalink
API Membre, ajout d'un accès rapide pour savoir si un utilisateur exi…
Browse files Browse the repository at this point in the history
…ste (#4384)
  • Loading branch information
AmarOk1412 authored and artragis committed Jun 26, 2017
1 parent 491018d commit c708844
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 2 deletions.
73 changes: 73 additions & 0 deletions zds/member/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,79 @@ def create_multiple_users(self, number_of_users=REST_PAGE_SIZE):
ProfileFactory()


class MemberExistsAPITest(APITestCase):
def setUp(self):
self.client = APIClient()
caches[extensions_api_settings.DEFAULT_USE_CACHE].clear()
self.bot = Group(name=settings.ZDS_APP['member']['bot_group'])
self.bot.save()

def test_list_of_users_empty(self):
"""
Gets empty list of users in the database.
"""
response = self.client.get(reverse('api:member:exists'))
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertEqual(response.data.get('count'), 0)
self.assertEqual(response.data.get('results'), [])
self.assertIsNone(response.data.get('next'))
self.assertIsNone(response.data.get('previous'))

def test_search_in_list_of_users(self):
"""
Gets list of users corresponding to the value given by the search parameter.
"""
self.create_multiple_users()
StaffProfileFactory()

# get an username
response = self.client.get(reverse('api:member:list') + '?search=firmstaff')
self.assertEqual(response.status_code, status.HTTP_200_OK)
username = response.data['results'][0]['username']

response = self.client.get(reverse('api:member:exists') + '?search=' + username)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertTrue(response.data.get('count') > 0)

def test_search_without_results_in_list_of_users(self):
"""
Gets a list empty when there are users but which doesn't match with the search
parameter value.
"""
self.create_multiple_users()

response = self.client.get(reverse('api:member:exists') + '?search=zozor')
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertEqual(response.data.get('count'), 0)
self.assertIsNone(response.data.get('next'))
self.assertIsNone(response.data.get('previous'))

def test_member_list_url_with_put_method(self):
"""
Gets an error when the user try to make a request with a method not allowed.
"""
response = self.client.put(reverse('api:member:exists'))
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)

def test_member_list_url_with_post_method(self):
"""
Gets an error when the user try to make a request with a method not allowed.
"""
response = self.client.post(reverse('api:member:exists'))
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)

def test_member_list_url_with_delete_method(self):
"""
Gets an error when the user try to make a request with a method not allowed.
"""
response = self.client.delete(reverse('api:member:exists'))
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)

def create_multiple_users(self, number_of_users=REST_PAGE_SIZE):
for user in xrange(0, number_of_users):
ProfileFactory()


class MemberMyDetailAPITest(APITestCase):
def setUp(self):
caches[extensions_api_settings.DEFAULT_USE_CACHE].clear()
Expand Down
3 changes: 2 additions & 1 deletion zds/member/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
from django.conf.urls import url

from zds.member.api.views import MemberListAPI, MemberDetailAPI, MemberDetailReadingOnly, MemberDetailBan, \
MemberMyDetailAPI
MemberMyDetailAPI, MemberExistsAPI

urlpatterns = [
url(r'^$', MemberListAPI.as_view(), name='list'),
url(r'^exists/?$', MemberExistsAPI.as_view(), name='exists'),
url(r'^mon-profil/?$', MemberMyDetailAPI.as_view(), name='profile'),
url(r'^(?P<user__id>[0-9]+)/?$', MemberDetailAPI.as_view(), name='detail'),
url(r'^(?P<user__id>[0-9]+)/lecture-seule/?$', MemberDetailReadingOnly.as_view(), name='read-only'),
Expand Down
52 changes: 51 additions & 1 deletion zds/member/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import filters
from rest_framework import status
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateAPIView, RetrieveAPIView, get_object_or_404
from rest_framework.generics import ListAPIView, ListCreateAPIView, RetrieveUpdateAPIView, \
RetrieveAPIView, get_object_or_404
from rest_framework.permissions import IsAuthenticatedOrReadOnly, AllowAny, IsAuthenticated
from rest_framework.response import Response
from rest_framework_extensions.cache.decorators import cache_response
Expand Down Expand Up @@ -125,6 +126,55 @@ def get_permissions(self):
return [permission() for permission in permission_classes]


class MemberExistsAPI(ListAPIView):
"""
Profile resource to get if a username exists.
"""

filter_backends = (filters.SearchFilter,)
search_fields = ('=user__username',)
list_key_func = PagingSearchListKeyConstructor()
serializer_class = ProfileDetailSerializer

def get_queryset(self):
return Profile.objects.contactable_members()

@etag(list_key_func)
@cache_response(key_func=list_key_func)
def get(self, request, *args, **kwargs):
"""
Get if a username exists.
---
parameters:
- name: page
description: Restricts output to the given page number.
required: false
paramType: query
- name: page_size
description: Sets the number of profiles per page.
required: false
paramType: query
- name: search
description: Filters by username.
required: false
paramType: query
responseMessages:
- code: 404
user doesn't exists.
"""
r = self.list(request, *args, **kwargs)
if r.data['count'] is 0:
return Response(r.data, status=status.HTTP_404_NOT_FOUND)
return r

def get_permissions(self):
permission_classes = [AllowAny, ]
if self.request.method == 'GET':
permission_classes.append(DRYPermissions)
return [permission() for permission in permission_classes]


class MemberMyDetailAPI(RetrieveAPIView):
"""
Profile resource for member details.
Expand Down

0 comments on commit c708844

Please sign in to comment.