Files
web2.0-backend/webapp/serializers.py
T
2021-08-24 02:50:46 +03:00

148 lines
4.8 KiB
Python

from rest_framework import serializers
from webapp.models import *
class SignupSerializer(serializers.ModelSerializer):
signupForm_id = serializers.PrimaryKeyRelatedField(
source="signupForm",
queryset=SignupForm.objects.all()
)
list_name = serializers.CharField(read_only=True)
def add_extra_fields(self, validated_data):
questions = validated_data["signupForm"].questions
name_ids = list(filter(lambda x: x["type"] == "name", questions))
email_ids = list(filter(lambda x: x["type"] == "email", questions))
# Send email to first email field in the form
if (len(email_ids) > 0):
id = email_ids[0]["id"]
email_value = validated_data["answer"].get(id)
validated_data["email"] = email_value
# Combine all name fields to list_name
if (len(name_ids) > 0):
# name_value = validated_data["answer"].get(name_fields[0]["id"], None)
all_names = map(lambda x: validated_data["answer"].get(x["id"]), name_ids)
validated_data["list_name"] = " ".join(all_names)
def create(self, validated_data):
self.add_extra_fields(validated_data)
return super().create(validated_data)
def update(self, instance, validated_data):
self.add_extra_fields(validated_data)
return super().update(instance, validated_data)
class Meta:
model = Signup
fields = ('id', 'signupForm_id', 'answer', 'list_name')
extra_kwargs = {
'url': {
'view_name': 'signup-detail',
}
}
class SignupFormSerializer(serializers.ModelSerializer):
signups = serializers.SlugRelatedField(
slug_field="list_name",
many=True,
read_only=True,
required=False,
)
class Meta:
model = SignupForm
fields = ('id', 'title_fi', 'title_en', 'visible', 'isOpen', 'start_time', 'end_time', 'email_content', 'questions', 'schema', 'signups', 'quota')
class EventSerializer(serializers.ModelSerializer):
signupForm = SignupFormSerializer(
source='filtered_signup_forms',
many=True,
read_only=True,
)
signup_id = serializers.PrimaryKeyRelatedField(
queryset=SignupForm.objects.all(),
many=True,
write_only=True,
)
tag_id = serializers.PrimaryKeyRelatedField(
queryset=Tag.objects.all(),
many=True,
write_only=True,
)
class Meta:
model = Event
fields = ('id', 'tag_id', 'tags', 'visible', 'image', 'title_fi', 'title_en', 'description_fi', 'description_en',
'content_fi', 'content_en', 'start_time', 'end_time', 'location_fi', 'location_en', 'signup_id', 'signupForm')
read_only_fields = ['tags', 'signupForm']
depth = 1
def create(self, validated_data):
signupForms = validated_data.pop('signup_id', [])
tags = validated_data.pop('tag_id')
event = Event.objects.create(**validated_data)
for form in signupForms:
event.signupForm.add(form)
for tag in tags:
event.tags.add(tag)
event.save()
return event
def update(self, instance, validated_data):
signupForms = validated_data.pop('signup_id', [])
tags = validated_data.pop('tag_id')
instance.signupForm.clear()
instance.tags.clear()
for form in signupForms:
instance.signupForm.add(form)
for tag in tags:
instance.tags.add(tag)
instance = super(EventSerializer, self).update(instance, validated_data)
return instance
class SavedQuestionsSerializer(serializers.ModelSerializer):
questions = serializers.JSONField()
class Meta:
model = TemplateQuestion
fields = ('id', 'name', 'questions')
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('id', 'slug', 'name_fi', 'name_en', 'icon')
class FeedSerializer(serializers.ModelSerializer):
tag_id = serializers.PrimaryKeyRelatedField(
many=True,
source="tags",
queryset=Tag.objects.all()
)
class Meta:
model = Feed
fields = ('id', 'tags', 'tag_id', 'visible', 'image', 'title_fi', 'title_en', 'description_fi', 'description_en',
'content_fi', 'content_en', 'publish_time', 'autohide', 'autohide_enabled')
depth = 1
def create(self, validated_data):
tags_data = validated_data.pop('tags')
feed = Feed.objects.create(**validated_data)
for tag in tags_data:
feed.tags.add(tag)
feed.save()
return feed
class JobAdSerializer(serializers.ModelSerializer):
class Meta:
model = JobAd
fields = ('id', 'title_fi', 'title_en', 'description_fi', 'description_en', 'content_fi', 'content_en', 'visible', 'autohide_at', 'autohide_enabled')