Skip to content

Commit

Permalink
Fix: TodayPoll 관련 뷰 새로 수정.
Browse files Browse the repository at this point in the history
  • Loading branch information
joy-river committed Aug 14, 2024
1 parent db09fcc commit 7687cbc
Show file tree
Hide file tree
Showing 3 changed files with 224 additions and 120 deletions.
71 changes: 22 additions & 49 deletions KUA/today_poll/serializers.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,39 @@
from rest_framework import serializers
from .models import TodayPoll, Briefing
from student.models import Student
from django.shortcuts import get_object_or_404
from django.utils import timezone

class TodayPollSerializer(serializers.ModelSerializer):
student_id = serializers.IntegerField(write_only=True, required=False)

class Meta:
model = TodayPoll
fields = ['id', 'student', 'course', 'check_attention', 'check_test',
'check_homework', 'created_at', 'answered_at', 'student_id']
read_only_fields = ['created_at', 'answered_at']

def validate_student_id(self, value):
if not Student.objects.filter(id=value).exists():
raise serializers.ValidationError("Student not found.")
return value

def create(self, validated_data):
student_id = validated_data.pop('student_id', None)
if student_id:
validated_data['student'] = get_object_or_404(Student, id=student_id)
else:
validated_data['student'] = self.context['request'].user.student if self.context['request'].user.is_authenticated else get_object_or_404(
Student, user_id=1) # 기본 학생 사용자
return super().create(validated_data)

def update(self, instance, validated_data):
student_id = validated_data.pop('student_id', None)
if student_id:
validated_data['student'] = get_object_or_404(Student, id=student_id)
return super().update(instance, validated_data)
fields = '__all__'


class TodayPollAnswerSerializer(serializers.ModelSerializer):
student_id = serializers.IntegerField(write_only=True, required=False)
# class TodayPollAnswerSerializer(serializers.ModelSerializer):
# student_id = serializers.IntegerField(write_only=True, required=False)

class Meta:
model = TodayPoll
fields = ['id', 'student', 'course', 'check_attention',
'check_test', 'check_homework', 'answered_at', 'student_id']
read_only_fields = ['answered_at']
# class Meta:
# model = TodayPoll
# fields = ['id', 'student', 'course', 'check_attention',
# 'check_test', 'check_homework', 'answered_at', 'student_id']
# read_only_fields = ['answered_at']

def validate_student_id(self, value):
if not Student.objects.filter(id=value).exists():
raise serializers.ValidationError("Student not found.")
return value
# def validate_student_id(self, value):
# if not Student.objects.filter(id=value).exists():
# raise serializers.ValidationError("Student not found.")
# return value

def validate_expired(self, data):
if data.get('expired'):
raise serializers.ValidationError("Already Expired.")
return data
# def validate_expired(self, data):
# if data.get('expired'):
# raise serializers.ValidationError("Already Expired.")
# return data

def update(self, instance, validated_data):
student_id = validated_data.pop('student_id', None)
# def update(self, instance, validated_data):
# student_id = validated_data.pop('student_id', None)

if student_id:
validated_data['student'] = get_object_or_404(Student, id=student_id)
# if student_id:
# validated_data['student'] = get_object_or_404(Student, id=student_id)

instance.answered_at = timezone.now()
return super().update(instance, validated_data)
# instance.answered_at = timezone.now()
# return super().update(instance, validated_data)


class BriefingSerializer(serializers.ModelSerializer):
Expand Down
14 changes: 0 additions & 14 deletions KUA/today_poll/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,4 @@

urlpatterns = [
path('', include(router.urls)),
# 특정 게시판의 브리핑 목록
path('courses/<int:course_id>/briefings/',
views.CourseBriefingListView.as_view(), name='course-briefings'),
# 특정 사용자의 오늘의 설문 목록
path('student/<int:user_id>/todaypolls/', views.UserTodayPollListCreateView.as_view(),
name='user-todaypoll-list-create'),

# 특정 설문 디테일
path('todaypolls/<int:pk>/', views.TodayPollDetailView.as_view(),
name='todaypoll-detail'),

# 특정 설문 응답
path('todaypolls/<int:pk>/answer/', views.TodayPollAnswerView.as_view(),
name='todaypoll-answer'),
]
259 changes: 202 additions & 57 deletions KUA/today_poll/views.py
Original file line number Diff line number Diff line change
@@ -1,72 +1,217 @@
from rest_framework import viewsets, generics, permissions
from rest_framework import viewsets, status
from .models import TodayPoll, Briefing
from student.models import Student
from .serializers import TodayPollSerializer, BriefingSerializer, TodayPollAnswerSerializer
from .serializers import *
from rest_framework.response import Response
from rest_framework.views import APIView
from django.shortcuts import get_object_or_404

