Skip to content

Instantly share code, notes, and snippets.

@echiesse
Created March 9, 2017 20:14
Show Gist options
  • Save echiesse/be1852139f633af93527f09ef6ca07f9 to your computer and use it in GitHub Desktop.
Save echiesse/be1852139f633af93527f09ef6ca07f9 to your computer and use it in GitHub Desktop.
Grid template tag for django
from django import template
import re
register = template.Library()
def isNumber(x):
return (type(x) is int) or (type(x) is float)
def grid_header_tag(parser, token):
columnNames = token.split_contents()
columnNames = map(lambda x : x[1:-1], columnNames[1:])
return GridHeaderNode(columnNames)
class GridHeaderNode(template.Node):
def __init__(self, columnNames):
self.columnNames = columnNames
def render(self, context):
ret = "<tr>"
for name in self.columnNames:
ret += "<th class='text-center'>" + name + "</th>"
ret += "</tr>"
return ret
def grid_data_tag(parser, token):
contents = token.split_contents()
dataVarName = contents[1]
columnVars = contents[2:]
return GridDataNode(dataVarName, columnVars)
class GridDataNode(template.Node):
def __init__(self, dataVarName, columnVars):
self.dataVarName = template.Variable(dataVarName)
self.columnVars = columnVars
def render(self, context):
data = self.dataVarName.resolve(context)
ret = ""
for line in data:
ret += "<tr>"
for varName in self.columnVars:
try:
varName, align = varName.split("|")
except:
align = None
val = getattr(line, varName)
attrs = ""
if callable(val):
val = val()
if isNumber(val):
attrs = "class='text-right'"
if align == "c":
attrs = "class='text-center'"
elif align == "l":
attrs = "class='text-left'"
elif align == "r":
attrs = "class='text-right'"
ret += "<td {} >{}</td>\n".format(attrs, val)
ret += "</tr>"
return ret
def grid_tag(parser, token):
nodeList = parser.parse(("endgrid", ))
parser.delete_first_token()
return GridNode(nodeList)
class GridNode(template.Node):
def __init__(self, nodeList):
self.nodeList = nodeList
def render(self, context):
ret = "<table class='table table-bordered'>"
for node in self.nodeList:
if type(node) is GridHeaderNode:
ret += "<thead>\n"
ret += node.render(context)
ret += "</thead>\n"
elif type(node) is GridDataNode:
ret += "<tbody>\n"
ret += node.render(context)
ret += "</tbody>\n"
ret += "</table>"
return ret
register.tag('grid', grid_tag)
register.tag('grid_header', grid_header_tag)
register.tag('grid_data', grid_data_tag)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment