From 8a274d1e42594b29b8bbcd3435544cd4916695be Mon Sep 17 00:00:00 2001 From: Pyungjae Park <78852778+pyungjae9492@users.noreply.github.com> Date: Sun, 23 Oct 2022 21:30:19 +0900 Subject: [PATCH 1/3] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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을 날려주세요 From b488a6b7c01c05cfe70e931793f35b35b0032e81 Mon Sep 17 00:00:00 2001 From: jihyune Date: Sat, 29 Oct 2022 13:42:52 +0900 Subject: [PATCH 2/3] apply serializer --- todos/serializers.py | 10 +++++ todos/views.py | 96 ++++++++++++++++++++++++++------------------ 2 files changed, 66 insertions(+), 40 deletions(-) create mode 100644 todos/serializers.py 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) From bc428e7caca262aa6e54e3899bfdee0f9d4a3dee Mon Sep 17 00:00:00 2001 From: Jihyun <93644826+jihyune@users.noreply.github.com> Date: Sat, 19 Nov 2022 15:43:24 +0900 Subject: [PATCH 3/3] Create django.yml --- .github/workflows/django.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/django.yml 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