# 모든 오늘의 설문 전체 뷰
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from rest_framework.views import APIView


# 오늘의 설문 전체 뷰 (CRUD 포함)
class TodayPollViewSet(viewsets.ModelViewSet):
queryset = TodayPoll.objects.all()
serializer_class = TodayPollSerializer

# 특정 유저의 오늘의 설문 뷰


class UserTodayPollListCreateView(generics.ListCreateAPIView):
serializer_class = TodayPollSerializer

def get_queryset(self):
student_id = self.kwargs.get('student_id')
if student_id:
student_id = get_object_or_404(Student, id=student_id)
return TodayPoll.objects.filter(id=student_id)
return TodayPoll.objects.none()

# 오늘의 설문 상세 뷰


class TodayPollDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = TodayPoll.objects.all()
serializer_class = TodayPollSerializer

def get_queryset(self):
id = self.kwargs.get('id')
if id:
id = get_object_or_404(TodayPoll, id=id)
return TodayPoll.objects.filter(id=id)
return TodayPoll.objects.none()

# 오늘의 설문 응답을 위한 뷰


class TodayPollAnswerView(APIView):

def post(self, request, pk):
today_poll = get_object_or_404(TodayPoll, pk=pk)
serializer = TodayPollAnswerSerializer(
today_poll, data=request.data, partial=True, context={'request': request})
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=400)

# 브리핑 전체 뷰


queryset = TodayPoll.objects.all()

# 필터링 조건 추가
student_id = self.request.query_params.get('student_id', None)
course_fk = self.request.query_params.get('course_fk', None)
expired = self.request.query_params.get('expired', None)
created_at_start = self.request.query_params.get('created_at_start', None)
created_at_end = self.request.query_params.get('created_at_end', None)

if student_id is not None:
queryset = queryset.filter(student_id=student_id)

if course_fk is not None:
queryset = queryset.filter(course_fk_id=course_fk)

if expired is not None:
expired = expired.capitalize()
queryset = queryset.filter(expired=expired)

if created_at_start and created_at_end:
queryset = queryset.filter(created_at__range=[created_at_start, created_at_end])
elif created_at_start:
queryset = queryset.filter(created_at__gte=created_at_start)
elif created_at_end:
queryset = queryset.filter(created_at__lte=created_at_end)

return queryset

@swagger_auto_schema(
operation_summary="오늘의 설문 목록 조회 - 완료",
operation_description="모든 설문 목록을 조회하거나, 쿼리 파라미터에 따라 필터링된 설문 목록을 조회합니다.",
manual_parameters=[
openapi.Parameter('student_id', openapi.IN_QUERY,
description="학생 ID로 필터링", type=openapi.TYPE_INTEGER),
openapi.Parameter('course_fk', openapi.IN_QUERY,
description="강의 ID로 필터링", type=openapi.TYPE_INTEGER),
openapi.Parameter('expired', openapi.IN_QUERY,
description="만료 여부로 필터링 (true 또는 false)", type=openapi.TYPE_BOOLEAN),
openapi.Parameter('created_at_start', openapi.IN_QUERY,
description="시작 날짜 및 시간으로 필터링 (YYYY-MM-DDTHH:MM 형식)", type=openapi.TYPE_STRING),
openapi.Parameter('created_at_end', openapi.IN_QUERY,
description="종료 날짜 및 시간으로 필터링 (YYYY-MM-DDTHH:MM 형식)", type=openapi.TYPE_STRING),
],
responses={200: TodayPollSerializer(many=True)}
)
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = TodayPollSerializer(queryset, many=True)
return Response(serializer.data)

@swagger_auto_schema(
operation_summary="오늘의 설문 생성 기능 - 완료",
operation_description="새로운 설문을 생성합니다.",
request_body=TodayPollSerializer,
responses={201: TodayPollSerializer}
)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
return Response(serializer.data, status=status.HTTP_201_CREATED)

