Esempio n. 1
0
 def put(self, request, pk, format=None):
     question = self.get_question(pk, request.user)
     serializer = QuestionSerializer(question, data=request.data)
     if serializer.is_valid():
         serializer.save()
         return Response(serializer.data)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Esempio n. 2
0
    def test_new_questions(self):
        P_ID = 1
        url = '/api/submit/' + str(P_ID) + '/questions'
        data = [{
            "number": "1a"
        }, {
            "number": "1b"
        }, {
            "number": "2ai"
        }, {
            "number": "2aii"
        }, {
            "number": "2b"
        }]

        response = self.client.post(url, data, format='json')

        # Test status code
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

        # Test response data valid
        serializer = QuestionSerializer(data=response.data,
                                        many=True,
                                        context={'paper_id': P_ID})
        self.assertTrue(serializer.is_valid(), msg=serializer.errors)

        # Test response data correct
        self.assertEqual(response.data[0]['number'], "1a")
        self.assertEqual(response.data[1]['number'], "1b")
        self.assertEqual(response.data[2]['number'], "2ai")
        self.assertEqual(response.data[3]['number'], "2aii")
        self.assertEqual(response.data[4]['number'], "2b")
Esempio n. 3
0
    def post(self, request, paper_id):
        serializer = QuestionSerializer(data=request.data,
                                        many=True,
                                        context={'paper_id': paper_id})
        if not serializer.is_valid():
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
Esempio n. 4
0
def question_list(request):
    """
    List all validated questions (return them in a semi-random order)
    Optional query parameters:
    - 'category' (string)
    - 'tag' (string)
    - 'author' (string)
    """
    # get only the validated questions
    questions = Question.objects.validated()

    # order by difficulty, then random inside
    questions = questions.order_by("difficulty", "?")

    # filters
    if request.GET.get("category"):
        questions = questions.for_category(request.GET.get("category"))
    if request.GET.get("tag"):
        questions = questions.for_tag(request.GET.get("tag"))
    if request.GET.get("author"):
        questions = questions.for_author(request.GET.get("author"))

    if request.GET.get("full"):
        serializer = QuestionFullStringSerializer(questions, many=True)
    else:
        serializer = QuestionSerializer(questions, many=True)

    return Response(serializer.data)
Esempio n. 5
0
def get_question(request, question_id):
    try:
        question = Question.objects.get(id=question_id)
        serializer = QuestionSerializer(question)
        return Response(serializer.data, status=status.HTTP_200_OK)
    except Exception as e:
        return Response({}, status=status.status.HTTP_400_BAD_REQUEST)
Esempio n. 6
0
def question_random(request):
    """
    Retrieve a random question
    Optional query parameters:
    - 'current' (question id)
    - 'category' (string)
    - 'tag' (string)
    - 'author' (string)
    """
    questions = Question.objects.validated()
    if request.GET.get("current"):
        questions = questions.exclude(pk=request.GET.get("current"))
    if request.GET.get("category"):
        questions = questions.for_category(request.GET.get("category"))
    if request.GET.get("tag"):
        questions = questions.for_tag(request.GET.get("tag"))
    if request.GET.get("author"):
        questions = questions.for_author(request.GET.get("author"))

    questions_ids = questions.values_list("id", flat=True)
    questions_random_id = random.sample(list(questions_ids), 1)

    question_random = Question.objects.get(pk=questions_random_id[0])

    if request.GET.get("full"):
        serializer = QuestionFullStringSerializer(question_random)
    else:
        serializer = QuestionSerializer(question_random)

    return Response(serializer.data)
Esempio n. 7
0
def get_questions(request):
    try:
        questions = Question.objects.all()
        serializer = QuestionSerializer(questions)
        return Response(serializer.data, status=status.HTTP_200_OK)
    except Exception as e:
        return Response({}, status=status.status.HTTP_400_BAD_REQUEST)
Esempio n. 8
0
 def test_contains_expected_fields(self):
     serializer = QuestionSerializer(instance=self.question,
                                     context={'request': self.request})
     expected_keys = [
         'id', 'user', 'tags', 'votes', 'title', 'text', 'created'
     ]
     self.assertCountEqual(serializer.data.keys(), expected_keys)
Esempio n. 9
0
    def post(self, request, room_number, question_id):
        request.session.save()
        session = Session.objects.get(session_key=request.session.session_key)
        json = JSONParser().parse(request)
        question = get_or_none(Question, pk=question_id)
        if question and question.room.number == room_number:
            vote = Question.objects.get(pk=question_id).vote_set.filter(owner=session).all().first()

            if vote:
                return Response({'error': 'you have already vote for this question'}, status=403)
            else:
                value = json['value']

                if value > 0:
                    question.balance += 1
                elif value < 0:
                    question.balance -= 1

                question.save()

                vote = Vote(question=question, owner=session)
                vote.save()

                Group('room-%s' % question.room.number).send({
                    'text': dumps({
                        'type': 'question',
                        'action': 'update',
                        'data': QuestionSerializer(question).data
                    })
                })

                return Response({}, status=204)

        else:
            return Response({'error': 'no matching question found'}, status=404)
