diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml new file mode 100644 index 0000000..d3a222c --- /dev/null +++ b/.github/workflows/django.yml @@ -0,0 +1,30 @@ +name: Django CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + max-parallel: 4 + matrix: + python-version: [3.8] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Run Tests + run: | + python manage.py test diff --git a/README.md b/README.md index 79d1267..3825e76 100644 --- a/README.md +++ b/README.md @@ -55,5 +55,5 @@ ## 1주차 과제 제출 방법 - 본 레포지토리(upstream)를 fork 해주세요 - fork한 개인 레포지토리(origin)을 로컬에서 clone 받아주세요 -- [본인 이름]-week[주차]로 미리 구성된 브랜치에서 과제를 수행해주세요(Ex. pyungjae-week1) +- 본인 이름으로 미리 구성된 브랜치에서 과제를 수행해주세요 - 과제 수행 후, 변경 사항을 origin에 푸시하고 upstream의 동일 브랜치로 pr을 날려주세요 diff --git a/todos/serializers.py b/todos/serializers.py new file mode 100644 index 0000000..58e8879 --- /dev/null +++ b/todos/serializers.py @@ -0,0 +1,10 @@ +from rest_framework import serializers +from .models import Todo +from django.contrib import auth +from rest_framework.exceptions import AuthenticationFailed +from rest_framework_simplejwt.tokens import RefreshToken, TokenError + +class TodoSerializer(serializers.ModelSerializer): + class Meta: + model = Todo + fields = ['id','text', 'done'] \ No newline at end of file diff --git a/todos/views.py b/todos/views.py index 9bb7672..e8fdc4a 100644 --- a/todos/views.py +++ b/todos/views.py @@ -6,7 +6,8 @@ from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator -from rest_framework import permissions, generics +from rest_framework import permissions, generics, mixins +from .serializers import TodoSerializer def todo_instance_to_dictionary(todo): @@ -24,55 +25,66 @@ class ViewWithoutCSRFAuthentication(generics.GenericAPIView): def dispatch(self, request, *args, **kwargs): return super(ViewWithoutCSRFAuthentication, self).dispatch(request, *args, **kwargs) -class TodoListView(generics.GenericAPIView): +class TodoListView(generics.ListAPIView): permission_classes = [permissions.IsAuthenticated] + serializer_class = TodoSerializer def get(self, request): try: - todo_list = [] - todo_queryset = Todo.objects.filter(author_id = request.user.id) - for todo_instance in todo_queryset: - todo_list.append(todo_instance_to_dictionary(todo_instance)) - data = { "todos": todo_list } - return JsonResponse(data, status=200) + # todo_list = [] + # todo_queryset = Todo.objects.filter(author_id = request.user.id) + # for todo_instance in todo_queryset: + # todo_list.append(todo_instance_to_dictionary(todo_instance)) + # serializer = TodoSerializer(data=todo_queryset, many=True) + # data = { "todos": serializer.data } + # return JsonResponse(data, status=200) + return self.list(request.data, status=200) except: return JsonResponse({"msg": "Failed to get todos"}, status=404) -class TodoCreateView(ViewWithoutCSRFAuthentication): +class TodoCreateView(ViewWithoutCSRFAuthentication, generics.CreateAPIView): permission_classes = [permissions.IsAuthenticated] + serializer_class = TodoSerializer def post(self, request): + # try: + # body = json.loads(request.body) #body에서 받아온 것을 역직렬화! + # except: + # return JsonResponse({"msg": "Invalid parameters"}, status=400) + + # try: + # todo_instance = Todo.objects.create(text=body["text"], author_id = request.user.id) + # except: + # return JsonResponse({"msg": "Failed to create todos"}, status=400) + + # todo_dict = todo_instance_to_dictionary(todo_instance) + # data = { "todo": serializer.data } + # return JsonResponse(data, status=200) try: - body = json.loads(request.body) #body에서 받아온 것을 역직렬화! - except: - return JsonResponse({"msg": "Invalid parameters"}, status=400) - - try: - todo_instance = Todo.objects.create(text=body["text"], author_id = request.user.id) + return self.create(request.data, status=200) except: return JsonResponse({"msg": "Failed to create todos"}, status=400) - - todo_dict = todo_instance_to_dictionary(todo_instance) - data = { "todo": todo_dict } - return JsonResponse(data, status=200) + class TodoCheckView(ViewWithoutCSRFAuthentication): permission_classes = [permissions.IsAuthenticated] def patch(self, request, id): try: - todo_instance = Todo.objects.get(id=id) - if (todo_instance.author_id != request.user.id): - return JsonResponse({"msg": "Cannot access other's todo"}, status=401) - todo_instance.check_todo() - todo_dict = todo_instance_to_dictionary(todo_instance) - data = { "todo": todo_dict } - return JsonResponse(data, status=200) + # todo_instance = Todo.objects.get(id=id) + # if (todo_instance.author_id != request.user.id): + # return JsonResponse({"msg": "Cannot access other's todo"}, status=401) + # todo_instance.check_todo() + # todo_dict = todo_instance_to_dictionary(todo_instance) + # data = { "todo": todo_dict } + # return JsonResponse(data, status=200) + return self.update(request.data, id, status=200) except: return JsonResponse({"msg": "Failed to create todos"}, status=400) -class TodoView(ViewWithoutCSRFAuthentication): +class TodoView(ViewWithoutCSRFAuthentication, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin): permission_classes = [permissions.IsAuthenticated] + serializer_class = TodoSerializer def get(self, request, id): try: @@ -81,15 +93,17 @@ def get(self, request, id): if (todo_instance.author.id != request.user.id): return JsonResponse({"msg": "Cannot access other's todo"}, status=401) - todo_dict = todo_instance_to_dictionary(todo_instance) - data = { "todo": todo_dict } - return JsonResponse(data, status=200) + # todo_dict = todo_instance_to_dictionary(todo_instance) + # data = { "todo": todo_dict } + return self.retrieve(request, status=200) + except: return JsonResponse({"msg": "Failed to get todo"}, status=404) def patch(self, request, id): try: - body = json.loads(request.body) + # body = json.loads(request.body) + body = request.data except: return JsonResponse({"msg": "Invalid parameters"}, status=400) @@ -98,11 +112,12 @@ def patch(self, request, id): if (todo_instance.author.id != request.user.id): return JsonResponse({"msg": "Cannot access other's todo"}, status=401) - todo_instance.text = body["text"] - todo_instance.save() - todo_dict = todo_instance_to_dictionary(todo_instance) - data = { "todo": todo_dict } - return JsonResponse(data, status=200) + # todo_instance.text = body["text"] + # todo_instance.save() + # todo_dict = todo_instance_to_dictionary(todo_instance) + # data = { "todo": todo_dict } + # return JsonResponse(data, status=200) + return self.update(request, status=200) except: return JsonResponse({"msg": "Failed to edit todo"}, status=404) @@ -113,9 +128,10 @@ def delete(self, request, id): if (todo_instance.author.id != request.user.id): return JsonResponse({"msg": "Cannot access other's todo"}, status=401) - todo_dict = todo_instance_to_dictionary(todo_instance) - todo_instance.delete() - data = { "todo": todo_dict } - return JsonResponse(data, status=200) + # todo_dict = todo_instance_to_dictionary(todo_instance) + # todo_instance.delete() + # data = { "todo": todo_dict } + # return JsonResponse(data, status=200) + return self.delete(request, id) except: return JsonResponse({"msg": "Failed to delete todo"}, status=404)