@swagger_auto_schema(
operation_summary="설문 조회 기능 - 완료",
operation_description="설문 인덱스로 특정 설문의 세부 내용을 조회합니다.",
responses={200: TodayPollSerializer}
)
def retrieve(self, request, *args, **kwargs):
return super().retrieve(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="설문 수정 기능 - 완료",
operation_description="기존 설문 정보를 수정합니다.",
request_body=TodayPollSerializer,
responses={200: TodayPollSerializer}
)
def update(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="설문 부분 수정 - 완료",
operation_description="설문 정보의 일부를 수정합니다.",
request_body=TodayPollSerializer,
responses={200: TodayPollSerializer}
)
def partial_update(self, request, *args, **kwargs):
return super().partial_update(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="설문 삭제 - 완료",
operation_description="ID로 특정 설문을 삭제합니다.",
responses={204: 'No Content'}
)
def destroy(self, request, *args, **kwargs):
return super().destroy(request, *args, **kwargs)


# 오늘의 설문 응답을 위한 뷰 - 리뉴얼 대기
# class TodayPollAnswerView(APIView):

# @swagger_auto_schema(
# operation_summary="설문 응답 기능 - 완료",
# operation_description="특정 설문에 대한 응답을 등록합니다.",
# request_body=TodayPollAnswerSerializer,
# responses={200: TodayPollAnswerSerializer}
# )
# def post(self, request, pk):
# today_poll = get_object_or_404(TodayPoll, pk=pk)
# serializer = TodayPollAnswerSerializer(
# today_poll, data=request.data, partial=True, context={'request': request})
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


# 브리핑 전체 뷰 (CRUD 포함)
class BriefingViewSet(viewsets.ModelViewSet):
queryset = Briefing.objects.all()
serializer_class = BriefingSerializer

# 특정 강의의 브리핑 뷰


class CourseBriefingListView(generics.ListAPIView):
serializer_class = BriefingSerializer

def get_queryset(self):
course_id = self.kwargs['course_id']
return Briefing.objects.filter(course_id=course_id)
queryset = Briefing.objects.all()

# 필터링 조건 추가
course_fk = self.request.query_params.get('course_fk', None)
created_at_start = self.request.query_params.get('created_at_start', None)
created_at_end = self.request.query_params.get('created_at_end', None)

if course_fk is not None:
queryset = queryset.filter(course_fk_id=course_fk)

if created_at_start is not None and created_at_end is not None:
queryset = queryset.filter(created_at__date__range=[created_at_start, created_at_end])
elif created_at_start is not None:
queryset = queryset.filter(created_at__date__gte=created_at_start)
elif created_at_end is not None:
queryset = queryset.filter(created_at__date__lte=created_at_end)

return queryset

@swagger_auto_schema(
operation_summary="브리핑 목록 조회 - 완료",
operation_description="모든 브리핑 목록을 조회하거나, 쿼리 파라미터에 따라 필터링된 브리핑 목록을 조회합니다.",
manual_parameters=[
openapi.Parameter('course_fk', openapi.IN_QUERY,
description="강의 ID로 필터링", type=openapi.TYPE_INTEGER),
openapi.Parameter('created_at_start', openapi.IN_QUERY,
description="시작 날짜로 필터링 (YYYY-MM-DD 형식)", type=openapi.TYPE_STRING),
openapi.Parameter('created_at_end', openapi.IN_QUERY,
description="종료 날짜로 필터링 (YYYY-MM-DD 형식)", type=openapi.TYPE_STRING),
],
responses={200: BriefingSerializer(many=True)}
)
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = BriefingSerializer(queryset, many=True)
return Response(serializer.data)

@swagger_auto_schema(
operation_summary="브리핑 생성 기능 - 완료",
operation_description="새로운 브리핑을 생성합니다.",
request_body=BriefingSerializer,
responses={201: BriefingSerializer}
)
def create(self, request, *args, **kwargs):
return super().create(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="브리핑 조회 - 완료",
operation_description="ID로 특정 브리핑을 조회합니다.",
responses={200: BriefingSerializer}
)
def retrieve(self, request, *args, **kwargs):
return super().retrieve(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="브리핑 수정 기능 - 완료",
operation_description="기존 브리핑 정보를 수정합니다.",
request_body=BriefingSerializer,
responses={200: BriefingSerializer}
)
def update(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="브리핑 부분 수정 - 완료",
operation_description="브리핑 정보의 일부를 수정합니다.",
request_body=BriefingSerializer,
responses={200: BriefingSerializer}
)
def partial_update(self, request, *args, **kwargs):
return super().partial_update(request, *args, **kwargs)

@swagger_auto_schema(
operation_summary="브리핑 삭제 - 완료",
operation_description="ID로 특정 브리핑을 삭제합니다.",
responses={204: 'No Content'}
)
def destroy(self, request, *args, **kwargs):
return super().destroy(request, *args, **kwargs)

0 comments on commit 7687cbc

Please sign in to comment.