src/notes/api/serializers/core.py
changeset 131 adad5563603c
parent 119 8ff8e2aee0f9
child 133 6f3078f7fd47
--- a/src/notes/api/serializers/core.py	Sun Jul 30 01:02:09 2017 +0200
+++ b/src/notes/api/serializers/core.py	Mon Jul 31 23:18:38 2017 +0200
@@ -3,8 +3,10 @@
 """
 import logging
 
+from django.contrib.auth.models import Group
+from rest_framework import serializers
+
 from notes.models import Note, Session
-from rest_framework import serializers
 
 logger = logging.getLogger(__name__)
 
@@ -87,40 +89,63 @@
 
     owner = serializers.SlugRelatedField(
         read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
+    group = serializers.SlugRelatedField(read_only=True, slug_field='name')
 
     class Meta:
         model = Session
         fields = (
             'ext_id', 'version', 'date', 'created', 'updated',
-            'owner', 'title', 'description', 'protocol'
+            'owner', 'title', 'description', 'protocol', 'group'
         )
-        read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner')
+        read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner', 'group')
 
 
 class DetailSessionSerializer(serializers.ModelSerializer):
 
     owner = serializers.SlugRelatedField(read_only=True, slug_field='username')
     notes = DetailNoteSerializer(many=True, read_only=True)
+    group = serializers.SlugRelatedField(slug_field='name', read_only=True)
+
+    class Meta:
+        model = Session
+        fields = (
+            'ext_id', 'version', 'date', 'created', 'updated',
+            'owner', 'title', 'description', 'protocol', 'group',
+            'notes'
+        )
+        read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner', 'group')
+
+class CreateSessionSerializer(serializers.ModelSerializer):
+
+    owner = serializers.SlugRelatedField(
+        read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
+    group = serializers.SlugRelatedField(slug_field='name', queryset=Group.objects.all(), required=False)
 
     class Meta:
         model = Session
         fields = (
             'ext_id', 'version', 'date', 'created', 'updated',
-            'owner', 'title', 'description', 'protocol',
-            'notes'
-        )
-        read_only_fields = ('ext_id', 'version', 'created', 'updated', 'owner')
-
-class CreateSessionSerializer(serializers.ModelSerializer):
-
-    owner = serializers.SlugRelatedField(
-        read_only=True, slug_field='username', default=serializers.CurrentUserDefault())
-
-
-    class Meta:
-        model = Session
-        fields = (
-            'ext_id', 'version', 'date', 'created', 'updated',
-            'owner', 'title', 'description', 'protocol'
+            'owner', 'title', 'description', 'protocol', 'group'
         )
         read_only_fields = ('version', 'created', 'updated', 'owner')
+
+    def validate(self, data):
+        data = super().validate(data)
+
+        group = data.get('group')
+        owner = data.get('owner')
+
+        if group is None:
+            if owner and owner.profile and owner.profile.default_group:
+                group = owner.profile.default_group
+            if group is None and owner:
+                group = Group.objects.filter(profile__owner_personal=owner).first()
+
+        if group is None:
+            raise serializers.ValidationError("group field is required or default group or personal group could not be found for owner")
+        elif not owner in group.user_set.all():
+            raise serializers.ValidationError("Owner must be in group")
+
+        data['group'] = group
+        return data
+