src/notes/api/serializers/core.py
changeset 131 adad5563603c
parent 119 8ff8e2aee0f9
child 133 6f3078f7fd47
equal deleted inserted replaced
130:78246db1cbac 131:adad5563603c
     1 """
     1 """
     2 Serializers for model core classes
     2 Serializers for model core classes
     3 """
     3 """
     4 import logging
     4 import logging
     5 
     5 
       
     6 from django.contrib.auth.models import Group
       
     7 from rest_framework import serializers
       
     8 
     6 from notes.models import Note, Session
     9 from notes.models import Note, Session
     7 from rest_framework import serializers
       
     8 
    10 
     9 logger = logging.getLogger(__name__)
    11 logger = logging.getLogger(__name__)
    10 
    12 
    11 
    13 
    12 class DetailNoteSerializer(serializers.ModelSerializer):
    14 class DetailNoteSerializer(serializers.ModelSerializer):
    85 
    87 
    86 class ListSessionSerializer(serializers.ModelSerializer):
    88 class ListSessionSerializer(serializers.ModelSerializer):
    87 
    89 
    88     owner = serializers.SlugRelatedField(
    90     owner = serializers.SlugRelatedField(
    89         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
    91         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
       
    92     group = serializers.SlugRelatedField(read_only=True, slug_field='name')
    90 
    93 
    91     class Meta:
    94     class Meta:
    92         model = Session
    95         model = Session
    93         fields = (
    96         fields = (
    94             'ext_id', 'version', 'date', 'created', 'updated',
    97             'ext_id', 'version', 'date', 'created', 'updated',
    95             'owner', 'title', 'description', 'protocol'
    98             'owner', 'title', 'description', 'protocol', 'group'
    96         )
    99         )
    97         read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner')
   100         read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner', 'group')
    98 
   101 
    99 
   102 
   100 class DetailSessionSerializer(serializers.ModelSerializer):
   103 class DetailSessionSerializer(serializers.ModelSerializer):
   101 
   104 
   102     owner = serializers.SlugRelatedField(read_only=True, slug_field='username')
   105     owner = serializers.SlugRelatedField(read_only=True, slug_field='username')
   103     notes = DetailNoteSerializer(many=True, read_only=True)
   106     notes = DetailNoteSerializer(many=True, read_only=True)
       
   107     group = serializers.SlugRelatedField(slug_field='name', read_only=True)
   104 
   108 
   105     class Meta:
   109     class Meta:
   106         model = Session
   110         model = Session
   107         fields = (
   111         fields = (
   108             'ext_id', 'version', 'date', 'created', 'updated',
   112             'ext_id', 'version', 'date', 'created', 'updated',
   109             'owner', 'title', 'description', 'protocol',
   113             'owner', 'title', 'description', 'protocol', 'group',
   110             'notes'
   114             'notes'
   111         )
   115         )
   112         read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner')
   116         read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner', 'group')
   113 
   117 
   114 class CreateSessionSerializer(serializers.ModelSerializer):
   118 class CreateSessionSerializer(serializers.ModelSerializer):
   115 
   119 
   116     owner = serializers.SlugRelatedField(
   120     owner = serializers.SlugRelatedField(
   117         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
   121         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
   118 
   122     group = serializers.SlugRelatedField(slug_field='name', queryset=Group.objects.all(), required=False)
   119 
   123 
   120     class Meta:
   124     class Meta:
   121         model = Session
   125         model = Session
   122         fields = (
   126         fields = (
   123             'ext_id', 'version', 'date', 'created', 'updated',
   127             'ext_id', 'version', 'date', 'created', 'updated',
   124             'owner', 'title', 'description', 'protocol'
   128             'owner', 'title', 'description', 'protocol', 'group'
   125         )
   129         )
   126         read_only_fields = ('version', 'created', 'updated', 'owner')
   130         read_only_fields = ('version', 'created', 'updated', 'owner')
       
   131 
       
   132     def validate(self, data):
       
   133         data = super().validate(data)
       
   134 
       
   135         group = data.get('group')
       
   136         owner = data.get('owner')
       
   137 
       
   138         if group is None:
       
   139             if owner and owner.profile and owner.profile.default_group:
       
   140                 group = owner.profile.default_group
       
   141             if group is None and owner:
       
   142                 group = Group.objects.filter(profile__owner_personal=owner).first()
       
   143 
       
   144         if group is None:
       
   145             raise serializers.ValidationError("group field is required or default group or personal group could not be found for owner")
       
   146         elif not owner in group.user_set.all():
       
   147             raise serializers.ValidationError("Owner must be in group")
       
   148 
       
   149         data['group'] = group
       
   150         return data
       
   151