Esempio n. 10
0
def QuestionResponse(userid, questionid):
    """@brief Function for getting the particular question for a logged in user
    @details It takes a question id and a user id as input and outputs the question along with a list of all the answers for this question and all the votes which are given for some answer of this question
    @param userid the user id in db
    @param questionid the question id in db
    @return the question along with a list of answers for the question and a list of votes by the user on answer for this question
    """

    question = Question.objects.filter(id=questionid)
    qdata = QuestionSerializer(question, many=True)

    answers = Answer.objects.filter(question=questionid)
    answer_list = answers.values_list('id', flat=True).order_by('id')
    adata = AnswerSerializer(answers, many=True)

    uservotes = Vote.objects.filter(user=userid)
    ans_list = uservotes.values_list('answer', flat=True).order_by('answer')
    alist = [ans for ans in answer_list if ans in ans_list]
    votes = uservotes.filter(answer__in=alist)
    vdata = VoteSerializer(votes, many=True)

    return Response({
        "Question": qdata.data,
        "Answers": adata.data,
        "Votes": vdata.data,
    })
Esempio n. 11
0
def question_create(request):
    """
    Create a one question.

    """
    user = request.user
    question = Question(author=user)
    if request.method == 'POST':

        serializer = QuestionSerializer(question, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
Esempio n. 12
0
    def test_authorized_user(self):
        self.client.force_authenticate(user=self.user1)

        response = self.client.get(
            reverse('api_question_detail', kwargs={'pk': self.question1.id}))
        serializer_data = QuestionSerializer(instance=self.question1).data
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data, serializer_data)
Esempio n. 13
0
    def get(self, request, room_number):
        request.session.save()
        room = get_or_none(Room, number=room_number)

        if room:
            return Response(QuestionSerializer(room.question_set.all(), many=True), status=200)
        else:
            return Response({'error': 'room not found'}, status=404)
class ParsonsSubmissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = ParsonsSubmission
        fields = ['pk', 'submission_time', 'answer', 'grade', 'is_correct', 'is_partially_correct', 'finalized',
                  'status', 'tokens_received', 'token_value', 'question', 'get_decoded_stderr', 'get_decoded_results',
                  'get_formatted_test_results', 'get_passed_test_results', 'get_failed_test_results', 'get_num_tests',
                  'formatted_tokens_received', 'answer_files', 'show_answer', 'show_detail', 'status_color']

    question = QuestionSerializer()
Esempio n. 15
0
    def test_get_questions_correctly(self):
        P_COURSE = 'C141'
        P_YEAR = '2015'

        response = self.client.get('/api/' + P_COURSE + '/' + P_YEAR +
                                   '/questions')

        # Test GET response OK
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        data = response.json()

        # Test response data can be serialized
        serializer = QuestionSerializer(data=data, many=True)
        self.assertTrue(serializer.is_valid(), msg=str(serializer.errors))

        # Test response data correct
        for i in range(0, 4):
            self.assertEquals(data[i]['id'], i)
            self.assertEquals(data[i]['number'], str(i))
Esempio n. 16
0
 def test_get_question(self):
     # Given
     question = Question.objects.get(summary='test question')
     serializer = QuestionSerializer(question)
     # When
     self.client.login(username=self.username, password=self.password)
     response = self.client.get(
         reverse('api:question', kwargs={'pk': question.id}))
     # Then
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(response.data, serializer.data)
Esempio n. 17
0
def question_list(request):
    """
    List all questions

    """
    if request.method == 'GET':
        questions = Question.objects.all()
        serializer = QuestionSerializer(questions, many=True)
        return Response(serializer.data)
    else:
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
Esempio n. 18
0
def add_question(request, user_id):

    mentee = Mentee.objects.get(id=user_id)
    question = Question()
    question.author = mentee
    question.title = request.data['title']
    question.description = request.data['description']
    question.language = request.data['language']
    question.save()
    return Response(QuestionSerializer(question).data,
                    status=status.HTTP_201_CREATED)
Esempio n. 19
0
 def test_get_all_questions(self):
     # Given
     questions = Question.objects.filter(user=self.user)
     serializer = QuestionSerializer(questions, many=True)
     # When
     self.client.login(username=self.username, password=self.password)
     response = self.client.get(reverse('api:questions'))
     # Then
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(len(response.data), 2)
     self.assertEqual(response.data, serializer.data)
Esempio n. 20
0
def question_detail(request, pk):
    """
    Retrieve a question
    """
    try:
        question = Question.objects.get(pk=pk)
    except Question.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    serializer = QuestionSerializer(question)
    return Response(serializer.data)
Esempio n. 21
0
class MultipleChoiceSubmissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = MultipleChoiceSubmission
        fields = [
            'pk', 'submission_time', 'answer', 'grade', 'is_correct',
            'is_partially_correct', 'finalized', 'status', 'tokens_received',
            'token_value', 'question', 'answer_display', 'show_answer',
            'show_detail', 'status_color'
        ]

    question = QuestionSerializer()
