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)
|
project = get_object_or_404(Project, issues_csv_uuid=uuid)
|
||||||
queryset = project.issues.all().order_by('ref')
|
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 = HttpResponse(data.getvalue(), content_type='application/csv')
|
||||||
csv_response['Content-Disposition'] = 'attachment; filename="issues.csv"'
|
csv_response['Content-Disposition'] = 'attachment; filename="issues.csv"'
|
||||||
return csv_response
|
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)
|
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()
|
csv_data = io.StringIO()
|
||||||
fieldnames = ["ref", "subject", "description", "milestone", "owner",
|
fieldnames = ["ref", "subject", "description", "milestone", "owner",
|
||||||
"owner_full_name", "assigned_to", "assigned_to_full_name",
|
"owner_full_name", "assigned_to", "assigned_to_full_name",
|
||||||
"status", "severity", "priority", "type", "is_closed",
|
"status", "severity", "priority", "type", "is_closed",
|
||||||
"attachments", "external_reference"]
|
"attachments", "external_reference"]
|
||||||
|
for custom_attr in project.issuecustomattributes.all():
|
||||||
|
fieldnames.append(custom_attr.name)
|
||||||
|
|
||||||
writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
||||||
writer.writeheader()
|
writer.writeheader()
|
||||||
for issue in queryset:
|
for issue in queryset:
|
||||||
writer.writerow({
|
issue_data = {
|
||||||
"ref": issue.ref,
|
"ref": issue.ref,
|
||||||
"subject": issue.subject,
|
"subject": issue.subject,
|
||||||
"description": issue.description,
|
"description": issue.description,
|
||||||
|
@ -88,6 +91,12 @@ def issues_to_csv(queryset):
|
||||||
"is_closed": issue.is_closed,
|
"is_closed": issue.is_closed,
|
||||||
"attachments": issue.attachments.count(),
|
"attachments": issue.attachments.count(),
|
||||||
"external_reference": issue.external_reference,
|
"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
|
return csv_data
|
||||||
|
|
|
@ -80,7 +80,7 @@ class TaskViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMixin,
|
||||||
|
|
||||||
project = get_object_or_404(Project, tasks_csv_uuid=uuid)
|
project = get_object_or_404(Project, tasks_csv_uuid=uuid)
|
||||||
queryset = project.tasks.all().order_by('ref')
|
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 = HttpResponse(data.getvalue(), content_type='application/csv')
|
||||||
csv_response['Content-Disposition'] = 'attachment; filename="tasks.csv"'
|
csv_response['Content-Disposition'] = 'attachment; filename="tasks.csv"'
|
||||||
return csv_response
|
return csv_response
|
||||||
|
|
|
@ -80,16 +80,19 @@ def snapshot_tasks_in_bulk(bulk_data, user):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def tasks_to_csv(queryset):
|
def tasks_to_csv(project, queryset):
|
||||||
csv_data = io.StringIO()
|
csv_data = io.StringIO()
|
||||||
fieldnames = ["ref", "subject", "description", "user_story", "milestone", "owner",
|
fieldnames = ["ref", "subject", "description", "user_story", "milestone", "owner",
|
||||||
"owner_full_name", "assigned_to", "assigned_to_full_name",
|
"owner_full_name", "assigned_to", "assigned_to_full_name",
|
||||||
"status", "is_iocaine", "is_closed", "us_order",
|
"status", "is_iocaine", "is_closed", "us_order",
|
||||||
"taskboard_order", "attachments", "external_reference"]
|
"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 = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
||||||
writer.writeheader()
|
writer.writeheader()
|
||||||
for task in queryset:
|
for task in queryset:
|
||||||
writer.writerow({
|
task_data = {
|
||||||
"ref": task.ref,
|
"ref": task.ref,
|
||||||
"subject": task.subject,
|
"subject": task.subject,
|
||||||
"description": task.description,
|
"description": task.description,
|
||||||
|
@ -106,6 +109,11 @@ def tasks_to_csv(queryset):
|
||||||
"taskboard_order": task.taskboard_order,
|
"taskboard_order": task.taskboard_order,
|
||||||
"attachments": task.attachments.count(),
|
"attachments": task.attachments.count(),
|
||||||
"external_reference": task.external_reference,
|
"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
|
return csv_data
|
||||||
|
|
|
@ -123,6 +123,9 @@ def userstories_to_csv(project,queryset):
|
||||||
"client_requirement", "team_requirement", "attachments",
|
"client_requirement", "team_requirement", "attachments",
|
||||||
"generated_from_issue", "external_reference", "tasks"]
|
"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 = csv.DictWriter(csv_data, fieldnames=fieldnames)
|
||||||
writer.writeheader()
|
writer.writeheader()
|
||||||
for us in queryset:
|
for us in queryset:
|
||||||
|
@ -158,6 +161,10 @@ def userstories_to_csv(project,queryset):
|
||||||
row["{}-points".format(role.slug)] = 0
|
row["{}-points".format(role.slug)] = 0
|
||||||
row['total-points'] = us.get_total_points()
|
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)
|
writer.writerow(row)
|
||||||
|
|
||||||
return csv_data
|
return csv_data
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import uuid
|
import uuid
|
||||||
|
import csv
|
||||||
|
|
||||||
from unittest import mock
|
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 = f.create_issue(subject="test", owner=user)
|
||||||
issue.ref = 123
|
issue.ref = 123
|
||||||
issue.save()
|
issue.save()
|
||||||
print(issue.ref, issue.subject)
|
|
||||||
url = reverse("issues-list") + "?q=%s" % (issue.ref)
|
url = reverse("issues-list") + "?q=%s" % (issue.ref)
|
||||||
|
|
||||||
client.login(issue.owner)
|
client.login(issue.owner)
|
||||||
|
@ -181,3 +181,20 @@ def test_get_valid_csv(client):
|
||||||
|
|
||||||
response = client.get("{}?uuid={}".format(url, project.issues_csv_uuid))
|
response = client.get("{}?uuid={}".format(url, project.issues_csv_uuid))
|
||||||
assert response.status_code == 200
|
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 uuid
|
||||||
|
import csv
|
||||||
|
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
|
@ -130,3 +131,20 @@ def test_get_valid_csv(client):
|
||||||
|
|
||||||
response = client.get("{}?uuid={}".format(url, project.tasks_csv_uuid))
|
response = client.get("{}?uuid={}".format(url, project.tasks_csv_uuid))
|
||||||
assert response.status_code == 200
|
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 copy
|
||||||
import uuid
|
import uuid
|
||||||
|
import csv
|
||||||
|
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
from django.core.urlresolvers import reverse
|
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))
|
response = client.get("{}?uuid={}".format(url, project.userstories_csv_uuid))
|
||||||
assert response.status_code == 200
|
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