Add due date fields to import/export api
parent
30e3b4beb1
commit
4bff7deefa
|
@ -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",
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue