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
2 changes: 1 addition & 1 deletion v2/src/ctrlfbe/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
ERR_TOPIC_NOT_FOUND = "토픽을 찾을 수 없습니다."
ERR_PAGE_NOT_FOUND = "페이지를 찾을 수 없습니다."
ERR_UNEXPECTED = "알 수 없는 에러가 발생 하였습니다."

ERR_KEY_INPUT_MSG = "을(를) 입력하세요."

ERR_NOT_FOUND_MSG_MAP = {"note": ERR_NOTE_NOT_FOUND, "topic": ERR_TOPIC_NOT_FOUND, "page": ERR_PAGE_NOT_FOUND}
3 changes: 2 additions & 1 deletion v2/src/ctrlfbe/page_urls.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from django.urls import path

from .views import PageDetailUpdateDeleteView
from .views import PageCreateView, PageDetailUpdateDeleteView

app_name = "pages"

urlpatterns = [
path("", PageCreateView.as_view(), name="page_create"),
path("<int:page_id>", PageDetailUpdateDeleteView.as_view(), name="page_detail"),
]
143 changes: 140 additions & 3 deletions v2/src/ctrlfbe/serializers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from rest_framework import serializers
from rest_framework import serializers, status
from rest_framework.exceptions import ValidationError

from .constants import ERR_NOTE_NOT_FOUND, ERR_TOPIC_NOT_FOUND
from .models import (
ContentRequest,
CtrlfActionType,
CtrlfContentType,
CtrlfIssueStatus,
Issue,
Note,
Page,
Expand Down Expand Up @@ -61,12 +64,146 @@ class NoteListQuerySerializer(serializers.Serializer):
class TopicSerializer(serializers.ModelSerializer):
class Meta:
model = Topic
fields = "__all__"
fields = ["id", "created_at", "updated_at", "title", "note", "is_approved"]
read_only_fields = ["id", "created_at"]

def create(self, validated_data):
owner = validated_data.pop("owner")
topic = Topic.objects.create(**validated_data)
topic.owners.add(owner)
topic.save()
return topic


class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
fields = "__all__"
fields = ["id", "created_at", "updated_at", "title", "content", "topic", "is_approved"]
read_only_fields = ["id", "created_at"]

def create(self, validated_data):
owner = validated_data.pop("owner")
page = Page.objects.create(**validated_data)
page.owners.add(owner)
page.save()
return page


class ContentRequestSerializer(serializers.ModelSerializer):
class Meta:
model = ContentRequest
fields = "__all__"

def create(self, validated_data):
content_request = ContentRequest.objects.create(**validated_data)
content_request.save()
return content_request


class IssueSerializer(serializers.ModelSerializer):
class Meta:
model = Issue
fields = "__all__"

def create(self, validated_data):
issue = Issue.objects.create(**validated_data)
issue.save()
return issue


class TopicCreateSerializer(serializers.Serializer):
note = serializers.IntegerField()
title = serializers.CharField()
content = serializers.CharField()

def validate(self, request_data):
try:
Note.objects.get(id=request_data["note"])
except Note.DoesNotExist:
raise ValidationError(detail=ERR_NOTE_NOT_FOUND, code=status.HTTP_404_NOT_FOUND)
return request_data

def create(self, validated_data):
topic_data = {
"note": validated_data["note"],
"title": validated_data["title"],
}
topic = TopicSerializer(data=topic_data)
if not topic.is_valid():
raise ValidationError(detail="topic 생성 실패", code=status.HTTP_400_BAD_REQUEST)
topic = topic.save(owner=validated_data["owner"])

content_request_data = {
"type": CtrlfContentType.TOPIC,
"action": CtrlfActionType.CREATE,
"sub_id": topic.id,
"user": validated_data["owner"].id,
}
content_request = ContentRequestSerializer(data=content_request_data)
if not content_request.is_valid():
raise ValidationError(detail="content_request 생성 실패", code=status.HTTP_400_BAD_REQUEST)
content_request = content_request.save()

issue_data = {
"owner": validated_data["owner"].id,
"content_request": content_request.id,
"title": validated_data["title"],
"content": validated_data["content"],
"status": CtrlfIssueStatus.REQUESTED,
}
issue = IssueSerializer(data=issue_data)
if not issue.is_valid():
raise ValidationError(detail="issue 생성 실패", code=status.HTTP_400_BAD_REQUEST)
issue = issue.save()

return issue


class PageCreateSerializer(serializers.Serializer):
topic = serializers.IntegerField()
title = serializers.CharField()
content = serializers.CharField()
issue_content = serializers.CharField()

def validate(self, request_data):
try:
Topic.objects.get(id=request_data["topic"])
except Topic.DoesNotExist:
raise ValidationError(detail=ERR_TOPIC_NOT_FOUND, code=status.HTTP_404_NOT_FOUND)
return request_data

def create(self, validated_data):
page_data = {
"topic": validated_data["topic"],
"title": validated_data["title"],
"content": validated_data["content"],
}
page = PageSerializer(data=page_data)
if not page.is_valid():
raise ValidationError(detail="page 생성 실패", code=status.HTTP_400_BAD_REQUEST)
page = page.save(owner=validated_data["owner"])

content_request_data = {
"type": CtrlfContentType.PAGE,
"action": CtrlfActionType.CREATE,
"sub_id": page.id,
"user": validated_data["owner"].id,
}
content_request = ContentRequestSerializer(data=content_request_data)
if not content_request.is_valid():
raise ValidationError(detail="content_request 생성 실패", code=status.HTTP_400_BAD_REQUEST)
content_request = content_request.save()

issue_data = {
"owner": validated_data["owner"].id,
"content_request": content_request.id,
"title": validated_data["title"],
"content": validated_data["issue_content"],
"status": CtrlfIssueStatus.REQUESTED,
}
issue = IssueSerializer(data=issue_data)
if not issue.is_valid():
raise ValidationError(detail="issue 생성 실패", code=status.HTTP_400_BAD_REQUEST)
issue = issue.save()

return issue
18 changes: 18 additions & 0 deletions v2/src/ctrlfbe/swagger.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
NoteCreateRequestBodySerializer,
NoteListQuerySerializer,
NoteSerializer,
PageCreateSerializer,
PageSerializer,
TopicCreateSerializer,
TopicSerializer,
)

