src/notes/api/serializers/core.py
changeset 142 56850f5c73f6
parent 133 6f3078f7fd47
equal deleted inserted replaced
141:cd5e8fb64b74 142:56850f5c73f6
     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
     6 from django.contrib.auth.models import Group
       
     7 from django.db import transaction
       
     8 from notes.api.fields.category import ProtocolField
       
     9 from notes import constants
       
    10 from notes.models import Note, Session
       
    11 from protocols.models import Protocol
     7 from rest_framework import serializers
    12 from rest_framework import serializers
     8 
       
     9 from notes.api.fields.category import ProtocolField
       
    10 from notes.models import Note, Session
       
    11 
    13 
    12 logger = logging.getLogger(__name__)
    14 logger = logging.getLogger(__name__)
    13 
    15 
    14 
    16 
    15 class DetailNoteSerializer(serializers.ModelSerializer):
    17 class DetailNoteSerializer(serializers.ModelSerializer):
    89 class ListSessionSerializer(serializers.ModelSerializer):
    91 class ListSessionSerializer(serializers.ModelSerializer):
    90 
    92 
    91     owner = serializers.SlugRelatedField(
    93     owner = serializers.SlugRelatedField(
    92         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
    94         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
    93     group = serializers.SlugRelatedField(read_only=True, slug_field='name')
    95     group = serializers.SlugRelatedField(read_only=True, slug_field='name')
    94     protocol = ProtocolField(required=False)
    96     protocol = ProtocolField(required=False, read_only=True)
    95 
    97 
    96     class Meta:
    98     class Meta:
    97         model = Session
    99         model = Session
    98         fields = (
   100         fields = (
    99             'ext_id', 'version', 'date', 'created', 'updated',
   101             'ext_id', 'version', 'date', 'created', 'updated',
   105 class DetailSessionSerializer(serializers.ModelSerializer):
   107 class DetailSessionSerializer(serializers.ModelSerializer):
   106 
   108 
   107     owner = serializers.SlugRelatedField(read_only=True, slug_field='username')
   109     owner = serializers.SlugRelatedField(read_only=True, slug_field='username')
   108     notes = DetailNoteSerializer(many=True, read_only=True)
   110     notes = DetailNoteSerializer(many=True, read_only=True)
   109     group = serializers.SlugRelatedField(slug_field='name', read_only=True)
   111     group = serializers.SlugRelatedField(slug_field='name', read_only=True)
   110     protocol = ProtocolField(required=False)
   112     protocol = ProtocolField(required=False, read_only=True)
   111 
   113 
   112     class Meta:
   114     class Meta:
   113         model = Session
   115         model = Session
   114         fields = (
   116         fields = (
   115             'ext_id', 'version', 'date', 'created', 'updated',
   117             'ext_id', 'version', 'date', 'created', 'updated',
   116             'owner', 'title', 'description', 'protocol', 'group',
   118             'owner', 'title', 'description', 'protocol', 'group',
   117             'notes'
   119             'notes'
   118         )
   120         )
   119         read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner', 'group', 'protocol')
   121         read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner', 'group', 'protocol')
   120 
   122 
   121 class CreateSessionSerializer(serializers.ModelSerializer):
   123 class BaseSessionSerializer(serializers.ModelSerializer):
   122 
   124 
   123     owner = serializers.SlugRelatedField(
   125     owner = serializers.SlugRelatedField(
   124         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
   126         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
   125     group = serializers.SlugRelatedField(slug_field='name', queryset=Group.objects.all(), required=False, allow_null=True)
   127     group = serializers.SlugRelatedField(slug_field='name', queryset=Group.objects.all(), required=False, allow_null=True)
   126     protocol = ProtocolField(required=False)
   128 
   127 
   129     @transaction.atomic()
   128     class Meta:
   130     def save(self,**kwargs):
   129         model = Session
   131         return super().save(**kwargs)
   130         fields = (
   132 
   131             'ext_id', 'version', 'date', 'created', 'updated',
   133     def create(self, validated_data):
   132             'owner', 'title', 'description', 'protocol', 'group'
   134         return super().create(validated_data)
   133         )
   135 
   134         read_only_fields = ('version', 'created', 'updated', 'owner')
   136     def update(self, instance, validated_data):
       
   137         return super().update(instance, validated_data)
   135 
   138 
   136     def validate(self, data):
   139     def validate(self, data):
   137         data = super().validate(data)
   140         data = super().validate(data)
   138 
   141 
   139         group = data.get('group')
   142         group = data.get('group')
   140         owner = data.get('owner')
   143         owner = data.get('owner')
   141 
   144 
       
   145         if owner is None:
       
   146             owner = self.fields['owner'].get_default()
       
   147 
   142         if group is None:
   148         if group is None:
   143             if owner and owner.profile and owner.profile.default_group:
   149             if owner.profile and owner.profile.default_group:
   144                 group = owner.profile.default_group
   150                 group = owner.profile.default_group
   145             if group is None and owner:
   151             if group is None and owner:
   146                 group = Group.objects.filter(profile__owner_personal=owner).first()
   152                 group = Group.objects.filter(profile__owner_personal=owner).first()
   147 
   153 
   148         if group is None:
   154         if group is None:
   149             raise serializers.ValidationError("group field is required or default group or personal group could not be found for owner")
   155             raise serializers.ValidationError("group field is required or default group or personal group could not be found for owner")
   150         elif not owner in group.user_set.all():
   156         elif not owner in group.user_set.all():
   151             raise serializers.ValidationError("Owner must be in group")
   157             raise serializers.ValidationError("Owner must be in group")
   152 
   158 
       
   159         # Be careful: we update the data in the "validate". This is a side effect.
   153         data['group'] = group
   160         data['group'] = group
       
   161         data['owner'] = owner
       
   162 
       
   163         protocol = data.get('protocol')
       
   164         if protocol is None:
       
   165             data['protocol'] = group.profile.protocol
       
   166         elif isinstance(protocol, dict) and 'owner' not in protocol:
       
   167             data['protocol']['owner'] = group.name
       
   168 
   154         return data
   169         return data
       
   170 
       
   171 class UpdateSessionSerializer(BaseSessionSerializer):
       
   172 
       
   173     protocol = ProtocolField(required=False, allow_null=True, read_only=True)
       
   174 
       
   175     class Meta:
       
   176         model = Session
       
   177         fields = (
       
   178             'ext_id', 'version', 'date', 'created', 'updated',
       
   179             'owner', 'title', 'description', 'protocol', 'group'
       
   180         )
       
   181         read_only_fields = ('ext_id', 'protocol', 'version', 'created', 'updated', 'owner')
       
   182 
       
   183     @transaction.atomic()
       
   184     def save(self,**kwargs):
       
   185         return super().save(**kwargs)
       
   186 
       
   187 class CreateSessionSerializer(BaseSessionSerializer):
       
   188 
       
   189     protocol = ProtocolField(required=False, allow_null=True)
       
   190 
       
   191     class Meta:
       
   192         model = Session
       
   193         fields = (
       
   194             'ext_id', 'version', 'date', 'created', 'updated',
       
   195             'owner', 'title', 'description', 'protocol', 'group'
       
   196         )
       
   197         read_only_fields = ('version', 'created', 'updated', 'owner')
       
   198 
       
   199     @transaction.atomic()
       
   200     def save(self,**kwargs):
       
   201         return super().save(**kwargs)
       
   202 
       
   203     def create(self, validated_data):
       
   204         protocol = validated_data.pop('protocol')
       
   205 
       
   206         if protocol is None or isinstance(protocol, dict):
       
   207 
       
   208             protocol_revision = Protocol.objects.create_new_revision(protocol.get('id'), protocol, None)
       
   209             validated_data['protocol'] = "%s%s.%s" % (constants.PROTOCOL_URN_PREFIX, protocol_revision.protocol.ext_id, protocol_revision.version)
       
   210 
       
   211         elif isinstance(protocol, str) and protocol.startswith(constants.PROTOCOL_URN_PREFIX):
       
   212             validated_data['protocol'] = protocol
       
   213         else:
       
   214             raise Exception("Bad format for protocol")
       
   215 
       
   216         return super().create(validated_data)