Merge pull request #237 from taigaio/bug/2133/I-cannot-remove-myself-from-watchers

Fixing problem when PATCH in a resource using prefetch_related
remotes/origin/enhancement/email-actions
David Barragán Merino 2015-02-03 10:16:06 +01:00
commit 213854d8d5
4 changed files with 29 additions and 10 deletions

View File

@ -144,3 +144,16 @@ class ModelSerializer(serializers.ModelSerializer):
if field: if field:
field.required = True field.required = True
return super().perform_validation(attrs) return super().perform_validation(attrs)
def save(self, **kwargs):
"""
Due to DRF bug with M2M fields we refresh object state from database
directly if object is models.Model type and it contains m2m fields
See: https://github.com/tomchristie/django-rest-framework/issues/1556
"""
self.object = super(serializers.ModelSerializer, self).save(**kwargs)
model = self.Meta.model
if model._meta.model._meta.local_many_to_many and self.object.pk:
self.object = model.objects.get(pk=self.object.pk)
return self.object

View File

@ -16,7 +16,9 @@
from rest_framework import serializers from rest_framework import serializers
from taiga.base.serializers import Serializer, TagsField, NeighborsSerializerMixin, PgArrayField from taiga.base.serializers import (Serializer, TagsField, NeighborsSerializerMixin,
PgArrayField, ModelSerializer)
from taiga.mdrender.service import render as mdrender from taiga.mdrender.service import render as mdrender
from taiga.projects.validators import ProjectExistsValidator from taiga.projects.validators import ProjectExistsValidator
from taiga.projects.notifications.validators import WatchersValidator from taiga.projects.notifications.validators import WatchersValidator
@ -24,7 +26,7 @@ from taiga.projects.notifications.validators import WatchersValidator
from . import models from . import models
class IssueSerializer(WatchersValidator, serializers.ModelSerializer): class IssueSerializer(WatchersValidator, ModelSerializer):
tags = TagsField(required=False) tags = TagsField(required=False)
external_reference = PgArrayField(required=False) external_reference = PgArrayField(required=False)
is_closed = serializers.Field(source="is_closed") is_closed = serializers.Field(source="is_closed")
@ -61,7 +63,7 @@ class IssueNeighborsSerializer(NeighborsSerializerMixin, IssueSerializer):
return NeighborIssueSerializer(neighbor).data return NeighborIssueSerializer(neighbor).data
class NeighborIssueSerializer(serializers.ModelSerializer): class NeighborIssueSerializer(ModelSerializer):
class Meta: class Meta:
model = models.Issue model = models.Issue
fields = ("id", "ref", "subject") fields = ("id", "ref", "subject")

View File

@ -16,7 +16,9 @@
from rest_framework import serializers from rest_framework import serializers
from taiga.base.serializers import Serializer, TagsField, NeighborsSerializerMixin, PgArrayField from taiga.base.serializers import (Serializer, TagsField, NeighborsSerializerMixin,
PgArrayField, ModelSerializer)
from taiga.mdrender.service import render as mdrender from taiga.mdrender.service import render as mdrender
from taiga.projects.validators import ProjectExistsValidator from taiga.projects.validators import ProjectExistsValidator
from taiga.projects.milestones.validators import SprintExistsValidator from taiga.projects.milestones.validators import SprintExistsValidator
@ -26,7 +28,7 @@ from taiga.projects.notifications.validators import WatchersValidator
from . import models from . import models
class TaskSerializer(WatchersValidator, serializers.ModelSerializer): class TaskSerializer(WatchersValidator, ModelSerializer):
tags = TagsField(required=False, default=[]) tags = TagsField(required=False, default=[])
external_reference = PgArrayField(required=False) external_reference = PgArrayField(required=False)
comment = serializers.SerializerMethodField("get_comment") comment = serializers.SerializerMethodField("get_comment")
@ -63,7 +65,7 @@ class TaskNeighborsSerializer(NeighborsSerializerMixin, TaskSerializer):
return NeighborTaskSerializer(neighbor).data return NeighborTaskSerializer(neighbor).data
class NeighborTaskSerializer(serializers.ModelSerializer): class NeighborTaskSerializer(ModelSerializer):
class Meta: class Meta:
model = models.Task model = models.Task
fields = ("id", "ref", "subject") fields = ("id", "ref", "subject")

View File

@ -18,7 +18,9 @@ import json
from django.apps import apps from django.apps import apps
from rest_framework import serializers from rest_framework import serializers
from taiga.base.serializers import Serializer, TagsField, NeighborsSerializerMixin, PgArrayField from taiga.base.serializers import (Serializer, TagsField, NeighborsSerializerMixin,
PgArrayField, ModelSerializer)
from taiga.mdrender.service import render as mdrender from taiga.mdrender.service import render as mdrender
from taiga.projects.validators import ProjectExistsValidator, UserStoryStatusExistsValidator from taiga.projects.validators import ProjectExistsValidator, UserStoryStatusExistsValidator
from taiga.projects.userstories.validators import UserStoryExistsValidator from taiga.projects.userstories.validators import UserStoryExistsValidator
@ -37,7 +39,7 @@ class RolePointsField(serializers.WritableField):
return json.loads(obj) return json.loads(obj)
class UserStorySerializer(WatchersValidator, serializers.ModelSerializer): class UserStorySerializer(WatchersValidator, ModelSerializer):
tags = TagsField(default=[], required=False) tags = TagsField(default=[], required=False)
external_reference = PgArrayField(required=False) external_reference = PgArrayField(required=False)
points = RolePointsField(source="role_points", required=False) points = RolePointsField(source="role_points", required=False)
@ -95,7 +97,7 @@ class UserStoryNeighborsSerializer(NeighborsSerializerMixin, UserStorySerializer
return NeighborUserStorySerializer(neighbor).data return NeighborUserStorySerializer(neighbor).data
class NeighborUserStorySerializer(serializers.ModelSerializer): class NeighborUserStorySerializer(ModelSerializer):
class Meta: class Meta:
model = models.UserStory model = models.UserStory
fields = ("id", "ref", "subject") fields = ("id", "ref", "subject")