From 991e5a7f42824b36782e2a51d27d0a3c43660a54 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 17 Oct 2014 14:00:31 +0200 Subject: [PATCH] Fixing error 500 when importing two milestones with the same name --- taiga/export_import/serializers.py | 17 +++++++++++++++++ taiga/export_import/service.py | 2 +- tests/integration/test_importer_api.py | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/taiga/export_import/serializers.py b/taiga/export_import/serializers.py index 977da9d7..77773db3 100644 --- a/taiga/export_import/serializers.py +++ b/taiga/export_import/serializers.py @@ -296,6 +296,23 @@ class MilestoneExportSerializer(serializers.ModelSerializer): watchers = UserRelatedField(many=True, required=False) modified_date = serializers.DateTimeField(required=False) + def __init__(self, *args, **kwargs): + project = kwargs.pop('project', None) + super(MilestoneExportSerializer, self).__init__(*args, **kwargs) + if project: + self.project = project + + def validate_name(self, attrs, source): + """ + Check the milestone name is not duplicated in the project + """ + name = attrs[source] + qs = self.project.milestones.filter(name=name) + if qs.exists(): + raise serializers.ValidationError("Name duplicated for the project") + + return attrs + class Meta: model = milestones_models.Milestone exclude = ('id', 'project') diff --git a/taiga/export_import/service.py b/taiga/export_import/service.py index 4372fd57..3f1b3145 100644 --- a/taiga/export_import/service.py +++ b/taiga/export_import/service.py @@ -185,7 +185,7 @@ def store_task(project, task): def store_milestone(project, milestone): - serialized = serializers.MilestoneExportSerializer(data=milestone) + serialized = serializers.MilestoneExportSerializer(data=milestone, project=project) if serialized.is_valid(): serialized.object.project = project serialized.object._importing = True diff --git a/tests/integration/test_importer_api.py b/tests/integration/test_importer_api.py index a500d37c..33fb4972 100644 --- a/tests/integration/test_importer_api.py +++ b/tests/integration/test_importer_api.py @@ -637,3 +637,21 @@ def test_valid_milestone_import(client): response = client.post(url, json.dumps(data), content_type="application/json") assert response.status_code == 201 response_data = json.loads(response.content.decode("utf-8")) + +def test_milestone_import_duplicated_milestone(client): + user = f.UserFactory.create() + project = f.ProjectFactory.create(owner=user) + client.login(user) + + url = reverse("importer-milestone", args=[project.pk]) + data = { + "name": "Imported milestone", + "estimated_start": "2014-10-10", + "estimated_finish": "2014-10-20", + } + # We create twice the same milestone + response = client.post(url, json.dumps(data), content_type="application/json") + response = client.post(url, json.dumps(data), content_type="application/json") + assert response.status_code == 400 + response_data = json.loads(response.content.decode("utf-8")) + assert response_data["milestones"][0]["name"][0] == "Name duplicated for the project"