Expand Down Expand Up @@ -54,3 +56,19 @@
"operation_description": "page_id에 해당하는 Page의 상세 내용을 리턴합니다",
"tags": ["디테일 화면"],
}

SWAGGER_TOPIC_CREATE_VIEW = {
"request_body": TopicCreateSerializer,
"responses": {201: ""},
"operation_summary": "Topic Create API",
"operation_description": "미승인 토픽을 생성하고 토픽 생성 이슈를 등록합니다.",
"tags": ["디테일 화면"],
}

SWAGGER_PAGE_CREATE_VIEW = {
"request_body": PageCreateSerializer,
"responses": {201: ""},
"operation_summary": "Page Create API",
"operation_description": "미승인 페이지를 생성하고 페이지 생성 이슈를 등록합니다.",
"tags": ["디테일 화면"],
}
3 changes: 2 additions & 1 deletion v2/src/ctrlfbe/topic_urls.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from django.urls import path

from .views import PageListView, TopicDetailUpdateDeleteView
from .views import PageListView, TopicCreateView, TopicDetailUpdateDeleteView

app_name = "topics"

urlpatterns = [
path("", TopicCreateView.as_view(), name="topic_create"),
path("<int:topic_id>/pages", PageListView.as_view(), name="page_list"),
path("<int:topic_id>", TopicDetailUpdateDeleteView.as_view(), name="topic_detail"),
]
45 changes: 44 additions & 1 deletion v2/src/ctrlfbe/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
SWAGGER_NOTE_CREATE_VIEW,
SWAGGER_NOTE_DETAIL_VIEW,
SWAGGER_NOTE_LIST_VIEW,
SWAGGER_PAGE_CREATE_VIEW,
SWAGGER_PAGE_DETAIL_VIEW,
SWAGGER_PAGE_LIST_VIEW,
SWAGGER_TOPIC_CREATE_VIEW,
SWAGGER_TOPIC_DETAIL_VIEW,
SWAGGER_TOPIC_LIST_VIEW,
)
Expand All @@ -16,12 +18,19 @@
from rest_framework.response import Response
from rest_framework.views import APIView

from .constants import ERR_NOT_FOUND_MSG_MAP, ERR_UNEXPECTED, MAX_PRINTABLE_NOTE_COUNT
from .constants import (
ERR_KEY_INPUT_MSG,
ERR_NOT_FOUND_MSG_MAP,
ERR_UNEXPECTED,
MAX_PRINTABLE_NOTE_COUNT,
)
from .models import CtrlfIssueStatus, Note, Page, Topic
from .serializers import (
IssueCreateSerializer,
NoteSerializer,
PageCreateSerializer,
PageSerializer,
TopicCreateSerializer,
TopicSerializer,
)

Expand Down Expand Up @@ -108,6 +117,23 @@ def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)


class TopicCreateView(CtrlfAuthenticationMixin, APIView):
@swagger_auto_schema(**SWAGGER_TOPIC_CREATE_VIEW)
def post(self, request, *args, **kwargs):
ctrlf_user = self._ctrlf_authentication(request)
serializer = TopicCreateSerializer(data=request.data)

if serializer.is_valid():
serializer.save(owner=ctrlf_user)
return Response(status=status.HTTP_201_CREATED)
else:
for key, message in serializer.errors.items():
err = message[0]
if err.code == "required":
return Response({"message": key + ERR_KEY_INPUT_MSG}, status=status.HTTP_400_BAD_REQUEST)
return Response({"message": err}, status=err.code)


class TopicDetailUpdateDeleteView(BaseContentView):
parent_model = Topic
serializer = TopicSerializer
Expand Down Expand Up @@ -135,3 +161,20 @@ class PageDetailUpdateDeleteView(BaseContentView):
@swagger_auto_schema(**SWAGGER_PAGE_DETAIL_VIEW)
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)


class PageCreateView(CtrlfAuthenticationMixin, APIView):
@swagger_auto_schema(**SWAGGER_PAGE_CREATE_VIEW)
def post(self, request, *args, **kwargs):
ctrlf_user = self._ctrlf_authentication(request)
serializer = PageCreateSerializer(data=request.data)

if serializer.is_valid():
serializer.save(owner=ctrlf_user)
return Response(status=status.HTTP_201_CREATED)
else:
for key, message in serializer.errors.items():
err = message[0]
if err.code == "required":
return Response({"message": key + ERR_KEY_INPUT_MSG}, status=status.HTTP_400_BAD_REQUEST)
return Response({"message": err}, status=err.code)
Loading