[Backport] Fixing problem when PATCH in a resource using prefetch_related
parent
d8df2aeca6
commit
992d20d100
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue