Skip to content
Snippets Groups Projects
serializers.py 15.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.core.exceptions import ObjectDoesNotExist
    
    from django.contrib.auth.models import User, Group
    
    from rest_framework import serializers, status
    from rest_framework.response import Response
    
    from program.models import Show, Schedule, TimeSlot, Category, RTRCategory, Host, Language, Topic, MusicFocus, Note, Type, Language, RRule
    
    from profile.serializers import ProfileSerializer
    
    from datetime import datetime
    
    
    class UserSerializer(serializers.ModelSerializer):
        # Add profile fields to JSON
        profile = ProfileSerializer()
    
        class Meta:
            model = User
    
            fields = '__all__'
    
    
        def create(self, validated_data):
            """
            Create and return a new User instance, given the validated data.
            """
    
            profile_data = validated_data.pop('profile')
    
            user = super(UserSerializer, self).create(validated_data)
            user.date_joined = datetime.today()
            user.set_password(validated_data['password'])
            user.save()
    
    
            profile = Profile(user=user, cba_username=profile_data.get('cba_username').strip(), cba_user_token=profile_data.get('cba_user_token').strip())
    
            profile.save()
    
            return user
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing User instance, given the validated data.
            """
    
    
            user = self.context['user']
    
    
            instance.first_name = validated_data.get('first_name', instance.first_name)
            instance.last_name = validated_data.get('last_name', instance.last_name)
            instance.email = validated_data.get('email', instance.email)
    
    
            if user.is_superuser:
                instance.groups = validated_data.get('groups', instance.groups)
                instance.user_permissions = validated_data.get('user_permissions', instance.user_permissions)
                instance.is_active = validated_data.get('is_active', instance.is_active)
                instance.is_staff = validated_data.get('is_staff', instance.is_staff)
                instance.is_superuser = validated_data.get('is_superuser', instance.is_superuser)
    
    
            # TODO: How to hook into this from ProfileSerializer without having to call it here?
    
            try:
                profile = Profile.objects.get(user=instance.id)
            except ObjectDoesNotExist:
                profile = Profile.objects.create(user=instance, **validated_data['profile'])
    
    
            profile.cba_username = validated_data['profile'].get('cba_username')
            profile.cba_user_token = validated_data['profile'].get('cba_user_token')
            profile.save()
    
            instance.save()
            return instance
    
    
    
    class CategorySerializer(serializers.ModelSerializer):
        class Meta:
            model = Category
            fields = '__all__'
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing Category instance, given the validated data.
            """
            instance.category = validated_data.get('category', instance.category)
            instance.abbrev = validated_data.get('abbrev', instance.abbrev)
            instance.slug = validated_data.get('slug', instance.slug)
            instance.color = validated_data.get('color', instance.color)
            instance.description = validated_data.get('description', instance.description)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
    
            instance.save()
            return instance
    
    
    
    class HostSerializer(serializers.ModelSerializer):
        class Meta:
            model = Host
            fields = '__all__'
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing Host instance, given the validated data.
            """
    
            instance.name = validated_data.get('name', instance.name)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
            instance.email = validated_data.get('email', instance.email)
            instance.website = validated_data.get('website', instance.website)
            instance.biography = validated_data.get('biography', instance.biography)
            instance.googleplus_url = validated_data.get('googleplus_url', instance.googleplus_url)
            instance.facebook_url = validated_data.get('facebook_url', instance.facebook_url)
            instance.twitter_url = validated_data.get('twitter_url', instance.twitter_url)
            instance.linkedin_url = validated_data.get('linkedin_url', instance.linkedin_url)
            instance.youtube_url = validated_data.get('youtube_url', instance.youtube_url)
            instance.dorftv_url = validated_data.get('dorftv_url', instance.dorftv_url)
            instance.cba_url = validated_data.get('cba_url', instance.cba_url)
            instance.image = validated_data.get('image', instance.image)
    
            instance.save()
            return instance
    
    
    
    class LanguageSerializer(serializers.ModelSerializer):
        class Meta:
            model = Language
            fields = '__all__'
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing Language instance, given the validated data.
            """
            instance.name = validated_data.get('name', instance.name)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
    
            instance.save()
            return instance
    
    
    
    class TopicSerializer(serializers.ModelSerializer):
        class Meta:
            model = Topic
            fields = '__all__'
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing Topic instance, given the validated data.
            """
            instance.topic = validated_data.get('topic', instance.topic)
            instance.abbrev = validated_data.get('abbrev', instance.abbrev)
            instance.slug = validated_data.get('slug', instance.slug)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
    
            instance.save()
            return instance
    
    
    
    class MusicFocusSerializer(serializers.ModelSerializer):
        class Meta:
            model = MusicFocus
            fields = '__all__'
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing MusicFocus instance, given the validated data.
            """
            instance.focus = validated_data.get('focus', instance.focus)
            instance.abbrev = validated_data.get('abbrev', instance.abbrev)
            instance.slug = validated_data.get('slug', instance.slug)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
    
            instance.save()
            return instance
    
    
    
    class TypeSerializer(serializers.ModelSerializer):
        class Meta:
            model = Type
            fields = '__all__'
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing Type instance, given the validated data.
            """
            instance.type = validated_data.get('type', instance.type)
            instance.slug = validated_data.get('slug', instance.slug)
            instance.color = validated_data.get('color', instance.color)
            instance.text_color = validated_data.get('text_color', instance.text_color)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
    
            instance.save()
            return instance
    
    
    
    class RTRCategorySerializer(serializers.ModelSerializer):
        class Meta:
            model = RTRCategory
            fields = '__all__'
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing RTRCategory instance, given the validated data.
            """
            instance.rtrcategory = validated_data.get('rtrcategory', instance.rtrcategory)
            instance.abbrev = validated_data.get('abbrev', instance.abbrev)
            instance.slug = validated_data.get('slug', instance.slug)
    
            instance.is_active = validated_data.get('is_active', instance.is_active)
    
    
            instance.save()
            return instance
    
    
    
    class ShowSerializer(serializers.HyperlinkedModelSerializer):
    
        owners = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),many=True)
        category = serializers.PrimaryKeyRelatedField(queryset=Category.objects.all(),many=True)
        hosts = serializers.PrimaryKeyRelatedField(queryset=Host.objects.all(),many=True)
        language = serializers.PrimaryKeyRelatedField(queryset=Language.objects.all(),many=True)
        topic = serializers.PrimaryKeyRelatedField(queryset=Topic.objects.all(),many=True)
        musicfocus = serializers.PrimaryKeyRelatedField(queryset=MusicFocus.objects.all(),many=True)
        type = serializers.PrimaryKeyRelatedField(queryset=Type.objects.all())
        rtrcategory = serializers.PrimaryKeyRelatedField(queryset=RTRCategory.objects.all())
    
    
        class Meta:
            model = Show
            fields = ('id', 'name', 'slug', 'image', 'logo', 'short_description', 'description',
    
                      'email', 'website', 'created', 'last_updated', 'type', 'rtrcategory',
    
                      'predecessor_id', 'cba_series_id', 'fallback_id', 'category', 'hosts',
    
                      'owners', 'language', 'topic', 'musicfocus')
    
    
    
        def create(self, validated_data):
            """
            Create and return a new Show instance, given the validated data.
            """
    
            owners = validated_data.pop('owners')
            category = validated_data.pop('category')
            hosts = validated_data.pop('hosts')
            language = validated_data.pop('language')
            topic = validated_data.pop('topic')
            musicfocus = validated_data.pop('musicfocus')
    
            show = Show.objects.create(**validated_data)
    
            # Save many-to-many relationships
            show.owners = owners
            show.category = category
            show.hosts = hosts
            show.language = language
            show.topic = topic
            show.musicfocus = musicfocus
    
            show.save()
            return show
    
    
    
        def update(self, instance, validated_data):
            """
            Update and return an existing Show instance, given the validated data.
            """
    
    
            user = self.context['user']
    
    
            instance.name = validated_data.get('name', instance.name)
            instance.slug = validated_data.get('slug', instance.slug)
            instance.image = validated_data.get('image', instance.image)
            instance.logo = validated_data.get('logo', instance.logo)
            instance.short_description = validated_data.get('short_description', instance.short_description)
            instance.description = validated_data.get('description', instance.description)
            instance.email = validated_data.get('email', instance.email)
            instance.website = validated_data.get('website', instance.website)
    
            instance.predecessor_id = validated_data.get('predecessor_id', instance.predecessor_id)
    
            instance.cba_series_id = validated_data.get('cba_series_id', instance.cba_series_id)
    
            instance.fallback_id = validated_data.get('fallback_id', instance.fallback_id)
    
            # Only superusers may update the following fields
            if user.is_superuser:
                instance.owners = validated_data.get('owners', instance.owners)
                instance.category = validated_data.get('category', instance.category)
                instance.hosts = validated_data.get('hosts', instance.hosts)
                instance.language = validated_data.get('language', instance.language)
                instance.topic = validated_data.get('topic', instance.topic)
                instance.musicfocus = validated_data.get('musicfocus', instance.musicfocus)
                instance.type = validated_data.get('type', instance.type)
                instance.rtrcategory = validated_data.get('rtrcategory', instance.rtrcategory)
    
    
    class ScheduleSerializer(serializers.ModelSerializer):
    
        rrule = serializers.PrimaryKeyRelatedField(queryset=RRule.objects.all())
        show = serializers.PrimaryKeyRelatedField(queryset=Show.objects.all())
    
    
        class Meta:
            model = Schedule
            fields = '__all__'
    
        def create(self, validated_data):
    
            """Create and return a new Schedule instance, given the validated data."""
    
            rrule = validated_data.pop('rrule')
            show = validated_data.pop('show')
    
            schedule = Schedule.objects.create(**validated_data)
            schedule.rrule = rrule
            schedule.show = show
    
            schedule.save()
            return schedule
    
    
    
        def update(self, instance, validated_data):
    
            """Update and return an existing Schedule instance, given the validated data."""
    
            instance.byweekday = validated_data.get('byweekday', instance.byweekday)
            instance.dstart = validated_data.get('dstart', instance.dstart)
            instance.tstart = validated_data.get('tstart', instance.tstart)
            instance.tend = validated_data.get('tend', instance.tend)
            instance.until = validated_data.get('until', instance.until)
            instance.is_repetition = validated_data.get('is_repetition', instance.is_repetition)
    
            instance.fallback_id = validated_data.get('fallback_id', instance.fallback_id)
    
            instance.automation_id = validated_data.get('automation_id', instance.automation_id)
            instance.rrule = validated_data.get('rrule', instance.rrule)
            instance.show = validated_data.get('show', instance.show)
    
            instance.save()
    
    class TimeSlotSerializer(serializers.ModelSerializer):
    
        show = serializers.PrimaryKeyRelatedField(queryset=Show.objects.all())
        schedule = serializers.PrimaryKeyRelatedField(queryset=Schedule.objects.all())
    
    
        class Meta:
            model = TimeSlot
            fields = '__all__'
    
        def create(self, validated_data):
    
            """Create and return a new TimeSlot instance, given the validated data."""
    
            return TimeSlot.objects.create(**validated_data)
    
    
        def update(self, instance, validated_data):
    
            """Update and return an existing Show instance, given the validated data."""
    
            # Only save certain fields
    
            instance.memo = validated_data.get('memo', instance.memo)
            instance.is_repetition = validated_data.get('is_repetition', instance.is_repetition)
            instance.playlist_id = validated_data.get('playlist_id', instance.playlist_id)
            instance.save()
            return instance
    
    
    class NoteSerializer(serializers.ModelSerializer):
    
        show = serializers.PrimaryKeyRelatedField(queryset=Show.objects.all())
        timeslot = serializers.PrimaryKeyRelatedField(queryset=TimeSlot.objects.all())
    
        host = serializers.PrimaryKeyRelatedField(queryset=Host.objects.all())
    
            """Create and return a new Note instance, given the validated data."""
    
            # Save the creator
            validated_data['user_id'] = self.context['user_id']
    
            # Try to retrieve audio URL from CBA
            validated_data['audio_url'] = Note.get_audio_url(validated_data['cba_id'])
    
    
            return Note.objects.create(**validated_data)
    
    
        def update(self, instance, validated_data):
    
            """Update and return an existing Note instance, given the validated data."""
    
            instance.show = validated_data.get('show', instance.show)
            instance.timeslot = validated_data.get('timeslot', instance.timeslot)
    
            instance.title = validated_data.get('title', instance.title)
            instance.slug = validated_data.get('slug', instance.slug)
            instance.summary = validated_data.get('summary', instance.summary)
            instance.content = validated_data.get('content', instance.content)
            instance.image = validated_data.get('image', instance.image)
            instance.status = validated_data.get('status', instance.status)
    
            instance.host = validated_data.get('host', instance.host)
    
            instance.cba_id = validated_data.get('cba_id', instance.cba_id)
    
            instance.audio_url = Note.get_audio_url(instance.cba_id)