From 81591a62940d92bae3d624410a422648ec95ea69 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 2 Oct 2014 03:43:11 +0200 Subject: [PATCH] [backport] Fix wrong handling patch request with user_stories list on milestone resource. (fix #1163) --- taiga/projects/milestones/serializers.py | 4 +- tests/factories.py | 9 ++++ tests/integration/test_milestones.py | 54 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 tests/integration/test_milestones.py diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index 009a8b3b..e333c71f 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -24,7 +24,7 @@ from . import models class MilestoneSerializer(serializers.ModelSerializer): - user_stories = UserStorySerializer(many=True, required=False) + user_stories = UserStorySerializer(many=True, required=False, read_only=True) total_points = serializers.SerializerMethodField("get_total_points") closed_points = serializers.SerializerMethodField("get_closed_points") client_increment_points = serializers.SerializerMethodField("get_client_increment_points") @@ -32,7 +32,7 @@ class MilestoneSerializer(serializers.ModelSerializer): class Meta: model = models.Milestone - read_only_fields = ('id', 'created_date', 'modified_date') + read_only_fields = ("id", "created_date", "modified_date") def get_total_points(self, obj): return sum(obj.total_points.values()) diff --git a/tests/factories.py b/tests/factories.py index ffd368f7..a833b996 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -93,6 +93,15 @@ class PointsFactory(Factory): project = factory.SubFactory("tests.factories.ProjectFactory") +class RolePointsFactory(Factory): + class Meta: + model = "userstories.RolePoints" + strategy = factory.CREATE_STRATEGY + + user_story = factory.SubFactory("tests.factories.UserStoryFactory") + role = factory.SubFactory("tests.factories.RoleFactory") + points = factory.SubFactory("tests.factories.PointsFactory") + class UserStoryAttachmentFactory(Factory): project = factory.SubFactory("tests.factories.ProjectFactory") diff --git a/tests/integration/test_milestones.py b/tests/integration/test_milestones.py new file mode 100644 index 00000000..7af07411 --- /dev/null +++ b/tests/integration/test_milestones.py @@ -0,0 +1,54 @@ +# Copyright (C) 2014 Andrey Antukh +# Copyright (C) 2014 Jesús Espino +# Copyright (C) 2014 David Barragán +# Copyright (C) 2014 Anler Hernández +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import pytest +from unittest.mock import patch, Mock + +from django.apps import apps +from django.core.urlresolvers import reverse + +from taiga.base.utils import json +from taiga.projects.userstories.serializers import UserStorySerializer + +from .. import factories as f + + +pytestmark = pytest.mark.django_db + + +def test_api_update_milestone(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create(owner=user) + role = f.RoleFactory.create(project=project) + member = f.MembershipFactory.create(project=project, user=user, role=role) + sprint = f.MilestoneFactory.create(project=project, owner=user) + + points = f.PointsFactory.create(project=project, value=None) + us = f.UserStoryFactory.create(project=project, owner=user) + # role_points = f.RolePointsFactory.create(points=points, user_story=us, role=role) + + url = reverse("milestones-detail", args=[sprint.pk]) + + form_data = { + "name": "test", + "user_stories": [UserStorySerializer(us).data] + } + + client.login(user) + response = client.json.patch(url, json.dumps(form_data)) + assert response.status_code == 200 +