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) |