Add due date fields to import/export api

remotes/origin/3.4.0rc
Álex Hermida 2018-06-08 12:45:38 +02:00 committed by Alex Hermida
parent 30e3b4beb1
commit 4bff7deefa
6 changed files with 79 additions and 7 deletions

View File

@ -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",

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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