Esempio n. 22
0
class ExerciseSerializer(serializers.ModelSerializer):
    questions = QuestionSerializer(many=True, source='question_data')
    test_sheet = serializers.SlugRelatedField(slug_field='name',
                                              read_only=True)

    def create(self, validated_data):
        pass

    #
    class Meta:
        model = ExerciseModel
        fields = ('name', 'questions', 'material_url', 'test_sheet')
Esempio n. 23
0
def question_list(request):
    """
    List all questions (return them in a random order)
    Optional query parameters:
    - 'category' (string)
    """
    questions = Question.objects.published().order_by("?")
    if request.GET.get("category"):
        questions = questions.for_category(request.GET.get("category"))

    serializer = QuestionSerializer(questions, many=True)
    return Response(serializer.data)
Esempio n. 24
0
    def post(self, request, room_number):
        request.session.save()
        json = JSONParser().parse(request)
        room = get_or_none(Room, number=room_number)

        if room:
            question = Question(room=room, title=json['title'], balance=0)
            question.save()

            Group('room-%s' % question.room.number).send({
                'text': dumps({
                    'type': 'question',
                    'action': 'create',
                    'data': QuestionSerializer(question).data
                })
            })

            return Response(QuestionSerializer(question).data, status=201)

        else:
            return Response({"error": "no room " + room_number + " found"}, status=404)
Esempio n. 25
0
 def get(self, request, *args, **kwargs):
     page = self.request.query_params.get("page")
     query = self.request.query_params.get("query")
     ques_qs = Questions.objects.filter(query=query)
     if ques_qs.exists():
         ques_object = ques_qs.first()
         serialized_data = QuestionSerializer(ques_object)
         data = serialized_data.data['data']
         return Response(data, status=status.HTTP_200_OK)
     adv_res = GetStackExchange()
     adv_res = adv_res.advance_search(query, page)
     return Response(adv_res, status=status.HTTP_200_OK)
Esempio n. 26
0
    def test_serializer2(self):
        paper = Paper.objects.get(course="C212", year=2015)
        questions = Question.objects.filter(paper=paper)

        # Serialise into (question id, question number)
        serializer = QuestionSerializer(questions, many=True)
        self.assertEqual(serializer.data, [
            OrderedDict([('id', 5), ('number', '1ai')]),
            OrderedDict([('id', 6), ('number', '2ai')]),
            OrderedDict([('id', 7), ('number', '3ai')]),
            OrderedDict([('id', 8), ('number', '4ai')])
        ])
Esempio n. 27
0
    def test_serializer1(self):
        paper = Paper.objects.get(course="C212", year=2016)
        questions = Question.objects.filter(paper=paper)

        # Serialise into (question id, question number)
        serializer = QuestionSerializer(questions, many=True)
        self.assertEqual(serializer.data, [
            OrderedDict([('id', 1), ('number', '1')]),
            OrderedDict([('id', 2), ('number', '2')]),
            OrderedDict([('id', 3), ('number', '3')]),
            OrderedDict([('id', 4), ('number', '4')])
        ])
Esempio n. 28
0
def Feed(userid):
    """!@brief Function that returns the feed output for the user with id userid
    @details the function will search for questions with tagged topics in the list of subscribed_topics for the user as well as the questions that he asked himself and the questions will be displayed in sorted order based on their timestamps
    @param the userid of the logged in user
    @return a list of questions which need to be displayed to the user on his feed
    """
    subtopics = User.objects.filter(id=userid).values_list('subscribed_topics',
                                                           flat=True)
    q1 = Question.objects.filter(user=userid)
    q2 = Question.objects.filter(topics__in=subtopics).distinct()
    q3 = q1.union(q2)
    qdata = QuestionSerializer(q3, many=True)
    return Response(qdata.data)
Esempio n. 29
0
def question_update(request, pk=None):
    """
    Update all fields of question

    """
    try:
        question = Question.objects.get(pk=pk)
    except Question.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    # verifying user of this question
    user = request.user
    if question.author != user:
        return Response({'error': 'You do not have permission to update this question.'})
    if request.method == 'PUT':
        serializer = QuestionSerializer(question, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
Esempio n. 30
0
def PostQuestion(request):
    """!@brief Function which is called when a user adds a question
    @details the function takes a question object as part of the request body, extracts the object and then creates a new entry in the question table. Since the topics is a many-to-many field, the topics need to be added one by one
    @return returns the feed output for the given user
    """
    serializer = QuestionSerializer(data=request.data)
    if serializer.is_valid():
        ques = serializer.validated_data
        user = ques['user']
        question = Question(user=user,
                            username=user.name,
                            userdepartment=user.department,
                            userbio=user.bio,
                            userdegree=user.degree,
                            userspecialization=user.specialization,
                            question=ques['question'],
                            description=ques['description'])
        question.save()
        for topic in ques['topics']:
            question.topics.add(topic)
        return Feed(user.id)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Esempio n. 31
0
 def post(self, request, format=None):
     serializer = QuestionSerializer(data=request.DATA)
     if serializer.is_valid():
         serializer.save()
         return Response(serializer.data, status=status.HTTP_201_CREATED)
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)