def render_table_templatetag(): # ensure it works with a multi-order-by request = build_request('/') table = CountryTable(MEMORY_DATA, order_by=('name', 'population')) RequestConfig(request).configure(table) template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) root = parse(html) assert len(root.findall('.//thead/tr')) == 1 assert len(root.findall('.//thead/tr/th')) == 4 assert len(root.findall('.//tbody/tr')) == 4 assert len(root.findall('.//tbody/tr/td')) == 16 assert root.find( 'ul[@class="pagination"]/li[@class="cardinality"]').text == '4 items' # no data with no empty_text table = CountryTable([]) template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render( Context({ 'request': build_request('/'), 'table': table })) root = parse(html) assert len(root.findall('.//thead/tr')) == 1 assert len(root.findall('.//thead/tr/th')) == 4 assert len(root.findall('.//tbody/tr')) == 0 # no data WITH empty_text request = build_request('/') table = CountryTable([], empty_text='this table is empty') RequestConfig(request).configure(table) template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) root = parse(html) assert len(root.findall('.//thead/tr')) == 1 assert len(root.findall('.//thead/tr/th')) == 4 assert len(root.findall('.//tbody/tr')) == 1 assert len(root.findall('.//tbody/tr/td')) == 1 assert int(root.find('.//tbody/tr/td').attrib['colspan']) == len( root.findall('.//thead/tr/th')) assert root.find('.//tbody/tr/td').text == 'this table is empty' # variable that doesn't exist (issue #8) template = Template('{% load django_tables2 %}' '{% render_table this_doesnt_exist %}') with raises(ValueError): settings.DEBUG = True template.render(Context()) # Should still be noisy with debug off with raises(ValueError): settings.DEBUG = False template.render(Context())
def render_table_templatetag(): # ensure it works with a multi-order-by request = build_request('/') table = CountryTable(MEMORY_DATA, order_by=('name', 'population')) RequestConfig(request).configure(table) template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) root = parse(html) assert len(root.findall('.//thead/tr')) == 1 assert len(root.findall('.//thead/tr/th')) == 4 assert len(root.findall('.//tbody/tr')) == 4 assert len(root.findall('.//tbody/tr/td')) == 16 assert root.find('ul[@class="pagination"]/li[@class="cardinality"]').text == '4 items' # no data with no empty_text table = CountryTable([]) template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': build_request('/'), 'table': table})) root = parse(html) assert len(root.findall('.//thead/tr')) == 1 assert len(root.findall('.//thead/tr/th')) == 4 assert len(root.findall('.//tbody/tr')) == 0 # no data WITH empty_text request = build_request('/') table = CountryTable([], empty_text='this table is empty') RequestConfig(request).configure(table) template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) root = parse(html) assert len(root.findall('.//thead/tr')) == 1 assert len(root.findall('.//thead/tr/th')) == 4 assert len(root.findall('.//tbody/tr')) == 1 assert len(root.findall('.//tbody/tr/td')) == 1 assert int(root.find('.//tbody/tr/td').attrib['colspan']) == len(root.findall('.//thead/tr/th')) assert root.find('.//tbody/tr/td').text == 'this table is empty' # variable that doesn't exist (issue #8) template = Template('{% load django_tables2 %}' '{% render_table this_doesnt_exist %}') with raises(ValueError): with settings(DEBUG=True): template.render(Context()) # Should still be noisy with debug off with raises(ValueError): with settings(DEBUG=False): template.render(Context())
def unicode(): """Test LinkColumn""" # test unicode values + headings class UnicodeTable(tables.Table): first_name = tables.LinkColumn('person', args=[A('pk')]) last_name = tables.LinkColumn('person', args=[A('pk')], verbose_name=u'äÚ¨´ˆÁ˜¨ˆ˜˘Ú…Ò˚ˆπ∆ˆ´') dataset = [ { 'pk': 1, 'first_name': u'Brädley', 'last_name': u'∆yers' }, { 'pk': 2, 'first_name': u'Chr…s', 'last_name': u'DÒble' }, ] table = UnicodeTable(dataset) request = build_request('/some-url/') template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) assert u'Brädley' in html assert u'∆yers' in html assert u'Chr…s' in html assert u'DÒble' in html
def render_table_should_support_template_argument(): table = CountryTable(MEMORY_DATA, order_by=('name', 'population')) template = Template('{% load django_tables2 %}' '{% render_table table "dummy.html" %}') request = build_request('/') context = RequestContext(request, {'table': table}) assert template.render(context) == 'dummy template contents\n'
def render_table_db_queries(): render = lambda **kw: ( Template('{% load django_tables2 %}{% render_table table %}').render( Context(kw))) with database(): Person.objects.create(first_name="brad", last_name="ayers") Person.objects.create(first_name="stevie", last_name="armstrong") class PersonTable(tables.Table): class Meta: model = Person per_page = 1 with queries(count=2): # one query to check if there's anything to display: .count() # one query for page records: .all()[start:end] render(table=PersonTable(Person.objects.all())) with queries(count=2): # one query for pagination: .count() # one query for page records: .all()[start:end] request = build_request('/') table = PersonTable(Person.objects.all()) RequestConfig(request).configure(table) render(table=table, request=request)
def render_table_db_queries(): render = lambda **kw: (Template('{% load django_tables2 %}{% render_table table %}') .render(Context(kw))) with database(): Person.objects.create(first_name="brad", last_name="ayers") Person.objects.create(first_name="stevie", last_name="armstrong") class PersonTable(tables.Table): class Meta: model = Person per_page = 1 with queries(count=2): # one query to check if there's anything to display: .count() # one query for page records: .all()[start:end] render(table=PersonTable(Person.objects.all())) with queries(count=2): # one query for pagination: .count() # one query for page records: .all()[start:end] request = build_request('/') table = PersonTable(Person.objects.all()) RequestConfig(request).configure(table) render(table=table, request=request)
def silent_page_not_an_integer_error(table): request = build_request("/") paginator = (Fake("Paginator").expects("page").with_args(1)) table = (table.has_attr(paginator=paginator).expects("paginate").with_args( page="abc").raises(PageNotAnInteger)) RequestConfig(request, paginate={ "page": "abc", "silent": True }).configure(table)
def should_support_explicit_table_data(): class SimpleView(DispatchHookMixin, tables.SingleTableView): table_class = SimpleTable table_data = [{"name": "Queensland"}, {"name": "New South Wales"}, {"name": "Victoria"}] table_pagination = {"per_page": 1} model = Region # needed for ListView request = build_request("/") response, view = SimpleView.as_view()(request) assert view.get_table().paginator.num_pages == 3
def silent_empty_page_error(table): request = build_request("/") paginator = (Fake("Paginator").has_attr( num_pages=987).expects("page").with_args(987)) table = (table.has_attr(paginator=paginator).expects("paginate").with_args( page=123).raises(EmptyPage)) RequestConfig(request, paginate={ "page": 123, "silent": True }).configure(table)
def test_silent_page_not_an_integer_error(table): request = build_request("/") paginator = (Fake("Paginator") .expects("page").with_args(1)) table = (table .has_attr(paginator=paginator) .expects("paginate").with_args(page="abc") .raises(PageNotAnInteger)) RequestConfig(request, paginate={"page": "abc", "silent": True}).configure(table)
def test_view_should_support_pagination_options(): for name in ("Queensland", "New South Wales", "Victoria", "Tasmania"): Region.objects.create(name=name) class SimpleView(DispatchHookMixin, tables.SingleTableView): table_class = SimpleTable table_pagination = {"per_page": 1} model = Region # needed for ListView request = build_request('/') response, view = SimpleView.as_view()(request) assert view.get_table().paginator.num_pages == 4
def view_should_support_pagination_options(): for name in ("Queensland", "New South Wales", "Victoria", "Tasmania"): Region.objects.create(name=name) class SimpleView(DispatchHookMixin, tables.SingleTableView): table_class = SimpleTable table_pagination = {"per_page": 1} model = Region # needed for ListView request = build_request('/') response, view = SimpleView.as_view()(request) assert view.get_table().paginator.num_pages == 4
def test_silent_empty_page_error(table): request = build_request("/") paginator = (Fake("Paginator") .has_attr(num_pages=987) .expects("page").with_args(987)) table = (table .has_attr(paginator=paginator) .expects("paginate").with_args(page=123) .raises(EmptyPage)) RequestConfig(request, paginate={"page": 123, "silent": True}).configure(table)
def render_table_supports_queryset(): with database(): for name in ("Mackay", "Brisbane", "Maryborough"): Region.objects.create(name=name) template = Template('{% load django_tables2 %}{% render_table qs %}') html = template.render(Context({'qs': Region.objects.all(), 'request': build_request('/')})) root = parse(html) assert [e.text for e in root.findall('.//thead/tr/th/a')] == ["ID", "Name", "Mayor"] td = [[unicode(td.text) for td in tr.findall('td')] for tr in root.findall('.//tbody/tr')] db = [] for region in Region.objects.all(): db.append([unicode(region.id), region.name, "—"]) assert td == db
def test_link_text_excaping(): class CustomLinkTable(tables.Table): last_name = tables.LinkColumn('person', text=mark_safe('<i class="glyphicon glyphicon-pencil"></i>'), args=[A('pk')]) dataset = [ {'pk': 1, 'first_name': 'John', 'last_name': 'Doe'} ] table = CustomLinkTable(dataset) request = build_request('/some-url/') template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) assert '><i class="glyphicon glyphicon-pencil"></i></a>' in html
def test_render_table_supports_queryset(): for name in ("Mackay", "Brisbane", "Maryborough"): Region.objects.create(name=name) template = Template('{% load django_tables2 %}{% render_table qs %}') html = template.render(Context({'qs': Region.objects.all(), 'request': build_request('/')})) root = parse(html) assert [e.text for e in root.findall('.//thead/tr/th/a')] == ["ID", "name", "mayor"] td = [[td.text for td in tr.findall('td')] for tr in root.findall('.//tbody/tr')] db = [] for region in Region.objects.all(): db.append([six.text_type(region.id), region.name, "—"]) assert td == db
def test_link_text_excaping(): class CustomLinkTable(tables.Table): last_name = tables.LinkColumn( 'person', text=mark_safe('<i class="glyphicon glyphicon-pencil"></i>'), args=[A('pk')]) dataset = [{'pk': 1, 'first_name': 'John', 'last_name': 'Doe'}] table = CustomLinkTable(dataset) request = build_request('/some-url/') template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) assert '><i class="glyphicon glyphicon-pencil"></i></a>' in html
def test_link_text_custom_value(): class CustomLinkTable(tables.Table): first_name = tables.LinkColumn('person', text='foo::bar', args=[A('pk')]) last_name = tables.LinkColumn('person', text=lambda row: '%s %s' % (row['last_name'], row['first_name']), args=[A('pk')]) dataset = [ {'pk': 1, 'first_name': 'John', 'last_name': 'Doe'} ] table = CustomLinkTable(dataset) request = build_request('/some-url/') template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) assert 'foo::bar' in html assert 'Doe John' in html
def querystring_templatetag_supports_without(): context = Context({ "request": build_request('/?a=b&name=dog&c=5'), "a_var": "a", }) template = Template('{% load django_tables2 %}' '<b>{% querystring "name"="Brad" without a_var %}</b>') url = parse(template.render(context)).text qs = parse_qs(url[1:]) # trim the ? pylint: disable=C0103 assert set(qs.keys()) == set(["name", "c"]) # Try with only exclusions template = Template('{% load django_tables2 %}' '<b>{% querystring without "a" "name" %}</b>') url = parse(template.render(context)).text qs = parse_qs(url[1:]) # trim the ? pylint: disable=C0103 assert set(qs.keys()) == set(["c"])
def test_render_table_db_queries(self): Person.objects.create(first_name="brad", last_name="ayers") Person.objects.create(first_name="davina", last_name="adisusila") class PersonTable(tables.Table): class Meta: model = Person per_page = 1 with self.assertNumQueries(2): # one query for pagination: .count() # one query for page records: .all()[start:end] request = build_request('/') table = PersonTable(Person.objects.all()) RequestConfig(request).configure(table) # render (Template('{% load django_tables2 %}{% render_table table %}') .render(Context({'table': table, 'request': request})))
def test_link_text_custom_value(): class CustomLinkTable(tables.Table): first_name = tables.LinkColumn('person', text='foo::bar', args=[A('pk')]) last_name = tables.LinkColumn('person', text=lambda row: '%s %s' % (row['last_name'], row['first_name']), args=[A('pk')]) dataset = [{'pk': 1, 'first_name': 'John', 'last_name': 'Doe'}] table = CustomLinkTable(dataset) request = build_request('/some-url/') template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) assert 'foo::bar' in html assert 'Doe John' in html
def render_table_db_queries(): with database(): Person.objects.create(first_name="brad", last_name="ayers") Person.objects.create(first_name="stevie", last_name="armstrong") class PersonTable(tables.Table): class Meta: model = Person per_page = 1 with queries(count=2): # one query for pagination: .count() # one query for page records: .all()[start:end] request = build_request('/') table = PersonTable(Person.objects.all()) RequestConfig(request).configure(table) # render (Template('{% load django_tables2 %}{% render_table table %}') .render(Context({'table': table, 'request': request})))
def querystring_templatetag(): template = Template('{% load django_tables2 %}' '<b>{% querystring "name"="Brad" foo.bar=value %}</b>') # Should be something like: <root>?name=Brad&a=b&c=5&age=21</root> xml = template.render(Context({ "request": build_request('/?a=b&name=dog&c=5'), "foo": {"bar": "age"}, "value": 21, })) # Ensure it's valid XML, retrieve the URL url = parse(xml).text qs = parse_qs(url[1:]) # everything after the ? pylint: disable=C0103 assert qs["name"] == ["Brad"] assert qs["age"] == ["21"] assert qs["a"] == ["b"] assert qs["c"] == ["5"]
def test_querystring_templatetag(): template = Template('{% load django_tables2 %}' '<b>{% querystring "name"="Brad" foo.bar=value %}</b>') # Should be something like: <root>?name=Brad&a=b&c=5&age=21</root> xml = template.render(Context({ "request": build_request('/?a=b&name=dog&c=5'), "foo": {"bar": "age"}, "value": 21, })) # Ensure it's valid XML, retrieve the URL url = parse(xml).text qs = parse_qs(url[1:]) # everything after the ? pylint: disable=C0103 assert qs["name"] == ["Brad"] assert qs["age"] == ["21"] assert qs["a"] == ["b"] assert qs["c"] == ["5"]
def should_support_explicit_table_data(): class SimpleView(DispatchHookMixin, tables.SingleTableView): table_class = SimpleTable table_data = [ { "name": "Queensland" }, { "name": "New South Wales" }, { "name": "Victoria" }, ] table_pagination = {"per_page": 1} model = Region # needed for ListView request = build_request('/') response, view = SimpleView.as_view()(request) assert view.get_table().paginator.num_pages == 3
def test_unicode(): """Test LinkColumn""" # test unicode values + headings class UnicodeTable(tables.Table): first_name = tables.LinkColumn("person", args=[A("pk")]) last_name = tables.LinkColumn("person", args=[A("pk")], verbose_name="äÚ¨´ˆÁ˜¨ˆ˜˘Ú…Ò˚ˆπ∆ˆ´") dataset = [ {"pk": 1, "first_name": "Brädley", "last_name": "∆yers"}, {"pk": 2, "first_name": "Chr…s", "last_name": "DÒble"}, ] table = UnicodeTable(dataset) request = build_request("/some-url/") template = Template("{% load django_tables2 %}{% render_table table %}") html = template.render(Context({"request": request, "table": table})) assert "Brädley" in html assert "∆yers" in html assert "Chr…s" in html assert "DÒble" in html
def test_unicode(): """Test LinkColumn""" # test unicode values + headings class UnicodeTable(tables.Table): first_name = tables.LinkColumn('person', args=[A('pk')]) last_name = tables.LinkColumn('person', args=[A('pk')], verbose_name='äÚ¨´ˆÁ˜¨ˆ˜˘Ú…Ò˚ˆπ∆ˆ´') dataset = [ {'pk': 1, 'first_name': 'Brädley', 'last_name': '∆yers'}, {'pk': 2, 'first_name': 'Chr…s', 'last_name': 'DÒble'}, ] table = UnicodeTable(dataset) request = build_request('/some-url/') template = Template('{% load django_tables2 %}{% render_table table %}') html = template.render(Context({'request': request, 'table': table})) assert 'Brädley' in html assert '∆yers' in html assert 'Chr…s' in html assert 'DÒble' in html
def no_querystring(table): request = build_request("/") table = table.has_attr(order_by=NOTSET).expects("paginate") RequestConfig(request).configure(table) assert table.order_by is NOTSET
def partial_querystring(table): request = build_request("/?page=1&sort=abc") table = (table.expects("paginate").with_args( page=1, per_page=5).expects("order_by").with_args("abc")) RequestConfig(request, paginate={"per_page": 5}).configure(table)
def full_querystring(table): request = build_request("/?page=1&per_page=5&sort=abc") table = (table.expects("paginate").with_args( page=1, per_page=5).expects("order_by").with_args("abc")) RequestConfig(request).configure(table)
def test_no_querystring(table): request = build_request("/") table = table.has_attr(order_by=NOTSET).expects("paginate") RequestConfig(request).configure(table) assert table.order_by is NOTSET
def full_querystring(table): request = build_request("/?page=1&per_page=5&sort=abc") table = (table .expects("paginate").with_args(page=1, per_page=5) .expects("order_by").with_args("abc")) RequestConfig(request).configure(table)
def test_partial_querystring(table): request = build_request("/?page=1&sort=abc") table = (table .expects("paginate").with_args(page=1, per_page=5) .expects("order_by").with_args("abc")) RequestConfig(request, paginate={"per_page": 5}).configure(table)