From 4bff7deefaf942a698118f0fc936d5e254b0d844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex=20Hermida?= Date: Fri, 8 Jun 2018 12:45:38 +0200 Subject: [PATCH] Add due date fields to import/export api --- taiga/export_import/api.py | 12 ++++++++ .../export_import/serializers/serializers.py | 30 +++++++++++++++++++ taiga/export_import/services/store.py | 3 +- taiga/export_import/validators/__init__.py | 3 ++ taiga/export_import/validators/validators.py | 18 +++++++++++ tests/integration/test_importer_api.py | 20 +++++++++---- 6 files changed, 79 insertions(+), 7 deletions(-) diff --git a/taiga/export_import/api.py b/taiga/export_import/api.py index ac8ae462..237aadcb 100644 --- a/taiga/export_import/api.py +++ b/taiga/export_import/api.py @@ -155,14 +155,26 @@ class ProjectImporterViewSet(mixins.ImportThrottlingPolicyMixin, CreateModelMixi services.store.store_project_attributes_values(project_serialized.object, data, "issue_statuses", validators.IssueStatusExportValidator,) + if "issue_duedates" in data: + services.store.store_project_attributes_values(project_serialized.object, data, + "issue_duedates", + validators.IssueDueDateExportValidator,) if "us_statuses" in data: services.store.store_project_attributes_values(project_serialized.object, data, "us_statuses", validators.UserStoryStatusExportValidator,) + if "us_duedates" in data: + services.store.store_project_attributes_values(project_serialized.object, data, + "us_duedates", + validators.UserStoryDueDateExportValidator,) if "task_statuses" in data: services.store.store_project_attributes_values(project_serialized.object, data, "task_statuses", validators.TaskStatusExportValidator) + if "task_duedates" in data: + services.store.store_project_attributes_values(project_serialized.object, data, + "task_duedates", + validators.TaskDueDateExportValidator) if "priorities" in data: services.store.store_project_attributes_values(project_serialized.object, data, "priorities", diff --git a/taiga/export_import/serializers/serializers.py b/taiga/export_import/serializers/serializers.py index c74bbd0a..8e03181f 100644 --- a/taiga/export_import/serializers/serializers.py +++ b/taiga/export_import/serializers/serializers.py @@ -60,6 +60,15 @@ class UserStoryStatusExportSerializer(RelatedExportSerializer): wip_limit = Field() +class UserStoryDueDateExportSerializer(RelatedExportSerializer): + name = Field() + slug = Field() + order = Field() + by_default = Field() + color = Field() + days_to_due = Field() + + class EpicStatusExportSerializer(RelatedExportSerializer): name = Field() slug = Field() @@ -76,6 +85,15 @@ class TaskStatusExportSerializer(RelatedExportSerializer): color = Field() +class TaskDueDateExportSerializer(RelatedExportSerializer): + name = Field() + slug = Field() + order = Field() + by_default = Field() + color = Field() + days_to_due = Field() + + class IssueStatusExportSerializer(RelatedExportSerializer): name = Field() slug = Field() @@ -84,6 +102,15 @@ class IssueStatusExportSerializer(RelatedExportSerializer): color = Field() +class IssueDueDateExportSerializer(RelatedExportSerializer): + name = Field() + slug = Field() + order = Field() + by_default = Field() + color = Field() + days_to_due = Field() + + class PriorityExportSerializer(RelatedExportSerializer): name = Field() order = Field() @@ -436,9 +463,12 @@ class ProjectExportSerializer(WatcheableObjectLightSerializerMixin): points = PointsExportSerializer(many=True) epic_statuses = EpicStatusExportSerializer(many=True) us_statuses = UserStoryStatusExportSerializer(many=True) + us_duedates = UserStoryDueDateExportSerializer(many=True) task_statuses = TaskStatusExportSerializer(many=True) + task_duedates = TaskDueDateExportSerializer(many=True) issue_types = IssueTypeExportSerializer(many=True) issue_statuses = IssueStatusExportSerializer(many=True) + issue_duedates = IssueDueDateExportSerializer(many=True) priorities = PriorityExportSerializer(many=True) severities = SeverityExportSerializer(many=True) tags_colors = Field() diff --git a/taiga/export_import/services/store.py b/taiga/export_import/services/store.py index a20b9329..6eee6cff 100644 --- a/taiga/export_import/services/store.py +++ b/taiga/export_import/services/store.py @@ -233,7 +233,8 @@ def _store_project_attribute_value(project, data, field, serializer): def store_project_attributes_values(project, data, field, serializer): result = [] for choice_data in data.get(field, []): - result.append(_store_project_attribute_value(project, choice_data, field, serializer)) + result.append(_store_project_attribute_value(project, choice_data, field, + serializer)) return result diff --git a/taiga/export_import/validators/__init__.py b/taiga/export_import/validators/__init__.py index dd286efa..0d9379bd 100644 --- a/taiga/export_import/validators/__init__.py +++ b/taiga/export_import/validators/__init__.py @@ -1,8 +1,11 @@ from .validators import PointsExportValidator from .validators import EpicStatusExportValidator from .validators import UserStoryStatusExportValidator +from .validators import UserStoryDueDateExportValidator from .validators import TaskStatusExportValidator +from .validators import TaskDueDateExportValidator from .validators import IssueStatusExportValidator +from .validators import IssueDueDateExportValidator from .validators import PriorityExportValidator from .validators import SeverityExportValidator from .validators import IssueTypeExportValidator diff --git a/taiga/export_import/validators/validators.py b/taiga/export_import/validators/validators.py index 7f0d5fe3..daa7cc6a 100644 --- a/taiga/export_import/validators/validators.py +++ b/taiga/export_import/validators/validators.py @@ -62,18 +62,36 @@ class UserStoryStatusExportValidator(validators.ModelValidator): exclude = ('id', 'project') +class UserStoryDueDateExportValidator(validators.ModelValidator): + class Meta: + model = projects_models.UserStoryDueDate + exclude = ('id', 'project') + + class TaskStatusExportValidator(validators.ModelValidator): class Meta: model = projects_models.TaskStatus exclude = ('id', 'project') +class TaskDueDateExportValidator(validators.ModelValidator): + class Meta: + model = projects_models.TaskDueDate + exclude = ('id', 'project') + + class IssueStatusExportValidator(validators.ModelValidator): class Meta: model = projects_models.IssueStatus exclude = ('id', 'project') +class IssueDueDateExportValidator(validators.ModelValidator): + class Meta: + model = projects_models.IssueDueDate + exclude = ('id', 'project') + + class PriorityExportValidator(validators.ModelValidator): class Meta: model = projects_models.Priority diff --git a/tests/integration/test_importer_api.py b/tests/integration/test_importer_api.py index 9764e9a8..4574594f 100644 --- a/tests/integration/test_importer_api.py +++ b/tests/integration/test_importer_api.py @@ -70,9 +70,10 @@ def test_valid_project_import_without_extra_data(client): response = client.json.post(url, json.dumps(data)) assert response.status_code == 201, response.data must_empty_children = [ - "issues", "user_stories", "us_statuses", "wiki_pages", "priorities", - "severities", "milestones", "points", "issue_types", "task_statuses", - "issue_statuses", "wiki_links", + "issues", "user_stories", "us_statuses", "us_duedates", "wiki_pages", + "priorities", "severities", "milestones", "points", "issue_types", + "task_statuses", "task_duedates", "issue_statuses", "issue_duedates", + "wiki_links" ] assert all(map(lambda x: len(response.data[x]) == 0, must_empty_children)) assert response.data["owner"] == user.email @@ -218,6 +219,9 @@ def test_valid_project_import_with_extra_data(client): "us_statuses": [{ "name": "Test" }], + "us_duedates": [{ + "name": "Test" + }], "severities": [{ "name": "Test" }], @@ -246,8 +250,9 @@ def test_valid_project_import_with_extra_data(client): ] must_one_instance_children = [ - "roles", "us_statuses", "severities", "priorities", "points", - "issue_types", "task_statuses", "issue_statuses", "memberships", + "roles", "us_statuses", "us_duedates", "severities", "priorities", + "points", "issue_types", "task_statuses", "task_duedates", + "issue_statuses", "issue_duedates", "memberships" ] assert all(map(lambda x: len(response.data[x]) == 0, must_empty_children)) @@ -284,17 +289,20 @@ def test_invalid_project_import_with_extra_data(client): "name": "Test" }], "us_statuses": [{}], + "us_duedates": [{}], "severities": [{}], "priorities": [{}], "points": [{}], "issue_types": [{}], "task_statuses": [{}], + "task_duedates": [{}], + "issue_duedates": [{}], "issue_statuses": [{}], } response = client.json.post(url, json.dumps(data)) assert response.status_code == 400 - assert len(response.data) == 7 + assert len(response.data) == 10 assert Project.objects.filter(slug="imported-project").count() == 0