Fixing problem when PATCH in a resource using prefetch_related
parent
2016586afa
commit
7558bbee79
|
@ -31,7 +31,7 @@ class TagsField(serializers.WritableField):
|
||||||
def from_native(self, data):
|
def from_native(self, data):
|
||||||
if not data:
|
if not data:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
ret = sum([tag.split(",") for tag in data], [])
|
ret = sum([tag.split(",") for tag in data], [])
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue