Skip to content

Commit

Permalink
Merge pull request #20 from HE-Arc/mbu-19-question-view
Browse files Browse the repository at this point in the history
Mbu 19 question view
  • Loading branch information
maelys-buhler authored Mar 15, 2024
2 parents 4a7256e + fc88c5a commit fda2459
Show file tree
Hide file tree
Showing 10 changed files with 124 additions and 4 deletions.
3 changes: 2 additions & 1 deletion api/masteriq/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@

router = DefaultRouter()

router.register("category", views.IQView, basename="iq")
router.register("category", views.IQView, basename="category")
router.register("question", views.QuestionView, basename="question")

urlpatterns = [
path('admin/', admin.site.urls),
Expand Down
17 changes: 17 additions & 0 deletions api/masteriqapp/migrations/0005_auto_20240314_1738.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.0.2 on 2024-03-14 16:38

from django.db import migrations

def add_community_category(apps, schema_editor):
category_model = apps.get_model('masteriqapp', 'Category')
category_model.objects.create(name="Community", image_path='data\\images\\community.jpg')

class Migration(migrations.Migration):

dependencies = [
('masteriqapp', '0004_auto_20240308_0923'),
]

operations = [
migrations.RunPython(add_community_category)
]
6 changes: 5 additions & 1 deletion api/masteriqapp/models/Option.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@
class Option(models.Model):
text = models.CharField(max_length=255)
is_correct = models.BooleanField()
question = models.ForeignKey(Question, on_delete=models.CASCADE)
question = models.ForeignKey(Question, related_name='options', on_delete=models.CASCADE)

def __str__(self):
right_or_wrong = "Right" if self.is_correct else "Wrong"
return f"{right_or_wrong} : {self.text}"
12 changes: 12 additions & 0 deletions api/masteriqapp/serializers/QuestionAndOptionsSerializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from rest_framework import serializers

from django.apps import apps


class QuestionAndOptionsSerializer(serializers.ModelSerializer):
options = serializers.StringRelatedField(many=True, read_only=True)
category = serializers.SlugRelatedField(many=False, read_only=True, slug_field='name')

class Meta:
model = apps.get_app_config("masteriqapp").get_model("Question")
fields = ['id', 'text', 'category', 'options']
10 changes: 10 additions & 0 deletions api/masteriqapp/serializers/QuestionSerializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from rest_framework import serializers

from django.apps import apps


class QuestionSerializer(serializers.ModelSerializer):
category = serializers.SlugRelatedField(many=False, read_only=True, slug_field='name')
class Meta:
model = apps.get_app_config("masteriqapp").get_model("Question")
fields = ['id', 'text', 'category']
Empty file.
20 changes: 19 additions & 1 deletion api/masteriqapp/tests/test_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,22 @@ def test_route(self):
response = c.get("/category/iq/")
assert response.json()["1"]["category_name"] is not None
assert response.json()["1"]["user_iq"] is not None
assert response.status_code == 200
assert response.status_code == 200

response = c.get("/question/1/new/")
assert response.status_code == 200
assert response.json()['id'] is not None
assert response.json()['text'] is not None
assert response.json()['category'] is not None

response = c.post("/question/new_community/", {
"question": "How old is Harry Potter at the beginning of the first book?",
"options": ["11", "15", "He wasn\'t born"],
"answer": "1"})
print(response.status_code)
assert response.status_code == 201
assert response.json()['id'] is not None
assert response.json()['text'] is not None
assert response.json()['category'] is not None
assert response.json()['options'] is not None
assert len(response.json()['options']) >= 2
1 change: 0 additions & 1 deletion api/masteriqapp/views/IQView.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from rest_framework.decorators import action
from rest_framework.generics import get_object_or_404
from django.apps import apps
from PIL import Image
from rest_framework import status
from rest_framework.response import Response

Expand Down
58 changes: 58 additions & 0 deletions api/masteriqapp/views/QuestionView.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import io
import random

from rest_framework import viewsets
from rest_framework.decorators import action
from django.apps import apps
from rest_framework import status
from rest_framework.generics import get_object_or_404
from rest_framework.parsers import JSONParser
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response

from masteriqapp.serializers.QuestionAndOptionsSerializer import QuestionAndOptionsSerializer
from masteriqapp.serializers.QuestionSerializer import QuestionSerializer

masteriq = apps.get_app_config("masteriqapp")

class QuestionView(viewsets.ViewSet):
category_model = masteriq.get_model("Category")
question_model = masteriq.get_model("Question")
queryset = category_model.objects.all()

@action(detail=True, methods=["GET"])
def new(self, request, pk):
category = get_object_or_404(self.queryset, pk=pk)
if 'question' in request.session:
actual_question = self.question_model.objects.get(pk=request.session['question'])
if actual_question.category == category:
serializer = QuestionSerializer(actual_question)
return Response(serializer.data, status=status.HTTP_200_OK)

questions = self.question_model.objects.filter(category=category)
new_question = random.choice(questions)
request.session['question'] = new_question.id
print(request.session['question'])
serializer = QuestionSerializer(new_question)
return Response(serializer.data, status=status.HTTP_200_OK)

@action(detail=False, methods=["POST"])
def new_community(self, request):
datas = request.data
if not ('question' in datas and 'answer' in datas and 'options' in datas):
print("bad 1")
return Response(status=status.HTTP_400_BAD_REQUEST)
if len(datas['options']) < 1:
print("bad 2")
return Response(status=status.HTTP_400_BAD_REQUEST)

category = self.category_model.objects.get(name="Community")
question = self.question_model.objects.create(text=datas['question'], category=category)
options = []
for option in datas['options']:
options.append(masteriq.get_model('Option').objects.create(text=option, is_correct=False, question=question))
options.append(masteriq.get_model('Option').objects.create(text=datas['answer'], is_correct=True, question=question))

question_serializer = QuestionAndOptionsSerializer(question)

return Response(question_serializer.data, status=status.HTTP_201_CREATED)
1 change: 1 addition & 0 deletions api/masteriqapp/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from .IQView import IQView
from .QuestionView import QuestionView

0 comments on commit fda2459

Please sign in to comment.