Skip to content

Commit c1432e6

Browse files
committed
Fix Auth Issues; Add SubmissionViewSet
1 parent 8305707 commit c1432e6

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

course_api/typeform/api_views.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
from rest_framework.response import Response
44
from rest_framework.serializers import Serializer, CharField, IntegerField
55
from rest_framework.viewsets import GenericViewSet, ModelViewSet
6-
from course_api.typeform.models import Form, FormField
7-
from course_api.typeform.serializers import FieldSerializer, FormSerializer
6+
from rest_framework.permissions import IsAuthenticated
7+
from course_api.typeform.models import Form, FormField, Submission
8+
from course_api.typeform.serializers import FieldSerializer, FormSerializer, SubmissionSerializer
89
from drf_yasg.utils import swagger_auto_schema
910
from yaml import serialize
1011

@@ -36,10 +37,8 @@ def mock_test(self, request):
3637
])
3738

3839

39-
class FormViewSet(LoginRequiredMixin, RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet, CreateModelMixin):
40+
class FormViewSet(RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet, CreateModelMixin):
4041
serializer_class = FormSerializer
41-
authentication_classes = []
42-
authorization_classes = []
4342
queryset = Form.objects.all()
4443

4544
def get_queryset(self, *args, **kwargs):
@@ -64,3 +63,24 @@ def get_queryset(self):
6463
def perform_create(self, serializer):
6564
# Add Authorization
6665
serializer.save(form_id=self.kwargs['form_pk'])
66+
67+
68+
class SubmissionViewSet(RetrieveModelMixin, ListModelMixin, CreateModelMixin, GenericViewSet):
69+
serializer_class = SubmissionSerializer
70+
permission_classes = [IsAuthenticated]
71+
72+
def get_queryset(self):
73+
if(self.request.user.is_anonymous):
74+
raise PermissionError("You must be authenticated to use this API.")
75+
return Submission.objects.filter(form=self.kwargs['form_pk'])
76+
77+
def perform_create(self, serializer):
78+
# Add Authorization
79+
serializer.save(form_id=self.kwargs['form_pk'])
80+
81+
def list(self, request, *args, **kwargs):
82+
# Add Authorization
83+
if(self.request.user.is_anonymous):
84+
raise PermissionError("You must be authenticated to use this API.")
85+
self.queryset.filter(form__created_by=self.request.user)
86+
return super().list(request, *args, **kwargs)

course_api/typeform/models.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@
44
from course_api.utils.models.jsonfield import JSONField
55
from course_api.users.models import User
66

7+
78
class FormField(BaseModel):
89
class FormFieldKind(enum.Enum):
910
TEXT = "text"
1011
DROPDOWN = "dropdown"
1112
RADIO = "radio"
1213

1314
kind = models.CharField(max_length=20, choices=[(tag.name, tag.value) for tag in FormFieldKind])
14-
label = models.CharField(max_length=100)
15+
label = models.CharField(max_length=100)
1516
options = JSONField(null=True, blank=True, verbose_name="Dropdown Options")
1617
value = models.CharField(max_length=100, null=True, blank=True)
1718
form = models.ForeignKey("Form", on_delete=models.CASCADE)
1819

1920
class Meta:
2021
verbose_name = "Form Field"
2122
verbose_name_plural = "Form Fields"
23+
2224
def __str__(self):
2325
return f"{self.label} ({self.kind})"
2426

27+
2528
class Form(BaseModel):
2629
title = models.CharField(max_length=100)
2730
description = models.TextField(null=True, blank=True)
@@ -33,6 +36,7 @@ class Form(BaseModel):
3336
def __str__(self):
3437
return self.title
3538

39+
3640
class Submission(BaseModel):
3741
form = models.ForeignKey(Form, on_delete=models.CASCADE)
3842
submitted_by = models.ForeignKey(User, on_delete=models.CASCADE)
@@ -42,12 +46,11 @@ class Submission(BaseModel):
4246
def __str__(self):
4347
return f"{self.form.name} - {self.form_field.label} ({self.form_field.kind})"
4448

49+
4550
class Answer(BaseModel):
4651
form_field = models.ForeignKey(FormField, on_delete=models.CASCADE)
4752
answer = models.CharField(max_length=100)
4853
submission = models.ForeignKey(Submission, on_delete=models.CASCADE)
4954

5055
def __str__(self):
5156
return f"{self.submission.form.name} - {self.form_field.label} ({self.form_field.kind})"
52-
53-

course_api/typeform/serializers.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
from attr import field
22
from coreapi import Field
3-
from course_api.typeform.models import Form, FormField
3+
from course_api.typeform.models import Form, FormField, Submission
44
from rest_framework import serializers
55

6+
67
class FormSerializer(serializers.ModelSerializer):
78
class Meta:
89
model = Form
910
fields = ('id', 'title', 'description', 'is_public')
1011

12+
1113
class FieldSerializer(serializers.ModelSerializer):
1214
class Meta:
1315
model = FormField
1416
fields = ('id', 'label', 'kind', 'options', 'value')
17+
18+
19+
class SubmissionSerializer(serializers.ModelSerializer):
20+
class Meta:
21+
model = Submission
22+
fields = ('id', 'form', 'created_date')

0 commit comments

Comments
 (0)