diff --git a/.travis.yml b/.travis.yml index 0e56064..876e234 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: python python: + - "2.6" - "2.7" env: - DJANGO=1.5 RUNNER="coverage run --source=djqscsv" SUCCESS="coveralls" diff --git a/djqscsv/djqscsv.py b/djqscsv/djqscsv.py index 7cfdeed..c62d075 100644 --- a/djqscsv/djqscsv.py +++ b/djqscsv/djqscsv.py @@ -88,18 +88,19 @@ 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} + name_map = dict((field, field) for field in field_names) if use_verbose_names: - name_map.update({field.name: unicode(field.verbose_name) - for field in queryset.model._meta.fields - if field.name in field_names}) + name_map.update( + dict((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 {} merged_header_map = name_map.copy() merged_header_map.update(_field_header_map) if extra_columns: - merged_header_map.update({k: k for k in extra_columns}) + merged_header_map.update(dict((k, k) for k in extra_columns)) writer.writerow(merged_header_map) for record in values_qs: diff --git a/setup.py b/setup.py index 66cfc12..b0eb161 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setup( name='django-queryset-csv', - version='0.2.7', + version='0.2.8', description='A simple python module for writing querysets to csv', long_description=open('README.rst').read(), author=author, diff --git a/test_app/djqscsv_tests/models.py b/test_app/djqscsv_tests/models.py index a46c639..97062db 100644 --- a/test_app/djqscsv_tests/models.py +++ b/test_app/djqscsv_tests/models.py @@ -8,3 +8,6 @@ class Person(models.Model): address = models.CharField(max_length=255) info = models.TextField(verbose_name="Info on Person") hobby = models.ForeignKey(Activity) + + def __unicode__(self): + return self.name diff --git a/test_app/djqscsv_tests/tests/test_csv_creation.py b/test_app/djqscsv_tests/tests/test_csv_creation.py index 43f1914..cbd3171 100644 --- a/test_app/djqscsv_tests/tests/test_csv_creation.py +++ b/test_app/djqscsv_tests/tests/test_csv_creation.py @@ -170,8 +170,38 @@ def test_with_related(self): self.assertQuerySetBecomesCsv(qs, self.FULL_PERSON_CSV_WITH_RELATED) +class ColumnOrderingTests(CSVTestCase): + def setUp(self): + self.qs = create_people_and_get_queryset() + + def test_custom_column_order(self): + ordered_csv = SELECT(self.BASE_CSV, + 'hobby_id', + 'info', + 'name', + 'address') + + with self.assertRaises(AssertionError): + self.assertQuerySetBecomesCsv(self.qs, ordered_csv) + + qs = self.qs.values('hobby_id', 'info', 'name', 'address') + + self.assertQuerySetBecomesCsv(qs, ordered_csv, + use_verbose_names=False) + + def test_no_values_matches_models_file(self): + csv = SELECT(self.BASE_CSV, + 'id', + 'name', + 'address', + 'info', + 'hobby_id') + + self.assertQuerySetBecomesCsv(self.qs, csv, + use_verbose_names=False) + -class OrderingTests(CSVTestCase): +class ExtraOrderingTests(CSVTestCase): def setUp(self): self.qs = create_people_and_get_queryset().extra( diff --git a/test_app/djqscsv_tests/util.py b/test_app/djqscsv_tests/util.py index d40c4fd..8c28402 100644 --- a/test_app/djqscsv_tests/util.py +++ b/test_app/djqscsv_tests/util.py @@ -1,15 +1,15 @@ from .models import Person, Activity def create_people_and_get_queryset(): - 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', hobby=resting) - Person.objects.create(name='ged', address='gont', - info='former arch mage', hobby=resting) + doing_magic, _ = Activity.objects.get_or_create(name="Doing Magic") + resting, _ = Activity.objects.get_or_create(name="Resting") + + Person.objects.get_or_create(name='vetch', address='iffish', + info='wizard', hobby=doing_magic) + Person.objects.get_or_create(name='nemmerle', address='roke', + info='deceased arch mage', hobby=resting) + Person.objects.get_or_create(name='ged', address='gont', + info='former arch mage', hobby=resting) return Person.objects.all()