Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions djqscsv/djqscsv.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,11 @@ def write_csv(queryset, file_obj, field_header_map=None,

# verbose_name defaults to the raw field name, so in either case
# this will produce a complete mapping of field names to column names
name_map = {field: field for field in field_names}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like it maps fields to themselves...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it does. field_names is a list, name_map is a key mapping field_names to themselves. Then, we overwrite some of these values with verbose_names.

if use_verbose_names:
name_map = {field.name: unicode(field.verbose_name)
for field in queryset.model._meta.fields
if field.name in field_names}
else:
name_map = {field: field for field in field_names}
name_map.update({field.name: unicode(field.verbose_name)
for field in queryset.model._meta.fields
if field.name in field_names})

# merge the custom field headers into the verbose/raw defaults, if provided
_field_header_map = field_header_map or {}
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setup(
name='django-queryset-csv',
version='0.2.3',
version='0.2.4',
description='A simple python module for writing querysets to csv',
long_description=open('README.md').read(),
author=author,
Expand Down
3 changes: 3 additions & 0 deletions test_app/djqscsv_tests/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from django.db import models

class Activity(models.Model):
name = models.CharField(max_length=50, verbose_name="Name of Activity")

class Person(models.Model):
name = models.CharField(max_length=50, verbose_name="Person's name")
address = models.CharField(max_length=255)
info = models.TextField(verbose_name="Info on Person")
hobby = models.ForeignKey(Activity)
60 changes: 34 additions & 26 deletions test_app/djqscsv_tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,33 +103,32 @@ def assertMatchesCsv(self, csv_file, expected_data):

self.assertTrue(iteration_happened, "The CSV does not contain data.")

BIGGEST_POSSIBLE_CSV = [
['\xef\xbb\xbfID', 'Person\'s name', 'address',
'Info on Person', 'hobby_id', 'hobby__name', 'Most Powerful'],
['1', 'vetch', 'iffish', 'wizard', '1', 'Doing Magic', '0'],
['2', 'nemmerle', 'roke', 'deceased arch mage', '2', 'Resting', '1'],
['3', 'ged', 'gont', 'former arch mage', '2', 'Resting', '1']]


class WriteCSVDataTests(CSVTestCase):

def setUp(self):
self.qs = create_people_and_get_queryset()

self.full_verbose_csv = [
['\xef\xbb\xbfID', 'Person\'s name', 'address', 'Info on Person'],
['1', 'vetch', 'iffish', 'wizard'],
['2', 'nemmerle', 'roke', 'deceased arch mage'],
['3', 'ged', 'gont', 'former arch mage']]
self.full_verbose_csv = [row[:5] for row in
CSVTestCase.BIGGEST_POSSIBLE_CSV]

self.full_csv = [['\xef\xbb\xbfid', 'name', 'address', 'info'],
['1', 'vetch', 'iffish', 'wizard'],
['2', 'nemmerle', 'roke', 'deceased arch mage'],
['3', 'ged', 'gont', 'former arch mage']]
self.full_csv = ([['\xef\xbb\xbfid', 'name', 'address', 'info', 'hobby_id']] +
self.full_verbose_csv[1:])

self.limited_verbose_csv = [
['\xef\xbb\xbfPerson\'s name', 'address', 'Info on Person'],
['vetch', 'iffish', 'wizard'],
['nemmerle', 'roke', 'deceased arch mage'],
['ged', 'gont', 'former arch mage']]
self.limited_verbose_csv = (
[['\xef\xbb\xbfPerson\'s name', 'address', 'Info on Person']] +
[row[1:-1] for row in self.full_verbose_csv[1:]])

self.limited_csv = [['\xef\xbb\xbfname', 'address', 'info'],
['vetch', 'iffish', 'wizard'],
['nemmerle', 'roke', 'deceased arch mage'],
['ged', 'gont', 'former arch mage']]
self.limited_csv = (
[['\xef\xbb\xbfname', 'address', 'info']] +
self.limited_verbose_csv[1:])

def test_write_csv_full_terse(self):
obj = StringIO()
Expand Down Expand Up @@ -195,22 +194,31 @@ def test_empty_queryset(self):
elif DJANGO_VERSION[:2] == (1, 6):
djqscsv.write_csv(qs, obj, use_verbose_names=False)
self.assertEqual(obj.getvalue(),
'\xef\xbb\xbfid,name,address,info\r\n')
'\xef\xbb\xbfid,name,address,info,hobby_id\r\n')

class WalkRelationshipTests(CSVTestCase):
def setUp(self):
self.qs = create_people_and_get_queryset()\
.values('id', 'name', 'address', 'info', 'hobby_id', 'hobby__name')
self.csv_with_related_data = [row[:6] for row in
CSVTestCase.BIGGEST_POSSIBLE_CSV]

def test_with_related(self):
obj = StringIO()
djqscsv.write_csv(self.qs, obj)
csv_file = filter(None, obj.getvalue().split('\n'))
self.assertMatchesCsv(csv_file, self.csv_with_related_data)


class OrderingTests(CSVTestCase):
def setUp(self):
self.qs = create_people_and_get_queryset().extra(
select={'Most Powerful':"info LIKE '%arch mage%'"})

self.csv_with_extra = [
['\xef\xbb\xbfID', 'Person\'s name', 'address',
'Info on Person', 'Most Powerful'],
['1', 'vetch', 'iffish', 'wizard', '0'],
['2', 'nemmerle', 'roke', 'deceased arch mage', '1'],
['3', 'ged', 'gont', 'former arch mage', '1']]
self.csv_with_extra = [row[:5] + row[6:] for row in
CSVTestCase.BIGGEST_POSSIBLE_CSV]

self.custom_order_csv = [[row[0], row[4]] + row[1:4]
self.custom_order_csv = [row[0:1] + row[5:6] + row[1:5]
for row in self.csv_with_extra]

def test_extra_select(self):
Expand Down
12 changes: 8 additions & 4 deletions test_app/djqscsv_tests/util.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from .models import Person
from .models import Person, Activity

def create_people_and_get_queryset():
Person.objects.create(name='vetch', address='iffish', info='wizard')
doing_magic = Activity.objects.create(name="Doing Magic")
resting = Activity.objects.create(name="Resting")

Person.objects.create(name='vetch', address='iffish',
info='wizard', hobby=doing_magic)
Person.objects.create(name='nemmerle', address='roke',
info='deceased arch mage')
info='deceased arch mage', hobby=resting)
Person.objects.create(name='ged', address='gont',
info='former arch mage')
info='former arch mage', hobby=resting)

return Person.objects.all()