from rest_framework import serializers from .models import StudyGroup, StudyGroupMembership from accounts.models import CustomUser from subjects.models import Subject from drf_extra_fields.geo_fields import PointField from landmarks.models import Landmark class StudyGroupSerializer(serializers.ModelSerializer): users = serializers.SlugRelatedField( queryset=CustomUser.objects.all(), many=True, slug_field='name', required=False, allow_null=True) subject = serializers.SlugRelatedField( many=False, slug_field='name', queryset=Subject.objects.all(), required=True, allow_null=False) location = PointField() landmark = serializers.SlugRelatedField( queryset=Landmark.objects.all(), many=False, slug_field='name', required=False, allow_null=True) def create(self, validated_data): user = self.context['request'].user study_group = StudyGroup.objects.create( users=[user], defaults=validated_data) validated_data['location'].read_only = True return study_group def update(self, instance, validated_data): # Check each landmark to see if our location is within it for landmark in Landmark.objects.all(): if landmark.location.contains(validated_data['location']): validated_data['landmark'] = landmark break return super().update(instance, validated_data) class Meta: model = StudyGroup fields = '__all__' read_only_fields = ['landmark'] class StudyGroupMembershipSerializer(serializers.ModelSerializer): user = serializers.CharField(source='accounts.CustomUser', read_only=True) subject = serializers.CharField( source='study_groups.StudyGroup', read_only=True) class Meta: model = StudyGroupMembership fields = '__all__'