Adding custom fields to csv exrpot
parent
9908d4307a
commit
bdcd8bba41
|
@ -170,7 +170,7 @@ class IssueViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin,
|
|||
|
||||
project = get_object_or_404(Project, issues_csv_uuid=uuid)
|
||||
queryset = project.issues.all().order_by('ref')
|
||||
data = services.issues_to_csv(queryset)
|
||||
data = services.issues_to_csv(project, queryset)
|
||||
csv_response = HttpResponse(data.getvalue(), content_type='application/csv')
|
||||
csv_response['Content-Disposition'] = 'attachment; filename="issues.csv"'
|
||||
return csv_response
|
||||
|
|
|
@ -63,16 +63,19 @@ def update_issues_order_in_bulk(bulk_data):
|
|||
db.update_in_bulk_with_ids(issue_ids, new_order_values, model=models.Issue)
|
||||
|
||||
|
||||
def issues_to_csv(queryset):
|
||||
def issues_to_csv(project, queryset):
|
||||
csv_data = io.StringIO()
|
||||
fieldnames = ["ref", "subject", "description", "milestone", "owner",
|
||||
"owner_full_name", "assigned_to", "assigned_to_full_name",
|
||||
"status", "severity", "priority", "type", "is_closed",
|
||||
"attachments", "external_reference"]
|
||||
for custom_attr in project.issuecustomattributes.all():
|
||||
fieldnames.append(custom_attr.name)
|
||||
|
||||
writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
for issue in queryset:
|
||||
writer.writerow({
|
||||
issue_data = {
|
||||
"ref": issue.ref,
|
||||
"subject": issue.subject,
|
||||
"description": issue.description,
|
||||
|
@ -88,6 +91,12 @@ def issues_to_csv(queryset):
|
|||
"is_closed": issue.is_closed,
|
||||
"attachments": issue.attachments.count(),
|
||||
"external_reference": issue.external_reference,
|
||||
})
|
||||
}
|
||||
|
||||
for custom_attr in project.issuecustomattributes.all():
|
||||
value = issue.custom_attributes_values.attributes_values.get(str(custom_attr.id), None)
|
||||
issue_data[custom_attr.name] = value
|
||||
|
||||
writer.writerow(issue_data)
|
||||
|
||||
return csv_data
|
||||
|
|
|
@ -80,7 +80,7 @@ class TaskViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin,
|
|||
|
||||
project = get_object_or_404(Project, tasks_csv_uuid=uuid)
|
||||
queryset = project.tasks.all().order_by('ref')
|
||||
data = services.tasks_to_csv(queryset)
|
||||
data = services.tasks_to_csv(project, queryset)
|
||||
csv_response = HttpResponse(data.getvalue(), content_type='application/csv')
|
||||
csv_response['Content-Disposition'] = 'attachment; filename="tasks.csv"'
|
||||
return csv_response
|
||||
|
|
|
@ -80,16 +80,19 @@ def snapshot_tasks_in_bulk(bulk_data, user):
|
|||
pass
|
||||
|
||||
|
||||
def tasks_to_csv(queryset):
|
||||
def tasks_to_csv(project, queryset):
|
||||
csv_data = io.StringIO()
|
||||
fieldnames = ["ref", "subject", "description", "user_story", "milestone", "owner",
|
||||
"owner_full_name", "assigned_to", "assigned_to_full_name",
|
||||
"status", "is_iocaine", "is_closed", "us_order",
|
||||
"taskboard_order", "attachments", "external_reference"]
|
||||
for custom_attr in project.taskcustomattributes.all():
|
||||
fieldnames.append(custom_attr.name)
|
||||
|
||||
writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
for task in queryset:
|
||||
writer.writerow({
|
||||
task_data = {
|
||||
"ref": task.ref,
|
||||
"subject": task.subject,
|
||||
"description": task.description,
|
||||
|
@ -106,6 +109,11 @@ def tasks_to_csv(queryset):
|
|||
"taskboard_order": task.taskboard_order,
|
||||
"attachments": task.attachments.count(),
|
||||
"external_reference": task.external_reference,
|
||||
})
|
||||
}
|
||||
for custom_attr in project.taskcustomattributes.all():
|
||||
value = task.custom_attributes_values.attributes_values.get(str(custom_attr.id), None)
|
||||
task_data[custom_attr.name] = value
|
||||
|
||||
writer.writerow(task_data)
|
||||
|
||||
return csv_data
|
||||
|
|
|
@ -123,6 +123,9 @@ def userstories_to_csv(project,queryset):
|
|||
"client_requirement", "team_requirement", "attachments",
|
||||
"generated_from_issue", "external_reference", "tasks"]
|
||||
|
||||
for custom_attr in project.userstorycustomattributes.all():
|
||||
fieldnames.append(custom_attr.name)
|
||||
|
||||
writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
||||
writer.writeheader()
|
||||
for us in queryset:
|
||||
|
@ -158,6 +161,10 @@ def userstories_to_csv(project,queryset):
|
|||
row["{}-points".format(role.slug)] = 0
|
||||
row['total-points'] = us.get_total_points()
|
||||
|
||||
for custom_attr in project.userstorycustomattributes.all():
|
||||
value = us.custom_attributes_values.attributes_values.get(str(custom_attr.id), None)
|
||||
row[custom_attr.name] = value
|
||||
|
||||
writer.writerow(row)
|
||||
|
||||
return csv_data
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import uuid
|
||||
import csv
|
||||
|
||||
from unittest import mock
|
||||
|
||||
|
@ -154,7 +155,6 @@ def test_api_filter_by_text_6(client):
|
|||
issue = f.create_issue(subject="test", owner=user)
|
||||
issue.ref = 123
|
||||
issue.save()
|
||||
print(issue.ref, issue.subject)
|
||||
url = reverse("issues-list") + "?q=%s" % (issue.ref)
|
||||
|
||||
client.login(issue.owner)
|
||||
|
@ -181,3 +181,20 @@ def test_get_valid_csv(client):
|
|||
|
||||
response = client.get("{}?uuid={}".format(url, project.issues_csv_uuid))
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
def test_custom_fields_csv_generation():
|
||||
project = f.ProjectFactory.create(issues_csv_uuid=uuid.uuid4().hex)
|
||||
attr = f.IssueCustomAttributeFactory.create(project=project, name="attr1", description="desc")
|
||||
issue = f.IssueFactory.create(project=project)
|
||||
attr_values = issue.custom_attributes_values
|
||||
attr_values.attributes_values = {str(attr.id):"val1"}
|
||||
attr_values.save()
|
||||
queryset = project.issues.all()
|
||||
data = services.issues_to_csv(project, queryset)
|
||||
data.seek(0)
|
||||
reader = csv.reader(data)
|
||||
row = next(reader)
|
||||
assert row[15] == attr.name
|
||||
row = next(reader)
|
||||
assert row[15] == "val1"
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import uuid
|
||||
import csv
|
||||
|
||||
from unittest import mock
|
||||
|
||||
|
@ -130,3 +131,20 @@ def test_get_valid_csv(client):
|
|||
|
||||
response = client.get("{}?uuid={}".format(url, project.tasks_csv_uuid))
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
def test_custom_fields_csv_generation():
|
||||
project = f.ProjectFactory.create(tasks_csv_uuid=uuid.uuid4().hex)
|
||||
attr = f.TaskCustomAttributeFactory.create(project=project, name="attr1", description="desc")
|
||||
task = f.TaskFactory.create(project=project)
|
||||
attr_values = task.custom_attributes_values
|
||||
attr_values.attributes_values = {str(attr.id):"val1"}
|
||||
attr_values.save()
|
||||
queryset = project.tasks.all()
|
||||
data = services.tasks_to_csv(project, queryset)
|
||||
data.seek(0)
|
||||
reader = csv.reader(data)
|
||||
row = next(reader)
|
||||
assert row[16] == attr.name
|
||||
row = next(reader)
|
||||
assert row[16] == "val1"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import copy
|
||||
import uuid
|
||||
import csv
|
||||
|
||||
from unittest import mock
|
||||
from django.core.urlresolvers import reverse
|
||||
|
@ -261,3 +262,20 @@ def test_get_valid_csv(client):
|
|||
|
||||
response = client.get("{}?uuid={}".format(url, project.userstories_csv_uuid))
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
def test_custom_fields_csv_generation():
|
||||
project = f.ProjectFactory.create(userstories_csv_uuid=uuid.uuid4().hex)
|
||||
attr = f.UserStoryCustomAttributeFactory.create(project=project, name="attr1", description="desc")
|
||||
us = f.UserStoryFactory.create(project=project)
|
||||
attr_values = us.custom_attributes_values
|
||||
attr_values.attributes_values = {str(attr.id):"val1"}
|
||||
attr_values.save()
|
||||
queryset = project.user_stories.all()
|
||||
data = services.userstories_to_csv(project, queryset)
|
||||
data.seek(0)
|
||||
reader = csv.reader(data)
|
||||
row = next(reader)
|
||||
assert row[23] == attr.name
|
||||
row = next(reader)
|
||||
assert row[23] == "val1"
|
||||
|
|
Loading…
Reference in New Issue