Skip to content

Commit

Permalink
fix(User search API): Add additional fields to result and alter field…
Browse files Browse the repository at this point in the history
…s searched
  • Loading branch information
nokome committed Mar 23, 2020
1 parent c7ed7cd commit 8211723
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 14 deletions.
13 changes: 12 additions & 1 deletion director/users/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
from avatar.utils import get_primary_avatar
from rest_framework import serializers

from django.contrib.auth import get_user_model

User = get_user_model()


class UserSerializer(serializers.ModelSerializer):

avatar = serializers.SerializerMethodField(
help_text="Path to the user's primary avatar (`null` if the user has no avatar)."
)

def get_avatar(self, user):
avatar = get_primary_avatar(user)
return avatar.avatar_url(80) if avatar else None

class Meta:
model = User
fields = ('id', 'username')
fields = ("id", "username", "first_name", "last_name", "avatar")
4 changes: 2 additions & 2 deletions director/users/api/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.urls import path
from django.urls import re_path

from users.api.views import UserSearch

urlpatterns = [
path('search', UserSearch.as_view())
re_path(r"search/?", UserSearch.as_view())
]
39 changes: 28 additions & 11 deletions director/users/api/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from django.contrib.auth import get_user_model
from django.db.models import QuerySet
from django.db.models import QuerySet, Q
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import generics
from rest_framework.exceptions import ParseError

from users.api.serializers import UserSerializer

Expand All @@ -10,17 +13,31 @@


class UserSearch(generics.ListAPIView):
swagger_schema = None
permission_classes = ()
serializer_class = UserSerializer

def get_queryset(self) -> QuerySet:
if 'q' not in self.request.query_params:
raise ValueError('Missing query parameter q')

query = self.request.query_params['q']
@swagger_auto_schema(
manual_parameters=[
openapi.Parameter(
"q",
openapi.IN_QUERY,
description="String to search for within user usernames, first and last names and email addresses.",
type=openapi.TYPE_STRING,
required=True,
)
]
)
def get(self, *args, **kwargs):
return super().get(*args, **kwargs)

if len(query) < USER_QUERY_MIN_LENGTH:
raise ValueError('Query q is too short, minimum length is {}'.format(USER_QUERY_MIN_LENGTH))

return User.objects.filter(username__istartswith=query)
def get_queryset(self) -> QuerySet:
query = self.request.query_params.get("q")
if query is None:
raise ParseError("Parameter `q` is required")

return User.objects.filter(
Q(username__icontains=query)
| Q(first_name__icontains=query)
| Q(last_name__icontains=query)
| Q(email__icontains=query)
)

0 comments on commit 8211723

Please sign in to comment.