/api/views.py
#/api/views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
# Create your views here.
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework.reverse import reverse
from rest_framework import generics
from correlator.models import Instruction
from parameters.models import Parameter
from reviews.models import Question
from reviews.models import Choice
from rest_framework.generics import ListCreateAPIView
from rest_framework import status
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
from .serializers import QuestionListPageSerializer, QuestionDetailPageSerializer, QuestionChoiceSerializer, VoteSerializer, QuestionResultPageSerializer, ChoiceSerializer
import api.serializers as serializers
class InstructionsListAPIView(generics.ListCreateAPIView):
queryset = Instruction.objects.all()
serializer_class = serializers.InstructionListSerializer
class InstructionsAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Instruction.objects.all()
serializer_class = serializers.InstructionSerializer
class ParametersListAPIView(generics.ListCreateAPIView):
queryset = Parameter.objects.all()
serializer_class = serializers.ParametersListSerializer
class ParameterAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Parameter.objects.all()
serializer_class = serializers.ParameterSerializer
#reviews
class QuestionsListAPIView(generics.ListCreateAPIView):
queryset = Question.objects.all()
serializer_class = serializers.QuestionListSerializer
class QuesttionsAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Question.objects.all()
serializer_class = serializers.QuestionSerializer
class QuestionsAPIView(generics.ListCreateAPIView):
queryset = Question.objects.all()
serializer_class = serializers.ParameterSerializer
class ChoicesView(ListCreateAPIView):
serializer_class = ChoiceSerializer
queryset = Choice.objects.all()
class QuestionsViewSet(ModelViewSet):
print()
print('QuestionsViewSet')
print()
"""
@api {get} /questions/ Questions list
@apiName Questions list
@apiDescription This returns a list of questions.
@apiGroup Questions
@apiVersion 1.0.0
@apiSuccess {Integer} id Unique identifier
@apiSuccess {String} pub_date Published date
@apiSuccess {String} question_text Question text
@apiSuccess {String} was_published_recently Was published recently?
@apiSuccessExample Response
HTTP/1.1 200 OK
[
{
"id": 1,
"was_published_recently": false,
"question_text": "Who is the most likable character in GOT?"
"pub_date": "2019-05-09T00:00:00Z",
},
{
"id": 46,
"was_published_recently": false,
"question_text": "Who is your favorite fictional character?",
"pub_date": "2019-05-10T00:00:00Z"
}
]
"""
"""
@api {post} /questions/ Create a question
@apiName Question create
@apiGroup Questions
@apiVersion 1.0.0
@apiParam (Payload) {String} pub_date Published date
@apiParam (Payload) {String} question_text Question text
@apiParam (Payload) {Dictionary[]} choice_set List of choices
@apiParamExample {json} Payload-example
{
"pub_date": "2019-05-05T00:00",
"question_text": "Is Samsung more reliable than iPhone?",
"choice_set": [
{
"choice_text": "No"
}
]
}
@apiSuccess {Integer} id Unique identifier
@apiSuccess {Dictionary[]} choice_set List of choices
@apiSuccess {String} pub_date Published date
@apiSuccess {String} question_text Question text
@apiSuccess {String} was_published_recently Was published recently?
@apiSuccessExample Response
HTTP/1.1 201 Created
{
"id": 50,
"was_published_recently": false,
"choice_set": [
{
"id": 50,
"choice_text": "No"
}
],
"question_text": "Is Samsung more reliable than iPhone?",
"pub_date": "2019-05-05T00:00:00Z"
}
"""
queryset = Question.objects.all()
lookup_url_kwarg = 'question_id'
def get_serializer_class(self):
# Handle .create() requests
if self.request.method == 'POST':
return QuestionDetailPageSerializer
# Handle .result() requests
elif self.detail is True and self.request.method == 'GET' and self.name == 'Result':
return QuestionResultPageSerializer
# Handle .retrieve() requests
elif self.detail is True and self.request.method == 'GET':
return QuestionDetailPageSerializer
return QuestionListPageSerializer
@action(detail=True)
def result(self, request, *args, **kwargs):
return self.retrieve(self, request, *args, **kwargs)
@action(methods=['GET', 'POST'], detail=True)
def choices(self, request, *args, **kwargs):
question = self.get_object()
if request.method == 'GET':
choices = question.choice_set.all()
serializer = QuestionChoiceSerializer(choices, many=True)
return Response(serializer.data)
else:
serializer = QuestionChoiceSerializer(data=request.data)
if serializer.is_valid():
serializer.save(question=question)
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@action(methods=['patch'], detail=True)
def vote(self, request, *args, **kwargs):
question = self.get_object()
serializer = VoteSerializer(data=request.data)
if serializer.is_valid():
choice = get_object_or_404(Choice, pk=serializer.validated_data['choice_id'], question=question)
choice.votes += 1
choice.save()
return Response("Voted")
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(('GET',))
def api_root(request, format=None):
return Response({
'instructions': reverse('instructions', request=request, format=format),
'parameters': reverse('parameters', request=request, format=format),
'questions' : reverse('questions', request=request, format=format),
})
and
#/api/serializers.py
from django.forms import widgets
from rest_framework import serializers
from correlator.models import Instruction
from reviews.models import Question
from parameters.models import Parameter
from reviews.models import Question
from reviews.models import Choice
class ParametersListSerializer(serializers.ModelSerializer):
class Meta:
model = Parameter
fields = ('id', 'matchingKey', 'sequence', 'param_kwargs_json', 'param1', 'param2', 'param3', 'param4', 'param5',
'param6', 'param7', 'param8', 'param9', 'param10', 'description')
class ParameterSerializer(serializers.ModelSerializer):
class Meta:
model = Parameter
fields = ('id', 'matchingKey', 'sequence', 'param_kwargs_json', 'param1', 'param2', 'param3', 'param4', 'param5',
'param6', 'param7', 'param8', 'param9', 'param10', 'description')
class InstructionListSerializer(serializers.ModelSerializer):
class Meta:
model = Instruction
fields = '__all__'
class InstructionSerializer(serializers.ModelSerializer):
class Meta:
model = Instruction
fields = '__all__'
#Polls
class QuestionListSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = '__all__'
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = '__all__'
class QuestionChoiceSerializer(serializers.ModelSerializer):
class Meta:
model = Choice
fields = ('id', 'choice_text')
class ChoiceSerializer(serializers.ModelSerializer):
question_text = serializers.CharField(read_only=True, source='question.question_text')
class Meta:
model = Choice
fields = ('id', 'choice_text', 'question', 'question_text')
extra_kwargs = {
'question': {'write_only': True}
}
class QuestionChoiceSerializerWithVotes(QuestionChoiceSerializer):
class Meta(QuestionChoiceSerializer.Meta):
fields = QuestionChoiceSerializer.Meta.fields + ('votes',)
class QuestionListPageSerializer(serializers.ModelSerializer):
# was_published_recently = serializers.BooleanField(read_only=True)
class Meta:
model = Question
# fields = '__all__'
fields = ('id', 'question_text')
class QuestionDetailPageSerializer(QuestionListPageSerializer):
choice_set = QuestionChoiceSerializer(many=True)
def create(Question, validated_data):
choice_validated_data = validated_data.pop('choice_set')
question = Question.objects.create(**validated_data)
choice_set_serializer = Question.fields['choice_set']
for each in choice_validated_data:
each['question'] = question
choices = choice_set_serializer.create(choice_validated_data)
return question
class QuestionResultPageSerializer(QuestionListPageSerializer):
choices = QuestionChoiceSerializerWithVotes(many=True, read_only=True)
class VoteSerializer(serializers.Serializer):
choice_id = serializers.IntegerField()
Like the other two DRF APIs I didn’t specify a template.