from django import template

register = template.Library()

class TableNode(template.Node):
    def __init__(self, var, header_attr, cell_attr, max_cols):
        self.var = var
        self.header_attr = header_attr
        self.cell_attr = cell_attr
        self.max_cols = int(max_cols)

    def render(self, context):
        self.var = context[self.var][:]
        remaining = len(self.var)
        html = []
        lvl = 2
        while remaining >= self.max_cols:
            html.append(('\t'*lvl) + '<tr>')
            lvl = 2
            for i in range(self.max_cols):
                html.append('%s<th scope="col" align="center">%s</th>' % 
                (('\t'*lvl), str(getattr(self.var[i], self.header_attr))))
            lvl = 1
            html.append(('\t'*lvl) + '</tr>')
            html.append(('\t'*lvl) + '<tr>')
            lvl = 2
            for i in range(self.max_cols):
                html.append('%s<td align="center" >%s</td>' %
                (('\t'*lvl), str(getattr(self.var[0], self.cell_attr))))
                self.var.pop(0)
            lvl = 1
            html.append(('\t'*lvl) + '</tr>')
            remaining = len(self.var)
        else:
            lvl = 2
            for i in self.var:
                html.append('%s<th scope="col" align="center">%s</th>' %
                (('\t'*lvl), str(getattr(i, self.header_attr))))
            lvl = 1
            html.append(('\t'*lvl) + '</tr>')
            html.append(('\t'*lvl) + '<tr>')
            lvl = 2
            for i in self.var:
                html.append('%s<td align="center">%s</td>' %
                (('\t'*lvl), str(getattr(i, self.cell_attr))))
            lvl = 1
            html.append(('\t'*lvl) + '</tr>')
        return ('\n' + ('\t'*lvl)).join(html)

@register.tag(name='tablify')
def get_table(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, var, header_attr, cell_attr, max_cols = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires 4 arguments " % token.contents[0])
    return TableNode(var, header_attr, cell_attr, max_cols)