text: from rest_framework.response import Response
  from rest_framework.views import APIView
  from rest_framework import status
  from rest_framework import viewsets
  from rest_framework.authentication import TokenAuthentication
  from rest_framework import filters
  
  from profiles_api import serializers
  from profiles_api import models
  from profiles_api import permissions
  
  class HelloApiView(APIView):
      """ Test API View """
      serializer_class = serializers.HelloSerializer
  
      # get is used to retrieve a list of objects
      def get(self, request, format=None):
          """ Returns a list of APIView features """
          an_apiview = [
              'Uses HTTP methods as function (get, post, patch, put, delete)',
              'Is similar to a traditional Django View',
              'Gives you the most control over you application logic',
              'Is mapped manually to URLs',
          ]
  
          return Response({'message': 'Hello!', 'an_apiview': an_apiview})
  
      def post(self, request):
          """ Create a hello message with our name """
          serializer = self.serializer_class(data=request.data)
  
          if serializer.is_valid():
              name = serializer.validated_data.get('name')
              message = f'Hello {name}'
              return Response({'message': message})
          else:
              return Response(
                  serializer.errors,
                  status=status.HTTP_400_BAD_REQUEST
              )
  
      def put(self, request, pk=None):  # pk is primary key
          """ Handle updating an object. PUT replace an object completely """
          return Response({'method': 'PUT'})
  
      def patch(self, request, pk=None):
          """ Handle a partial update of an object. PATCH partly
          update an object (or updated fields that were provided
          in the request) and not replace it """
          return Response({'method': 'PATCH'})
  
      def delete(self, request, pk=None):
          """ Delete an object """
          return Response({'method': 'DELETE'})
  
  
  class HelloViewSet(viewsets.ViewSet):
      """ Test API ViewSet """
  
      serializer_class = serializers.HelloSerializer
  
      def list(self, request):
          """ Return a Hello message """
  
          a_viewset = [
             'Uses actions (list, create, retrieve, update, partial_update)',
             'Automatically maps to URLs using Routers',
             'Provides more functionality with less code'
          ]
  
          return Response({'message': 'Hello', 'a_viewset': a_viewset})
  
      def create(self, request):
          """ Create a new hello message """
          serializer = self.serializer_class(data=request.data)
  
          if serializer.is_valid():
              name = serializer.validated_data.get('name')
              message = f'Hello {name}'
              return Response({'message': message})
          else:
              return Response(
                  serializer.errors,
                  status=status.HTTP_400_BAD_REQUEST
              )
  
      def retrieve(self, request, pk=None):
          """ Handle getting an object by its ID """
          return Response({'http_method': 'GET'})
  
      def update(self, request, pk=None):
          """ Handle updating an object """
          return Response({'http_method': 'PUT'})
  
      def partial_update(self, request, pk=None):
          """ Handle updating part of an object """
          return Response({'http_method': 'PATCH'})
  
      def destroy(self, request, pk=None):
          """ Handle removing an object """
          return Response({'http_method': 'DELETE'})
  
  
  class UserProfileViewSet(viewsets.ModelViewSet):
      """ Handle creating and updating profiles """
      serializer_class = serializers.UserProfileSerializer
      queryset = models.UserProfile.objects.all()
      authentication_classes = (TokenAuthentication,)
      permission_classes = (permissions.UpdateOwnProfile,)
      filter_backends = (filters.SearchFilter,)
      search_fields = ('name', 'email',)
  
  
  
  
  