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, services.store.store_project_attributes_values(project_serialized.object, data,
"issue_statuses", "issue_statuses",
validators.IssueStatusExportValidator,) 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: if "us_statuses" in data:
services.store.store_project_attributes_values(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"us_statuses", "us_statuses",
validators.UserStoryStatusExportValidator,) 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: if "task_statuses" in data:
services.store.store_project_attributes_values(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"task_statuses", "task_statuses",
validators.TaskStatusExportValidator) 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: if "priorities" in data:
services.store.store_project_attributes_values(project_serialized.object, data, services.store.store_project_attributes_values(project_serialized.object, data,
"priorities", "priorities",

View File

@ -60,6 +60,15 @@ class UserStoryStatusExportSerializer(RelatedExportSerializer):
wip_limit = Field() wip_limit = Field()
class UserStoryDueDateExportSerializer(RelatedExportSerializer):
name = Field()
slug = Field()
order = Field()
by_default = Field()
color = Field()
days_to_due = Field()
class EpicStatusExportSerializer(RelatedExportSerializer): class EpicStatusExportSerializer(RelatedExportSerializer):
name = Field() name = Field()
slug = Field() slug = Field()
@ -76,6 +85,15 @@ class TaskStatusExportSerializer(RelatedExportSerializer):
color = Field() color = Field()
class TaskDueDateExportSerializer(RelatedExportSerializer):
name = Field()
slug = Field()
order = Field()
by_default = Field()
color = Field()
days_to_due = Field()
class IssueStatusExportSerializer(RelatedExportSerializer): class IssueStatusExportSerializer(RelatedExportSerializer):
name = Field() name = Field()
slug = Field() slug = Field()
@ -84,6 +102,15 @@ class IssueStatusExportSerializer(RelatedExportSerializer):
color = Field() color = Field()
class IssueDueDateExportSerializer(RelatedExportSerializer):
name = Field()
slug = Field()
order = Field()
by_default = Field()
color = Field()
days_to_due = Field()
class PriorityExportSerializer(RelatedExportSerializer): class PriorityExportSerializer(RelatedExportSerializer):
name = Field() name = Field()
order = Field() order = Field()
@ -436,9 +463,12 @@ class ProjectExportSerializer(WatcheableObjectLightSerializerMixin):
points = PointsExportSerializer(many=True) points = PointsExportSerializer(many=True)
epic_statuses = EpicStatusExportSerializer(many=True) epic_statuses = EpicStatusExportSerializer(many=True)
us_statuses = UserStoryStatusExportSerializer(many=True) us_statuses = UserStoryStatusExportSerializer(many=True)
us_duedates = UserStoryDueDateExportSerializer(many=True)
task_statuses = TaskStatusExportSerializer(many=True) task_statuses = TaskStatusExportSerializer(many=True)
task_duedates = TaskDueDateExportSerializer(many=True)
issue_types = IssueTypeExportSerializer(many=True) issue_types = IssueTypeExportSerializer(many=True)
issue_statuses = IssueStatusExportSerializer(many=True) issue_statuses = IssueStatusExportSerializer(many=True)
issue_duedates = IssueDueDateExportSerializer(many=True)
priorities = PriorityExportSerializer(many=True) priorities = PriorityExportSerializer(many=True)
severities = SeverityExportSerializer(many=True) severities = SeverityExportSerializer(many=True)
tags_colors = Field() 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): def store_project_attributes_values(project, data, field, serializer):
result = [] result = []
for choice_data in data.get(field, []): 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 return result

View File

@ -1,8 +1,11 @@
from .validators import PointsExportValidator from .validators import PointsExportValidator
from .validators import EpicStatusExportValidator from .validators import EpicStatusExportValidator
from .validators import UserStoryStatusExportValidator from .validators import UserStoryStatusExportValidator
from .validators import UserStoryDueDateExportValidator
from .validators import TaskStatusExportValidator from .validators import TaskStatusExportValidator
from .validators import TaskDueDateExportValidator
from .validators import IssueStatusExportValidator from .validators import IssueStatusExportValidator
from .validators import IssueDueDateExportValidator
from .validators import PriorityExportValidator from .validators import PriorityExportValidator
from .validators import SeverityExportValidator from .validators import SeverityExportValidator
from .validators import IssueTypeExportValidator from .validators import IssueTypeExportValidator

View File

@ -62,18 +62,36 @@ class UserStoryStatusExportValidator(validators.ModelValidator):
exclude = ('id', 'project') exclude = ('id', 'project')
class UserStoryDueDateExportValidator(validators.ModelValidator):
class Meta:
model = projects_models.UserStoryDueDate
exclude = ('id', 'project')
class TaskStatusExportValidator(validators.ModelValidator): class TaskStatusExportValidator(validators.ModelValidator):
class Meta: class Meta:
model = projects_models.TaskStatus model = projects_models.TaskStatus
exclude = ('id', 'project') exclude = ('id', 'project')
class TaskDueDateExportValidator(validators.ModelValidator):
class Meta:
model = projects_models.TaskDueDate
exclude = ('id', 'project')
class IssueStatusExportValidator(validators.ModelValidator): class IssueStatusExportValidator(validators.ModelValidator):
class Meta: class Meta:
model = projects_models.IssueStatus model = projects_models.IssueStatus
exclude = ('id', 'project') exclude = ('id', 'project')
class IssueDueDateExportValidator(validators.ModelValidator):
class Meta:
model = projects_models.IssueDueDate
exclude = ('id', 'project')
class PriorityExportValidator(validators.ModelValidator): class PriorityExportValidator(validators.ModelValidator):
class Meta: class Meta:
model = projects_models.Priority 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)) response = client.json.post(url, json.dumps(data))
assert response.status_code == 201, response.data assert response.status_code == 201, response.data
must_empty_children = [ must_empty_children = [
"issues", "user_stories", "us_statuses", "wiki_pages", "priorities", "issues", "user_stories", "us_statuses", "us_duedates", "wiki_pages",
"severities", "milestones", "points", "issue_types", "task_statuses", "priorities", "severities", "milestones", "points", "issue_types",
"issue_statuses", "wiki_links", "task_statuses", "task_duedates", "issue_statuses", "issue_duedates",
"wiki_links"
] ]
assert all(map(lambda x: len(response.data[x]) == 0, must_empty_children)) assert all(map(lambda x: len(response.data[x]) == 0, must_empty_children))
assert response.data["owner"] == user.email assert response.data["owner"] == user.email
@ -218,6 +219,9 @@ def test_valid_project_import_with_extra_data(client):
"us_statuses": [{ "us_statuses": [{
"name": "Test" "name": "Test"
}], }],
"us_duedates": [{
"name": "Test"
}],
"severities": [{ "severities": [{
"name": "Test" "name": "Test"
}], }],
@ -246,8 +250,9 @@ def test_valid_project_import_with_extra_data(client):
] ]
must_one_instance_children = [ must_one_instance_children = [
"roles", "us_statuses", "severities", "priorities", "points", "roles", "us_statuses", "us_duedates", "severities", "priorities",
"issue_types", "task_statuses", "issue_statuses", "memberships", "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)) 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" "name": "Test"
}], }],
"us_statuses": [{}], "us_statuses": [{}],
"us_duedates": [{}],
"severities": [{}], "severities": [{}],
"priorities": [{}], "priorities": [{}],
"points": [{}], "points": [{}],
"issue_types": [{}], "issue_types": [{}],
"task_statuses": [{}], "task_statuses": [{}],
"task_duedates": [{}],
"issue_duedates": [{}],
"issue_statuses": [{}], "issue_statuses": [{}],
} }
response = client.json.post(url, json.dumps(data)) response = client.json.post(url, json.dumps(data))
assert response.status_code == 400 assert response.status_code == 400
assert len(response.data) == 7 assert len(response.data) == 10
assert Project.objects.filter(slug="imported-project").count() == 0 assert Project.objects.filter(slug="imported-project").count() == 0