mirror of https://github.com/MieuxVoter/mvapi
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.
116 lines
3.3 KiB
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
|
|
)
|