from rest_framework import serializers from webapp.models import * class SignupSerializer(serializers.ModelSerializer): signupForm_id = serializers.PrimaryKeyRelatedField( source="signupForm", queryset=SignupForm.objects.all() ) answer = serializers.JSONField() 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.HyperlinkedModelSerializer): questions = serializers.JSONField() signups = serializers.SerializerMethodField() class Meta: model = SignupForm fields = ('id', 'title', 'visible', 'start_time', 'end_time', 'questions', 'schema', 'signups', 'quota') def get_signups(self, instance): names = instance.list_name.order_by('pk') return names class EventSerializer(serializers.ModelSerializer): signupForm = SignupFormSerializer( many=True, read_only=True, required=False, ) signup_id = serializers.PrimaryKeyRelatedField( many=True, source="signupForm", queryset=SignupForm.objects.all(), required=False ) tag_id = serializers.PrimaryKeyRelatedField( many=True, source="tags", queryset=Tag.objects.all() ) 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', 'signup_id', 'signupForm') depth = 1 def create(self, validated_data): signupForms = validated_data.pop('signupForm', []) tags = validated_data.pop('tags') 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('signupForm', []) instance = super(EventSerializer, self).update(instance, validated_data) instance.signupForm.clear() for form_data in signupForms: # form_qs = SignupForms.objects.filter(id=form['id']) instance.signupForm.add(form_data) return instance class SavedQuestionsSerializer(serializers.ModelSerializer): question = serializers.JSONField() class Meta: model = TemplateQuestion fields = ('id', 'name', 'question') 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 CommitteeSerializer(serializers.ModelSerializer): class Meta: model = Committee fields = ['name_fi', 'name_en'] class RoleSerializer(serializers.ModelSerializer): committee = CommitteeSerializer(read_only=True) class Meta: model = Role fields = ('name_fi', 'name_en', 'description_fi', 'description_en', 'committee', 'is_board') class ContactsSerializer(serializers.ModelSerializer): class Meta: model = Official fields = ('first_name', 'last_name', 'email', 'phone_number', 'image') depth = 2 class OccupationSerializer(serializers.ModelSerializer): role = RoleSerializer(read_only=True) officials = ContactsSerializer(many=True, read_only=True) class Meta: model = Occupation fields = ('role', 'start_date', 'end_date', 'officials')