diff --git a/taiga/base/serializers.py b/taiga/base/serializers.py index 8c54677b..f2e1bc08 100644 --- a/taiga/base/serializers.py +++ b/taiga/base/serializers.py @@ -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 diff --git a/taiga/projects/issues/serializers.py b/taiga/projects/issues/serializers.py index 91034a68..711cefd9 100644 --- a/taiga/projects/issues/serializers.py +++ b/taiga/projects/issues/serializers.py @@ -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") diff --git a/taiga/projects/tasks/serializers.py b/taiga/projects/tasks/serializers.py index 8c132c5b..9e2d2f4a 100644 --- a/taiga/projects/tasks/serializers.py +++ b/taiga/projects/tasks/serializers.py @@ -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") diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index 7d3017f9..f90970f3 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -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")