Warning: Can't synchronize with repository "(default)" (Unsupported version control system "svn": No module named svn). Look in the Trac log for more information.

Ticket #2478: turbogears.patch

File turbogears.patch, 4.2 KB (added by xaka, 2 years ago)
  • turbogears/widgets/tests/test_datagrid.py

     
    109109            (44, "Pablo Martelli", "Brazil")] 
    110110        output = grid.render(data) 
    111111        assert '<td>Joe Doe</td><td>Great Britain</td><td>23</td>' in output 
     112 
     113    def test_another_attrwrapper_implementation(self): 
     114        class TestDataGrid(DataGrid): 
     115            class attrwrapper(object): 
     116                def __init__(self, name): 
     117                    self.name = int(name) 
     118        grid = TestDataGrid(fields=[ 
     119            ('Field 1', 0) 
     120        ]) 
     121        assert isinstance(grid.columns[0].getter, TestDataGrid.attrwrapper) 
     122 
     123    def test_attrwrapper_with_list(self): 
     124        grid = DataGrid(fields=[ 
     125            ('Field 1', 0), 
     126            ('Field 2', 1) 
     127        ]) 
     128        row = [0, 1] 
     129        assert grid.columns[0].getter(row) == 0 
     130        assert grid.columns[1].getter(row) == 1 
     131     
     132    def test_attrwrapper_with_tuple(self): 
     133        grid = DataGrid(fields=[ 
     134            ('Field 1', 0), 
     135            ('Field 2', 1) 
     136        ]) 
     137        row = (0, 1) 
     138        assert grid.columns[0].getter(row) == 0 
     139        assert grid.columns[1].getter(row) == 1 
     140     
     141    def test_attrwrapper_with_dict(self): 
     142        grid = DataGrid(fields=[ 
     143            ('Field 1', 'key1'), 
     144            ('Field 2', 'key2') 
     145        ]) 
     146        row = dict(key1='val1', key2='val2') 
     147        assert grid.columns[0].getter(row) == row['key1'] 
     148        assert grid.columns[1].getter(row) == row['key2'] 
  • turbogears/widgets/datagrid.py

     
    3939          - options, which is a way to carry arbitrary user-defined data 
    4040 
    4141        """ 
    42         def __init__(self, name, getter=None, title=None, options=None): 
    43             if not name: 
     42        def __init__(self, name, getter=None, title=None, options=None, attrwrapper=None): 
     43            if name is None: 
    4444                raise ValueError, 'name is required' 
    45             if getter: 
     45 
     46            if attrwrapper is None: 
     47                attrwrapper = DataGrid.attrwrapper 
     48 
     49            if getter is None: 
     50                self.getter = attrwrapper(name) 
     51            else: 
    4652                if callable(getter): 
    4753                    self.getter = getter 
    4854                else: # assume it's an attribute name 
    49                     self.getter = DataGrid.attrwrapper(getter) 
    50             else: 
    51                 self.getter = DataGrid.attrwrapper(name) 
     55                    self.getter = attrwrapper(getter) 
    5256            self.name = name 
    5357            self.title = title is None and name.capitalize() or title 
    5458            self.options = options or {} 
     
    7175 
    7276        """ 
    7377        def __init__(self, name): 
    74             assert isinstance(name, str) 
    7578            self.name = name 
     79         
    7680        def __call__(self, obj): 
     81            if isinstance(obj, (list, tuple)): 
     82                return obj[int(self.name)] 
     83 
     84            if isinstance(obj, dict): 
     85                return obj[self.name] 
     86 
    7787            for name in self.name.split('.'): 
    7888                obj = getattr(obj, name) 
    7989            return obj 
     
    133143        names = set() # keep track of names to ensure there are no dups 
    134144        for n, col in enumerate(fields): 
    135145            if not isinstance(col, self.Column): 
    136                 if isinstance(col, str) or callable(col): 
     146                if isinstance(col, (basestring, int)) or callable(col): 
    137147                    name_or_f = col 
    138148                    title = options = None 
    139149                else: 
     
    143153                    except IndexError: 
    144154                        options = None 
    145155                name = 'column-' + str(n) 
    146                 col = self.Column(name, name_or_f, title, options) 
     156                col = self.Column(name, name_or_f, title, options, self.attrwrapper) 
    147157            if col.name in names: 
    148158                raise ValueError('Duplicate column name: %s' % name) 
    149159            columns.append(col)