diff --git a/djqscsv/djqscsv.py b/djqscsv/djqscsv.py index 3a685e6..7cfdeed 100644 --- a/djqscsv/djqscsv.py +++ b/djqscsv/djqscsv.py @@ -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} 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 {} diff --git a/setup.py b/setup.py index f81c657..e226881 100644 --- a/setup.py +++ b/setup.py @@ -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, diff --git a/test_app/djqscsv_tests/models.py b/test_app/djqscsv_tests/models.py index ec9c691..a46c639 100644 --- a/test_app/djqscsv_tests/models.py +++ b/test_app/djqscsv_tests/models.py @@ -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) diff --git a/test_app/djqscsv_tests/tests.py b/test_app/djqscsv_tests/tests.py index ba995b4..19ddc26 100644 --- a/test_app/djqscsv_tests/tests.py +++ b/test_app/djqscsv_tests/tests.py @@ -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() @@ -195,7 +194,20 @@ 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): @@ -203,14 +215,10 @@ 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): diff --git a/test_app/djqscsv_tests/util.py b/test_app/djqscsv_tests/util.py index ad1fd2e..d40c4fd 100644 --- a/test_app/djqscsv_tests/util.py +++ b/test_app/djqscsv_tests/util.py @@ -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()