* Added pagination for admin pages (domains, mailboxes, etc.)

* Code refactoring

see #76
This commit is contained in:
Antoine Nguyen
2011-07-26 14:53:43 +02:00
parent ee6d9554af
commit 81a03d6c65
19 changed files with 381 additions and 226 deletions
+3 -2
View File
@@ -107,14 +107,15 @@ class EmailListing:
return render_to_string("common/navbar.html", context)
def fetch(self, request, id_start, id_stop):
table = self.tbltype(self.mbc.fetch(start=id_start, stop=id_stop,
table = self.tbltype(request,
self.mbc.fetch(start=id_start, stop=id_stop,
folder=self.folder,
nbelems=self.elems_per_page))
tpl = Template("""
<form method="POST" id="listingform">
{{ table }}
</form>""")
return tpl.render(Context({"table" : table.render(request)}))
return tpl.render(Context({"table" : table.render()}))
def render(self, request, pageid=1, **kwargs):
listing = ""
+71 -7
View File
@@ -48,22 +48,46 @@ class DivColumn(Column):
def render(self):
return "<div>&nbsp;</div>"
class ActionColumn(Column):
def render(self, fct, user, rowid):
return fct(user, rowid)
class Table(object):
tableid = ""
def __init__(self, rows={}):
def __init__(self, request, rows={}):
self.columns = []
for m in inspect.getmembers(self):
if isinstance(m[1], Column):
self.request = request
try:
order = getattr(self, "cols_order")
except AttributeError:
for m in inspect.getmembers(self):
if isinstance(m[1], Column):
try:
if getattr(m[1], "first"):
self.columns = [m[1]] + self.columns
except AttributeError:
self.columns += [m[1]]
else:
for colname in order:
try:
if getattr(m[1], "first"):
self.columns = [m[1]] + self.columns
col = getattr(self, colname)
except AttributeError:
self.columns += [m[1]]
continue
if not isinstance(col, Column):
continue
self.columns += [col]
if rows != {}:
self.populate(rows)
def populate(self, rows):
self.rows = []
trcpt = 0
for row in rows:
nrow = {"id" : row[self.idkey], "cols" : [], "trcpt" : trcpt}
if row.has_key("options"):
nrow["options"] = row["options"]
for c in self.columns:
newcol = {"name" : c.name}
for key in ["width", "align", "cssclass"]:
@@ -88,6 +112,9 @@ class Table(object):
elif isinstance(c, DivColumn):
newcol["value"] = c.render()
newcol["safe"] = True
elif isinstance(c, ActionColumn):
newcol["value"] = c.render(c.defvalue, self.request.user, nrow["id"])
newcol["safe"] = True
elif row.has_key(c.name):
if "class" in row.keys():
newcol["cssclass"] += newcol["cssclass"] != "" \
@@ -96,11 +123,48 @@ class Table(object):
newcol["value"] = self.parse(c.name, row[c.name])
except AttributeError:
newcol["value"] = row[c.name]
try:
limit = getattr(c, "limit")
if len(newcol["value"]) > limit:
newcol["value"] = newcol["value"][0:limit] + "..."
except AttributeError:
pass
try:
newcol["safe"] = getattr(c, "safe")
except AttributeError:
pass
nrow["cols"] += [newcol]
self.rows += [nrow]
trcpt += 1
def _rows_from_model(self, objects):
rows = []
for obj in objects:
nrow = {}
try:
idkey = getattr(self, "idkey")
nrow[idkey] = getattr(obj, idkey)
except AttributeError:
pass
for c in self.columns:
try:
nrow[c.name] = getattr(obj, c.name)
except AttributeError:
pass
try:
nrow["options"] = getattr(self, "rowoptions")(self.request, obj)
except AttributeError:
pass
rows += [nrow]
return rows
def render(self, request):
def parse(self, header, value):
try:
return getattr(self, "parse_%s" % header)(value)
except AttributeError:
return value
def render(self):
if len(self.rows):
t = Template("""
<table id="{{ tableid }}">