From ab28669c31a7adaf0f6a505a906f753aec464a8d Mon Sep 17 00:00:00 2001 From: Jan Pieter Waagmeester Date: Mon, 27 Feb 2017 13:31:34 +0100 Subject: [PATCH] Revert removing __iter__() from TableData, (removed in 8fe9826429e6945a9258bc181fcbd711b282dba9). This fixes #427, maybe also #421 and #361 --- django_tables2/tables.py | 11 +++++++- tests/app/models.py | 6 ---- tests/test_models.py | 58 ++++++-------------------------------- tests/test_templatetags.py | 8 ++---- 4 files changed, 22 insertions(+), 61 deletions(-) diff --git a/django_tables2/tables.py b/django_tables2/tables.py index e6a3720b..9c2f2d66 100644 --- a/django_tables2/tables.py +++ b/django_tables2/tables.py @@ -33,6 +33,14 @@ def __getitem__(self, key): ''' return self.data[key] + def __iter__(self): + ''' + for ... in ... default to using this. There's a bug in Django 1.3 + with indexing into querysets, so this side-steps that problem (as well + as just being a better way to iterate). + ''' + return iter(self.data) + def get_model(self): return getattr(self.data, 'model', None) @@ -190,7 +198,7 @@ def order_by(self, aliases): # custom ordering if modified_any: - return True + return # Traditional ordering if accessors: @@ -579,6 +587,7 @@ def paginate(self, klass=Paginator, per_page=None, page=1, *args, **kwargs): `~django.core.paginator.PageNotAnInteger`) may be raised from this method and should be handled by the caller. ''' + per_page = per_page or self._meta.per_page self.paginator = klass(self.rows, per_page, *args, **kwargs) self.page = self.paginator.page(page) diff --git a/tests/app/models.py b/tests/app/models.py index fee7ad5d..4a5580b9 100644 --- a/tests/app/models.py +++ b/tests/app/models.py @@ -111,12 +111,6 @@ class PersonInformation(models.Model): ) -class Player(models.Model): - person = models.ForeignKey(Person) - created = models.DateTimeField(auto_now_add=True) - score = models.PositiveIntegerField() - - # -- haystack ----------------------------------------------------------------- diff --git a/tests/test_models.py b/tests/test_models.py index 45c64bd3..8bdd37b7 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,15 +1,12 @@ # coding: utf-8 -from random import randint - import django_tables2 as tables +import pytest from django.db.models.functions import Length from django.utils import six from django_tables2 import RequestConfig -import pytest - -from .app.models import Occupation, Person, PersonProxy, Player -from .utils import build_request +from .app.models import Occupation, Person, PersonProxy +from .utils import assertNumQueries, build_request pytestmark = pytest.mark.django_db request = build_request('/') @@ -406,58 +403,21 @@ class Meta: assert Person.objects.get(pk=person1.pk) == person1 assert Person.objects.get(pk=person2.pk) == person2 - -def test_single_query_for_non_paginated_table(settings): +def test_single_query_for_non_paginated_table(): ''' A non-paginated table should not generate a query for each row, but only - one query to count the rows and one to fetch the rows. + one query fetch the rows. ''' - from django.db import connection - settings.DEBUG = True - for i in range(10): - Person.objects.create(first_name='Bob %d' % randint(0, 200), last_name='Builder') - - num_queries_before = len(connection.queries) + Person.objects.create(first_name='Bob %d' % i, last_name='Builder') class PersonTable(tables.Table): class Meta: model = Person fields = ('first_name', 'last_name') + order_by = ('last_name', 'first_name') table = PersonTable(Person.objects.all()) - request = build_request('/') - RequestConfig(request, paginate=False).configure(table) - table.as_html(request) - - # print '\n'.join(q['sql'] for q in connection.queries) - assert len(connection.queries) - num_queries_before == 2 - - -def test_issue_361(settings): - settings.DEBUG = True - - bob = Person.objects.create(first_name='Bob', last_name='Builder') - eve = Person.objects.create(first_name='Eve', last_name='Dropper') - - for i in range(10): - Player.objects.create(person=bob, score=randint(0, 200)) - Player.objects.create(person=eve, score=randint(200, 400)) - Player.objects.create(person=bob, score=5) - Player.objects.create(person=eve, score=5) - - class UserPlayerTable(tables.Table): - class Meta: - model = Player - fields = ('person.name', 'score',) - order_by = ['score', 'person.first_name'] - orderable = False - - queryset = Player.objects.filter(score=5) - - table = UserPlayerTable(queryset) - RequestConfig(request, paginate={'per_page': per_page}).configure(table) - html = table.as_html(request) - # count the number of rows, subtract one for the header - assert (html.count('