Skip to content

Commit

Permalink
fix: fix a bug in AnswerSheetSerializer
Browse files Browse the repository at this point in the history
  • Loading branch information
AmooHashem committed Nov 14, 2024
1 parent 500bbf5 commit d920526
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 20 deletions.
3 changes: 2 additions & 1 deletion apps/fsm/models/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ class AnswerSheetType(models.TextChoices):
null=True,
blank=True,
)
# should be move to RegistrationReceipt:

# todo: should be move to RegistrationReceipt?:
form = models.ForeignKey(
Form,
related_name='answer_sheets',
Expand Down
10 changes: 4 additions & 6 deletions apps/fsm/serializers/answer_sheet_serializers.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from rest_framework import serializers
from rest_framework.exceptions import ParseError

from apps.accounts.models import User
from apps.accounts.serializers.user_serializer import AcademicStudentshipReadOnlySerializer, SchoolStudentshipReadOnlySerializer, UserRegistrationReceiptInfoSerializer
from apps.response.serializers.answer_sheet import AnswerSheetSerializer
from errors.error_codes import serialize_error
from apps.fsm.models import AnswerSheet, RegistrationReceipt


class RegistrationReceiptSerializer(AnswerSheetSerializer):
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
school_studentship = serializers.SerializerMethodField()
academic_studentship = serializers.SerializerMethodField()

Expand All @@ -19,16 +21,12 @@ def get_academic_studentship(self, obj):

def create(self, validated_data):
validated_data['answer_sheet_type'] = AnswerSheet.AnswerSheetType.RegistrationReceipt
registration_receipt = super().create(validated_data)
return registration_receipt
return super().create(validated_data)

def validate(self, attrs):
user = attrs.get('user')
# todo: complete it
if not user:
raise ParseError("registration receipt must have user")
form = attrs.get('form')
if len(RegistrationReceipt.objects.filter(form=form, user=user)) > 0:
if RegistrationReceipt.objects.filter(form=form, user=user).count() > 0:
raise ParseError(serialize_error('4028'))
return super().validate(attrs)

Expand Down
8 changes: 4 additions & 4 deletions apps/fsm/views/form_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from django.db import transaction

from apps.fsm.models.form import Form
from apps.fsm.serializers.answer_sheet_serializers import RegistrationReceiptSerializer
from apps.fsm.serializers.form_serializer import FormSerializer
from apps.response.serializers.answer_sheet import AnswerSheetSerializer


class FormViewSet(ModelViewSet):
Expand All @@ -21,12 +21,12 @@ def get_serializer_context(self):
context['user'] = self.request.user
return context

@swagger_auto_schema(responses={201: RegistrationReceiptSerializer})
@swagger_auto_schema(responses={201: AnswerSheetSerializer})
@transaction.atomic
@action(detail=True, methods=['post'], serializer_class=RegistrationReceiptSerializer)
@action(detail=True, methods=['post'])
def submit(self, request, pk=None):
form = self.get_object()
serializer = RegistrationReceiptSerializer(data={
serializer = AnswerSheetSerializer(data={
'user': request.user.id,
'form': form,
**request.data,
Expand Down
3 changes: 2 additions & 1 deletion apps/fsm/views/registration_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def my_invitations(self, request, pk=None):

@swagger_auto_schema(responses={201: RegistrationReceiptSerializer})
@transaction.atomic
@action(detail=True, methods=['post'], serializer_class=RegistrationReceiptSerializer)
@action(detail=True, methods=['post'])
def register(self, request, pk=None):
registration_form = self.get_object()

Expand All @@ -72,6 +72,7 @@ def register(self, request, pk=None):
})
serializer.is_valid(raise_exception=True)
registration_receipt = serializer.save()

registration_receipt.register_in_form(registration_form)

return Response(serializer.data, status=status.HTTP_201_CREATED)
20 changes: 12 additions & 8 deletions apps/response/serializers/answer_sheet.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@
from rest_framework.exceptions import ParseError

from apps.accounts.models import User
from apps.fsm.models.form import Form
from errors.error_codes import serialize_error
from apps.fsm.models import AnswerSheet, Problem
from apps.response.serializers.answers.answer_polymorphic_serializer import AnswerPolymorphicSerializer


class AnswerSheetSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
user = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(), allow_null=True)
form = serializers.PrimaryKeyRelatedField(
queryset=Form.objects.all())

def create(self, validated_data):
answers = self.initial_data.get('answers', [])
Expand All @@ -25,12 +29,12 @@ def create(self, validated_data):
return answer_sheet

def validate(self, attrs):
answers = self.initial_data.get('answers', [])
problems = [answer.get('problem', None) for answer in answers]
paper = self.context.get('form', None)
if paper is not None:
for widget in paper.widgets.all():
if isinstance(widget, Problem) and widget.is_required and widget.id not in problems:
form = attrs.get('form', None)
if form is not None:
answers = self.initial_data.get('answers', [])
answers_problems = [answer.get('problem', None) for answer in answers]
for widget in form.widgets.all():
if isinstance(widget, Problem) and widget.is_required and widget.id not in answers_problems:
raise ParseError(serialize_error(
'4029', {'problem': widget}))
return attrs
Expand All @@ -45,5 +49,5 @@ def to_representation(self, instance):

class Meta:
model = AnswerSheet
fields = ['id', 'answer_sheet_type', 'user']
fields = ['id', 'answer_sheet_type', 'user', 'form']
read_only_fields = ['id', 'answer_sheet_type']

0 comments on commit d920526

Please sign in to comment.