From 680e9a1b8aa5bd4fbd70f5e02fb35256e5482374 Mon Sep 17 00:00:00 2001 From: westfarn Date: Sun, 6 Jul 2025 17:50:48 +0000 Subject: [PATCH] Update dta_service/core/views.py --- dta_service/core/views.py | 172 +++++++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 2 deletions(-) diff --git a/dta_service/core/views.py b/dta_service/core/views.py index 91ea44a..aaefd23 100644 --- a/dta_service/core/views.py +++ b/dta_service/core/views.py @@ -1,3 +1,171 @@ -from django.shortcuts import render +from rest_framework import generics, permissions, status, viewsets +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework_simplejwt.views import TokenObtainPairView +from rest_framework_simplejwt.tokens import RefreshToken +from django.contrib.auth import get_user_model +from django.shortcuts import get_object_or_404 +from .models import ( + PropertyOwner, Vendor, Property, VideoCategory, Video, + UserVideoProgress, Conversation, Message +) +from .serializers import ( + CustomTokenObtainPairSerializer, UserSerializer, UserRegisterSerializer, + PropertyOwnerSerializer, VendorSerializer, PropertySerializer, + VideoCategorySerializer, VideoSerializer, UserVideoProgressSerializer, + ConversationSerializer, MessageSerializer, PasswordResetRequestSerializer, + PasswordResetConfirmSerializer +) +from rest_framework.permissions import IsAuthenticated +from .permissions import IsOwnerOrReadOnly, IsPropertyOwner, IsVendor, IsParticipant +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import filters -# Create your views here. +User = get_user_model() + +class CustomTokenObtainPairView(TokenObtainPairView): + serializer_class = CustomTokenObtainPairSerializer + +class UserRegisterView(generics.CreateAPIView): + queryset = User.objects.all() + serializer_class = UserRegisterSerializer + permission_classes = [permissions.AllowAny] + +class LogoutView(APIView): + permission_classes = [IsAuthenticated] + + def post(self, request): + try: + refresh_token = request.data["refresh_token"] + token = RefreshToken(refresh_token) + token.blacklist() + return Response(status=status.HTTP_205_RESET_CONTENT) + except Exception as e: + return Response(status=status.HTTP_400_BAD_REQUEST) + +class PasswordResetRequestView(APIView): + permission_classes = [permissions.AllowAny] + + def post(self, request): + serializer = PasswordResetRequestSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response( + {"detail": "Password reset email has been sent."}, + status=status.HTTP_200_OK + ) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class PasswordResetConfirmView(APIView): + permission_classes = [permissions.AllowAny] + + def post(self, request): + serializer = PasswordResetConfirmSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response( + {"detail": "Password has been reset successfully."}, + status=status.HTTP_200_OK + ) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class PropertyOwnerViewSet(viewsets.ModelViewSet): + queryset = PropertyOwner.objects.all() + serializer_class = PropertyOwnerSerializer + permission_classes = [IsAuthenticated] + filter_backends = [DjangoFilterBackend, filters.SearchFilter] + search_fields = ['user__first_name', 'user__last_name', 'user__email'] + +class VendorViewSet(viewsets.ModelViewSet): + queryset = Vendor.objects.all() + serializer_class = VendorSerializer + permission_classes = [IsAuthenticated] + filter_backends = [DjangoFilterBackend, filters.SearchFilter] + search_fields = ['business_name', 'user__first_name', 'user__last_name', 'user__email'] + filterset_fields = ['business_type'] + +class PropertyViewSet(viewsets.ModelViewSet): + serializer_class = PropertySerializer + permission_classes = [IsAuthenticated, IsOwnerOrReadOnly] + filter_backends = [DjangoFilterBackend, filters.SearchFilter] + search_fields = ['address', 'city', 'state', 'zip_code'] + filterset_fields = ['owner', 'state', 'city'] + + def get_queryset(self): + user = self.request.user + if user.user_type == 'property_owner': + return Property.objects.filter(owner__user=user) + return Property.objects.all() + + def perform_create(self, serializer): + if self.request.user.user_type == 'property_owner': + owner = PropertyOwner.objects.get(user=self.request.user) + serializer.save(owner=owner) + else: + serializer.save() + +class VideoCategoryViewSet(viewsets.ModelViewSet): + queryset = VideoCategory.objects.all() + serializer_class = VideoCategorySerializer + permission_classes = [IsAuthenticated] + +class VideoViewSet(viewsets.ModelViewSet): + queryset = Video.objects.all() + serializer_class = VideoSerializer + permission_classes = [IsAuthenticated] + filter_backends = [DjangoFilterBackend, filters.SearchFilter] + search_fields = ['title', 'description'] + filterset_fields = ['category'] + +class UserVideoProgressViewSet(viewsets.ModelViewSet): + serializer_class = UserVideoProgressSerializer + permission_classes = [IsAuthenticated] + + def get_queryset(self): + return UserVideoProgress.objects.filter(user=self.request.user) + + def perform_create(self, serializer): + serializer.save(user=self.request.user) + +class ConversationViewSet(viewsets.ModelViewSet): + serializer_class = ConversationSerializer + permission_classes = [IsAuthenticated, IsParticipant] + + def get_queryset(self): + user = self.request.user + if user.user_type == 'property_owner': + owner = PropertyOwner.objects.get(user=user) + return Conversation.objects.filter(property_owner=owner) + elif user.user_type == 'vendor': + vendor = Vendor.objects.get(user=user) + return Conversation.objects.filter(vendor=vendor) + return Conversation.objects.none() + + def perform_create(self, serializer): + if self.request.user.user_type == 'property_owner': + owner = PropertyOwner.objects.get(user=self.request.user) + serializer.save(property_owner=owner) + elif self.request.user.user_type == 'vendor': + vendor = Vendor.objects.get(user=self.request.user) + serializer.save(vendor=vendor) + +class MessageViewSet(viewsets.ModelViewSet): + serializer_class = MessageSerializer + permission_classes = [IsAuthenticated, IsParticipant] + + def get_queryset(self): + conversation_id = self.kwargs.get('conversation_id') + conversation = get_object_or_404(Conversation, id=conversation_id) + self.check_object_permissions(self.request, conversation) + return Message.objects.filter(conversation=conversation).order_by('timestamp') + + def perform_create(self, serializer): + conversation_id = self.kwargs.get('conversation_id') + conversation = get_object_or_404(Conversation, id=conversation_id) + self.check_object_permissions(self.request, conversation) + serializer.save(conversation=conversation, sender=self.request.user) + + def get_serializer_context(self): + context = super().get_serializer_context() + context['conversation_id'] = self.kwargs.get('conversation_id') + return context