model column auto generation can be disabled now
authorMichael Elsdörfer <michael@elsdoerfer.info>
Thu, 19 Jun 2008 16:26:16 +0000 (16:26 +0000)
committerMichael Elsdörfer <michael@elsdoerfer.info>
Thu, 19 Jun 2008 16:26:16 +0000 (16:26 +0000)
README
django_tables/models.py
tests/test_basic.py
tests/test_models.py

diff --git a/README b/README
index 38153ea7e1b36b2f818c75a29b07bd8967256afd..2a8c6285ebd7bfc9f335b428760bd4f7bd6fbe65 100644 (file)
--- a/README
+++ b/README
@@ -140,6 +140,10 @@ If you are using model inheritance, then the following also works:
 Note that while you can pass any model, it really only makes sense if the\r
 model also provides fields for the columns you have defined.\r
 \r
+If you just want to use ModelTables, but without auto-generated columns,\r
+you do not have to list all model fields in the ``exclude`` Meta option.\r
+Instead, simply don't specify a model.\r
+\r
 Custom Columns\r
 ~~~~~~~~~~~~~~\r
 \r
index 1747442ee845358a98bbef43afebe5c304bc2fb5..b0587e3cee21ed0baea1024da8ef11f07b96cf88 100644 (file)
@@ -71,8 +71,11 @@ class BaseModelTable(BaseTable):
     """\r
     def __init__(self, data=None, *args, **kwargs):\r
         if data == None:\r
+            if self._meta.model is None:\r
+                raise ValueError('Table without a model association needs '\r
+                    'to be initialized with data')\r
             self.queryset = self._meta.model._default_manager.all()\r
-        elif isinstance(data, models.Model):\r
+        elif hasattr(data, '_default_manager'): # saves us db.models import\r
             self.queryset = data._default_manager.all()\r
         else:\r
             self.queryset = data\r
index a3b8295732f94bd1e14dc9e7606392337132c9fa..08dd01596b1a3116b5683eed180c006243220214 100644 (file)
@@ -68,12 +68,12 @@ def test_basic():
         assert not 'id' in r\r
         # missing data is available as default\r
         assert 'answer' in r\r
-        assert r['answer'].value == 42   # note: different from prev. line!\r
+        assert r['answer'] == 42   # note: different from prev. line!\r
 \r
         # all that still works when name overrides are used\r
         assert not 'c' in r\r
         assert 'count' in r\r
-        assert r['count'].value == 1\r
+        assert r['count'] == 1\r
 \r
     # changing an instance's base_columns does not change the class\r
     assert id(books.base_columns) != id(BookTable.base_columns)\r
index 1f01d83347ae2aa35e61e65732696202736c8ff0..d04dc19b17dba7cbcdbdde04cd2e620d898d9c71 100644 (file)
@@ -86,6 +86,7 @@ def test_declaration():
 def test_basic():\r
     """Some tests here are copied from ``test_basic.py`` but need to be\r
     rerun with a ModelTable, as the implementation is different."""\r
+\r
     class CountryTable(tables.ModelTable):\r
         null = tables.Column(default="foo")\r
         tld = tables.Column(name="domain")\r
@@ -94,21 +95,35 @@ def test_basic():
             exclude = ('id',)\r
     countries = CountryTable()\r
 \r
-    for r in countries.rows:\r
-        # "normal" fields exist\r
-        assert 'name' in r\r
-        # unknown fields are removed/not accessible\r
-        assert not 'does-not-exist' in r\r
-        # ...so are excluded fields\r
-        assert not 'id' in r\r
-        # missing data is available with default values\r
-        assert 'null' in r\r
-        assert r['null'] == "foo"   # note: different from prev. line!\r
-\r
-        # all that still works when name overrides are used\r
-        assert not 'tld' in r\r
-        assert 'domain' in r\r
-        assert len(r['domain']) == 2   # valid country tld\r
+    def test_country_table(table):\r
+        for r in table.rows:\r
+            # "normal" fields exist\r
+            assert 'name' in r\r
+            # unknown fields are removed/not accessible\r
+            assert not 'does-not-exist' in r\r
+            # ...so are excluded fields\r
+            assert not 'id' in r\r
+            # missing data is available with default values\r
+            assert 'null' in r\r
+            assert r['null'] == "foo"   # note: different from prev. line!\r
+\r
+            # all that still works when name overrides are used\r
+            assert not 'tld' in r\r
+            assert 'domain' in r\r
+            assert len(r['domain']) == 2   # valid country tld\r
+    test_country_table(countries)\r
+\r
+    # repeat the avove tests with a table that is not associated with a\r
+    # model, and all columns being created manually.\r
+    class CountryTable(tables.ModelTable):\r
+        name = tables.Column()\r
+        population = tables.Column()\r
+        capital = tables.Column()\r
+        system = tables.Column()\r
+        null = tables.Column(default="foo")\r
+        tld = tables.Column(name="domain")\r
+    countries = CountryTable(Country)\r
+    test_country_table(countries)\r
 \r
     # make sure the row and column caches work for model tables as well\r
     assert id(list(countries.columns)[0]) == id(list(countries.columns)[0])\r
@@ -158,5 +173,4 @@ def test_pagination():
 # TODO: pagination\r
 # TODO: support function column sources both for modeltables (methods on model) and static tables (functions in dict)\r
 # TODO: manual base columns change -> update() call (add as example in docstr here) -> rebuild snapshot: is row cache, column cache etc. reset?\r
-# TODO: throw an exception on invalid order_by\r
-# TODO: option to skip model table generation (leave off model option?)
\ No newline at end of file
+# TODO: throw an exception on invalid order_by
\ No newline at end of file