[Backport] Fixing problem when PATCH in a resource using prefetch_related

remotes/origin/enhancement/email-actions
Alejandro Alonso 2015-02-03 09:54:51 +01:00 committed by David Barragán Merino
parent d8df2aeca6
commit 992d20d100
4 changed files with 29 additions and 10 deletions

View File

@ -31,7 +31,7 @@ class TagsField(serializers.WritableField):
def from_native(self, data):
if not data:
return data
ret = sum([tag.split(",") for tag in data], [])
return ret
@ -144,3 +144,16 @@ class ModelSerializer(serializers.ModelSerializer):
if field:
field.required = True
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 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.projects.validators import ProjectExistsValidator
from taiga.projects.notifications.validators import WatchersValidator
@ -24,7 +26,7 @@ from taiga.projects.notifications.validators import WatchersValidator
from . import models
class IssueSerializer(WatchersValidator, serializers.ModelSerializer):
class IssueSerializer(WatchersValidator, ModelSerializer):
tags = TagsField(required=False)
external_reference = PgArrayField(required=False)
is_closed = serializers.Field(source="is_closed")
@ -61,7 +63,7 @@ class IssueNeighborsSerializer(NeighborsSerializerMixin, IssueSerializer):
return NeighborIssueSerializer(neighbor).data
class NeighborIssueSerializer(serializers.ModelSerializer):
class NeighborIssueSerializer(ModelSerializer):
class Meta:
model = models.Issue
fields = ("id", "ref", "subject")

View File

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

View File

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