* Fixed bug with LinkColumn when using unicode. Thanks kwevej
authorBradley Ayers <bradley.ayers@gmail.com>
Sat, 14 May 2011 11:05:22 +0000 (21:05 +1000)
committerBradley Ayers <bradley.ayers@gmail.com>
Sat, 14 May 2011 11:05:22 +0000 (21:05 +1000)
* Bumped version to 0.4.3

django_tables/columns.py
django_tables/templatetags/django_tables.py
django_tables/utils.py
docs/conf.py
setup.py
tests/__init__.py
tests/columns.py
tests/testapp/urls.py [new file with mode: 0644]
tests/testapp/views.py [new file with mode: 0644]

index bd7ce92ece1c87f70e39007092ed6819b3ef1091..b546ba8ff956bd910c9cf3661e7bf2a0e209aece 100644 (file)
@@ -52,7 +52,7 @@ class Column(object):
                  visible=True, sortable=None):
         if not (accessor is None or isinstance(accessor, basestring) or
                 callable(accessor)):
-            raise TypeError('accessor must be a string or callable, not %s' %
+            raise TypeError(u'accessor must be a string or callable, not %s' %
                             accessor.__class__.__name__)
         if callable(accessor) and default is not None:
             raise TypeError('accessor must be string when default is used, not'
@@ -151,7 +151,7 @@ class CheckBoxColumn(Column):
             'type': 'checkbox',
         })
         attrs.update(self.header_attrs)
-        return mark_safe('<input %s/>' % attrs.as_html())
+        return mark_safe(u'<input %s/>' % attrs.as_html())
 
     def render(self, value, bound_column):
         attrs = AttributeDict({
@@ -160,7 +160,7 @@ class CheckBoxColumn(Column):
             'value': value
         })
         attrs.update(self.attrs)
-        return mark_safe('<input %s/>' % attrs.as_html())
+        return mark_safe(u'<input %s/>' % attrs.as_html())
 
 
 class LinkColumn(Column):
@@ -221,7 +221,9 @@ class LinkColumn(Column):
         self.attrs = attrs or {}
 
     def render(self, value, record, bound_column):
-        params = {}  # args for reverse()
+        # The following params + if statements create the arguments required to
+        # pass to Django's reverse() function.
+        params = {}
         if self.viewname:
             params['viewname'] = (self.viewname.resolve(record)
                                  if isinstance(self.viewname, A)
@@ -244,7 +246,7 @@ class LinkColumn(Column):
                 if isinstance(value, A):
                     params['current_app'][key] = value.resolve(record)
         url = reverse(**params)
-        html = '<a href="{url}" {attrs}>{value}</a>'.format(
+        html = u'<a href="{url}" {attrs}>{value}</a>'.format(
             url=reverse(**params),
             attrs=AttributeDict(self.attrs).as_html(),
             value=value
@@ -537,5 +539,5 @@ class BoundColumns(object):
         elif isinstance(index, basestring):
             return self._columns[index]
         else:
-            raise TypeError('row indices must be integers or str, not %s' %
+            raise TypeError(u'row indices must be integers or str, not %s' %
                             index.__class__.__name__)
index 533cc268a919d10dcc822e60760587ec66cf3f9b..b455eaee0dd0ca08629a9ef9d2b869e582f3888c 100644 (file)
@@ -109,5 +109,6 @@ def render_table(parser, token):
         _, table_var_name = token.contents.split()
     except ValueError:
         raise (template.TemplateSyntaxError,
-               '%r tag requires a single argument' % token.contents.split()[0])
+               u'%r tag requires a single argument'
+               % token.contents.split()[0])
     return RenderTableNode(table_var_name)
index 405f4471274b0ca33eae65c00b525dfdd1d7822a..93107ddf7fc7c0732eacce28aaf8b0c51b77ac0d 100644 (file)
@@ -270,5 +270,5 @@ class AttributeDict(dict):
         :rtype: :class:`~django.utils.safestring.SafeUnicode` object
 
         """
-        return mark_safe(' '.join(['%s="%s"' % (k, escape(v))
+        return mark_safe(' '.join([u'%s="%s"' % (k, escape(v))
                                    for k, v in self.iteritems()]))
index a953d498b1daf149239b629c098774305cb7027f..e83fc4ff44fe53e673a80218ca9c396843b05180 100644 (file)
@@ -50,9 +50,9 @@ project = u'django-tables'
 # built documents.
 #
 # The short X.Y version.
-version = '0.4.2'
+version = '0.4.3'
 # The full version, including alpha/beta/rc tags.
-release = '0.4.2'
+release = '0.4.3'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
index 5e7d23091706b773575cad7b40cbb671fdd5f0e2..d6f4170d64aa9b29cc71b150a688969a174e76ac 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
 
 setup(
     name='django-tables',
-    version='0.4.2',
+    version='0.4.3',
     description='Table framework for Django',
 
     author='Bradley Ayers',
index 0774bec03bbe9301cceba3f6e656d180f1279e8f..4f2c71be08173ca8de349bc9edc367825253b007 100644 (file)
@@ -18,7 +18,8 @@ settings.configure(
     INSTALLED_APPS = [
         'tests.testapp',
         'django_tables',
-    ]
+    ],
+    ROOT_URLCONF = 'tests.testapp.urls',
 )
 
 
index d429ec961d8bde0532697e3f5842d44bf390c23e..ba87e6e447273566c88a404382587cbfcd56a03b 100644 (file)
@@ -1,7 +1,10 @@
+# -*- coding: utf-8 -*-
 """Test the core table functionality."""
 from attest import Tests, Assert
+from django.test.client import RequestFactory
+from django.template import Context, Template
 import django_tables as tables
-from django_tables import utils
+from django_tables import utils, A
 
 
 columns = Tests()
@@ -15,7 +18,7 @@ def sortable():
 
     class SimpleTable(tables.Table):
         name = tables.Column()
-        
+
         class Meta:
             sortable = False
     Assert(SimpleTable([]).columns['name'].sortable) is False
@@ -28,3 +31,27 @@ def sortable():
     Assert(SimpleTable([]).columns['name'].sortable) is True
 
 
+@columns.test
+def link_column():
+    """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 = RequestFactory().get('/some-url/')
+    template = Template('{% load django_tables %}{% 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)
+
+
diff --git a/tests/testapp/urls.py b/tests/testapp/urls.py
new file mode 100644 (file)
index 0000000..99fec2c
--- /dev/null
@@ -0,0 +1,8 @@
+from django.conf.urls.defaults import patterns, include, url
+from . import views
+
+
+urlpatterns = patterns('',
+    url(r'^people/(\d+)/$',      views.person,     name='person'),
+    url(r'^occupations/(\d+)/$', views.occupation, name='occupation'),
+)
diff --git a/tests/testapp/views.py b/tests/testapp/views.py
new file mode 100644 (file)
index 0000000..036b05e
--- /dev/null
@@ -0,0 +1,17 @@
+from django.shortcuts import get_object_or_404
+from django.http import HttpResponse
+from .models import Person, Occupation
+
+
+def person(request, pk):
+    """A really simple view to provide an endpoint for the 'person' URL."""
+    person = get_object_or_404(Person, pk=pk)
+    return HttpResponse('Person: %s' % person)
+
+
+def occupation(request, pk):
+    """
+    Another really simple view to provide an endpoint for the 'occupation' URL.
+    """
+    occupation = get_object_or_404(Occupation, pk=pk)
+    return HttpResponse('Occupation: %s' % occupation)