Skip to content

Commit

Permalink
Merge pull request #4 from Team-MailedIt/feature-candidate-and-vote
Browse files Browse the repository at this point in the history
feat: Candidate, Vote 모델 및 관련 API 구현
  • Loading branch information
14hhan authored Dec 3, 2021
2 parents 0240ae2 + f8ec4b4 commit f4e9139
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 4 deletions.
6 changes: 4 additions & 2 deletions account/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django.contrib import admin
from .models import User
from .models import User, Candidate, Vote

# Register your models here.
admin.site.register(User)
admin.site.register(User)
admin.site.register(Candidate)
admin.site.register(Vote)
31 changes: 31 additions & 0 deletions account/migrations/0002_candidate_vote.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 3.0.8 on 2021-12-02 17:01

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('account', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Candidate',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30)),
('part', models.CharField(choices=[('FE', '프론트엔드'), ('BE', '백엔드')], max_length=2)),
],
),
migrations.CreateModel(
name='Vote',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('vote_candidate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='account.Candidate')),
('vote_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]
14 changes: 14 additions & 0 deletions account/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,17 @@

class User(AbstractUser):
part = models.CharField(max_length=2, choices=PART_CHOICES)

class Candidate(models.Model):
name = models.CharField(max_length=30)
part = models.CharField(max_length=2, choices=PART_CHOICES)

def __str__(self):
return self.name

class Vote(models.Model):
vote_user = models.ForeignKey(User, on_delete=models.CASCADE)
vote_candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE)

def __str__(self):
return f"{self.vote_user.username}'s vote on {self.vote_candidate.name}"
21 changes: 21 additions & 0 deletions account/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django.db.models.base import Model
from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import Candidate, Vote

User = get_user_model()

Expand All @@ -15,3 +17,22 @@ def create(self, validated_data):
user.set_password(password)
user.save()
return user

class CandidateSerializer(serializers.ModelSerializer):
class Meta:
model = Candidate
fields = ['id', 'name', 'part']

class VoteSerializer(serializers.ModelSerializer):
vote_user = serializers.SerializerMethodField()
vote_candidate = serializers.SerializerMethodField()

def get_vote_user(self, obj):
return obj.vote_user.username

def get_vote_candidate(self, obj):
return obj.vote_candidate.name

class Meta:
model = Vote
fields = ['id', 'vote_user', 'vote_candidate']
5 changes: 4 additions & 1 deletion account/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
from django.urls import path
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
from .views import RegisterAPIView, TestAPIView
from .views import RegisterAPIView, CandidateListAPIView, CandidateDetailAPIView, VoteAPIView, TestAPIView

urlpatterns = [
path("signin", TokenObtainPairView.as_view(), name="token_obtain_pair"),
# 세션 연장하고 싶을 때 refresh token 사용
# path("token/refresh", TokenRefreshView.as_view(), name="token_refresh"),
path("signup", RegisterAPIView.as_view()),
path("candidate", CandidateListAPIView.as_view()),
path("candidate/<int:pk>", CandidateDetailAPIView.as_view()),
path("vote", VoteAPIView.as_view()),
path("test", TestAPIView.as_view()),
]
43 changes: 42 additions & 1 deletion account/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from django.http.response import Http404
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from django.contrib.auth import get_user_model
from .serializers import RegisterSerializer
from .models import Candidate, Vote
from .serializers import RegisterSerializer, CandidateSerializer, VoteSerializer
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework.permissions import IsAuthenticated


User = get_user_model()
Expand All @@ -30,6 +33,44 @@ def post(self, request):
return Response(user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class CandidateListAPIView(APIView):
def get(self, request, format=None):
candidates = Candidate.objects.all()
serializer = CandidateSerializer(candidates, many=True)
return Response(serializer.data, status.HTTP_200_OK)


class CandidateDetailAPIView(APIView):
def get_object(self, pk):
try:
return Candidate.objects.get(pk=pk)
except Candidate.DoesNotExist:
raise Http404

def get(self, request, pk, format=None):
candidate = self.get_object(pk)
serializer = CandidateSerializer(candidate)
return Response(serializer.data, status.HTTP_200_OK)



class VoteAPIView(APIView):
permission_classes = (IsAuthenticated,)

def post(self, request, format=None):
try:
user_id = request.data.get('user_id')
candidate_id = request.data.get('candidate_id')
vote = Vote.objects.create(
vote_user=User.objects.get(pk=user_id),
vote_candidate=Candidate.objects.get(pk=candidate_id)
)
serializer = VoteSerializer(vote)
except Exception:
return Response(status.HTTP_500_INTERNAL_SERVER_ERROR)
return Response(serializer.data, status.HTTP_201_CREATED)


class TestAPIView(APIView):
def get(self, request):
return Response(
Expand Down

0 comments on commit f4e9139

Please sign in to comment.