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,
|
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",
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue