You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mvapi/election/serializers.py

116 lines
3.3 KiB

from django.utils.text import slugify
from rest_framework import serializers
from election.models import Election, Vote, Token
from django.conf import settings
class ElectionCreateSerializer(serializers.ModelSerializer):
elector_emails = serializers.ListField(
child=serializers.EmailField(),
write_only=True,
required=False,
)
def create(self, data):
# Copy the validated_data
validated_data = dict(data)
validated_data["on_invitation_only"] = False
if "elector_emails" in validated_data:
if validated_data["elector_emails"] != []:
validated_data["on_invitation_only"] = True
validated_data.pop("elector_emails")
return Election.objects.create(**validated_data)
class Meta:
model = Election
fields = (
'title',
'candidates',
'on_invitation_only',
'num_grades',
'elector_emails',
'start_at',
'finish_at',
'select_language',
'restrict_results',
'send_mail',
)
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["slug"] = slugify(instance.title)
ret["id"] = instance.id
ret["tokens"] = [token.id for token in Token.objects.filter(election=instance)]
return ret
class ElectionViewSerializer(serializers.ModelSerializer):
class Meta:
model = Election
fields = '__all__'
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["slug"] = slugify(instance.title)
ret["id"] = instance.id
return ret
class VoteSerializer(serializers.ModelSerializer):
grades_by_candidate = serializers.ListField(
child=serializers.IntegerField(
min_value=0,
max_value=settings.MAX_NUM_GRADES - 1,
)
)
token = serializers.CharField(write_only=True, required=False)
def create(self, validated_data):
# Copy the validated_data
validated_data = dict(validated_data)
try:
validated_data.pop("token")
except KeyError:
pass
return Vote.objects.create(**validated_data)
class Meta:
model = Vote
fields = (
'grades_by_candidate',
'election',
'token',
)
# See https://github.com/MieuxVoter/mvapi/pull/5#discussion_r291891403 for explanations
class Candidate:
def __init__(self, name, idx, profile, grade):
self.name = name
self.id = idx
self.profile = profile
self.grade = grade
class CandidateSerializer(serializers.Serializer):
name = serializers.CharField()
id = serializers.IntegerField(min_value=0)
profile = serializers.DictField(child=serializers.IntegerField())
grade = serializers.IntegerField(min_value=0, max_value=settings.MAX_NUM_GRADES)
class LinkSerializer(serializers.Serializer):
election_id=serializers.CharField()
select_language = serializers.CharField(max_length=2,required=False)
emails = serializers.ListField(
child=serializers.EmailField(),
write_only=True,
required=True
)