Source code for voting.serializers
from rest_framework import serializers
from .models import Question, QuestionOption, QuestionOptionRanked, Voting, QuestionOptionYesNo
from base.serializers import KeySerializer, AuthSerializer
[docs]class QuestionOptionSerializer(serializers.HyperlinkedModelSerializer):
    """
    Serializer for QuestionOption model.
    Provides serialization for QuestionOption objects with hyperlinked relationships.
    Attributes:
        Meta: Meta class with model and field specifications.
    """
 
[docs]class QuestionOptionRankedSerializer(serializers.HyperlinkedModelSerializer):
    """
    Serializer for QuestionOptionRanked model.
    Provides serialization for QuestionOptionRanked objects with hyperlinked relationships.
    Attributes:
        Meta: Meta class with model and field specifications.
    """
 
[docs]class QuestionOptionYesNoSerializer(serializers.HyperlinkedModelSerializer):
    """
    Serializer for QuestionOptionYesNo model.
    Provides serialization for QuestionOptionYesNo objects with hyperlinked relationships.
    Attributes:
        Meta: Meta class with model and field specifications.
    """
 
[docs]class QuestionSerializer(serializers.HyperlinkedModelSerializer):
    """
    Serializer for Question model.
    Provides serialization for Question objects with hyperlinked relationships. Includes a custom method for serializing related options based on the question type.
    Attributes:
        options (SerializerMethodField): Field to serialize related options.
        Meta: Meta class with model and field specifications.
    """
    options = serializers.SerializerMethodField()
[docs]    def get_options(self, instance):
        """
        Custom method to serialize related options based on the question type.
        :param instance: The Question instance being serialized.
        :type instance: Question
        :return: Serialized data of related options.
        :rtype: dict or None
        """
        if instance.type == 'C':
            serializer = QuestionOptionSerializer(
                instance.options.all(), many=True).data
        elif instance.type == 'R':
            serializer = QuestionOptionRankedSerializer(
                instance.ranked_options.all(), many=True).data
        elif instance.type == 'Y':
            serializer = QuestionOptionYesNoSerializer(
                instance.yesno_options.all(), many=True).data
        elif instance.type == 'M':
            serializer = QuestionOptionSerializer(
                instance.options.all(), many=True).data
        elif instance.type == 'T':
            serializer = None
        return serializer 
 
[docs]class VotingSerializer(serializers.HyperlinkedModelSerializer):
    """
    Serializer for Voting model.
    Provides serialization for Voting objects with hyperlinked relationships and nested serialization for related objects.
    Attributes:
        question (QuestionSerializer): Nested serializer for the related question.
        pub_key (KeySerializer): Nested serializer for the related public key.
        auths (AuthSerializer): Nested serializer for related authorizations.
        Meta: Meta class with model and field specifications.
    """
    question = QuestionSerializer(many=False)
    pub_key = KeySerializer()
    auths = AuthSerializer(many=True)
 
[docs]class SimpleVotingSerializer(serializers.HyperlinkedModelSerializer):
    """
    Simplified serializer for Voting model.
    Provides a simpler serialization for Voting objects focusing on key details.
    Attributes:
        question (QuestionSerializer): Nested serializer for the related question.
        Meta: Meta class with model and field specifications.
    """
    question = QuestionSerializer(many=False)