Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .github/workflows/django.yml
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,5 @@
## 1주차 과제 제출 방법
- 본 레포지토리(upstream)를 fork 해주세요
- fork한 개인 레포지토리(origin)을 로컬에서 clone 받아주세요
- [본인 이름]-week[주차]로 미리 구성된 브랜치에서 과제를 수행해주세요(Ex. pyungjae-week1)
- 본인 이름으로 미리 구성된 브랜치에서 과제를 수행해주세요
- 과제 수행 후, 변경 사항을 origin에 푸시하고 upstream의 동일 브랜치로 pr을 날려주세요
10 changes: 10 additions & 0 deletions todos/serializers.py
Original file line number Diff line number Diff line change
@@ -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']
96 changes: 56 additions & 40 deletions todos/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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:
Expand All @@ -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)

Expand All @@ -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)

Expand All @@ -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)