join-api/user_app/views.py

46 lines
No EOL
1.7 KiB
Python

from rest_framework import viewsets
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
from .caching import get_cached_user_by_id
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from django.core.cache import cache
class UserViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]
queryset = User.objects.filter(is_active=True, is_superuser=False)
serializer_class = UserSerializer
def retrieve(self, request, pk=None):
user = get_cached_user_by_id(pk)
if not user:
try:
user = User.objects.get(pk=pk)
except User.DoesNotExist:
return Response({'error': 'User not found.'}, status=status.HTTP_404_NOT_FOUND)
serializer = self.get_serializer(user)
return Response(serializer.data)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
try:
user = serializer.save()
cache.delete(f"user_{user.id}")
return Response(
{"id": user.id, **serializer.data},
status=status.HTTP_201_CREATED
)
except Exception as e:
return Response({'error': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def destroy(self, request, *args, **kwargs):
user = self.get_object()
user.delete()
cache.delete(f"user_{user.id}")
return Response({'message': 'User deleted successfully.'}, status=status.HTTP_200_OK)