* 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
+2
View File
@@ -17,3 +17,5 @@ parameters.register_admin("MAILDIR_ROOT", type="string", deflt=".maildir",
parameters.register_admin("PASSWORD_SCHEME", type="list", deflt="crypt",
values=[("crypt", "crypt"), ("md5", "md5"), ("clear", "clear")],
help=_("Scheme used to crypt mailbox passwords"))
parameters.register_admin("ITEMS_PER_PAGE", type="int", deflt=30,
help=_("Number of displayed items per page"))
+33
View File
@@ -62,6 +62,15 @@ class DatesAware(models.Model):
ObjectDates.set_for_object(self)
super(DatesAware, self).save(*args, **kwargs)
def __creation(self):
return self.dates.creation
def __last_modification(self):
return self.dates.last_modification
creation = property(__creation)
last_modification = property(__last_modification)
class Domain(DatesAware):
name = models.CharField(_('name'), max_length=100, unique=True,
help_text=_("The domain name"))
@@ -157,6 +166,11 @@ class Mailbox(DatesAware):
full_address = property(__full_address)
def __enabled(self):
return self.user.is_active
enabled = property(__enabled)
def create_dir(self):
relpath = "%s/%s" % (self.domain.name, self.address)
abspath = os.path.join(parameters.get_admin("STORAGE_PATH"), relpath)
@@ -273,6 +287,16 @@ class Alias(DatesAware):
("view_aliases", "View aliases"),
)
def __full_address(self):
return "%s@%s" % (self.address, self.domain.name)
full_address = property(__full_address)
def __targets(self):
ret = "<br/>".join(map(lambda m: str(m), self.mboxes.all()))
ret += "<br/>" + self.repr_extmboxes()
return ret
targets = property(__targets)
def save(self, int_targets, ext_targets, *args, **kwargs):
if len(ext_targets):
self.extmboxes = ",".join(ext_targets)
@@ -320,6 +344,15 @@ class Alias(DatesAware):
"""
return "<br/>".join(self.extmboxes.split(","))
def ui_disabled(self, user):
if user.is_superuser:
return False
usermb = Mailbox.objects.get(user=user.id)
for mb in self.mboxes.all():
if mb.domain.id != usermb.domain.id:
return True
return False
class Extension(models.Model):
name = models.CharField(max_length=150)
enabled = models.BooleanField(_('enabled'),
+2 -2
View File
@@ -73,7 +73,7 @@ class SuperAdminsPerms(Permissions):
"full_name" : "%s %s" % (admin.first_name, admin.last_name),
"date_joined" : admin.date_joined,
"enabled" : admin.is_active}]
return SuperAdminsTable(admins_list).render(request)
return SuperAdminsTable(request, admins_list).render()
class DomainAdminsPerms(Permissions):
@@ -123,7 +123,7 @@ class DomainAdminsPerms(Permissions):
domadmins_list = []
for admin in domadmins:
domadmins_list += [admin.tohash()]
return DomainAdminsTable(domadmins_list).render(request)
return DomainAdminsTable(request, domadmins_list).render()
def get_perms_class(user, role):
"""Retrieves the class associated to a given role
+130
View File
@@ -0,0 +1,130 @@
# coding: utf-8
from django.utils.translation import ugettext as _
from modoboa.lib import tables
from templatetags.admin_extras import *
class DomsTable(tables.Table):
tableid = "objects_table"
idkey = "id"
name = tables.Column("name", label=_("Name"))
creation = tables.Column("creation", label=_("Created"), width="160px")
modified = tables.Column("last_modification", label=_("Last modified"),
width="160px")
domaliases = tables.Column("domainalias_set", label=_("Domain aliases"),
width="100px", align="center")
mboxes = tables.Column("mailbox_set", label=_("Mailboxes"),
width="100px", align="center")
mbaliases = tables.Column("mbalias_counter", label=_("Mailbox aliases"),
width="100px", align="center")
quota = tables.Column("quota", label=_("Quota"), width="50px", align="center")
enabled = tables.Column("enabled", label=_("Enabled"), width="50px",
align="center")
actions = tables.ActionColumn("actions", label=_("Actions"), width="50px",
align="center", defvalue=domain_actions)
cols_order = ["name", "creation", "modified",
"domaliases", "mboxes", "mbaliases",
"quota", "enabled", "actions"]
def __init__(self, request, doms):
super(DomsTable, self).__init__(request)
self.populate(self._rows_from_model(doms))
def parse_domainalias_set(self, value):
return len(value.all())
def parse_mailbox_set(self, value):
return len(value.all())
def parse_quota(self, value):
return "%s %s" % (value, _("MB"))
def parse_enabled(self, value):
return _("yes") if value else _("no")
class DomAliasesTable(tables.Table):
tableid = "objects_table"
idkey = "id"
name = tables.Column("name", label=_("Name"))
target = tables.Column("target", label=_("Targeted domain"))
creation = tables.Column("creation", label=_("Created"), width="170px")
modified = tables.Column("last_modification", label=_("Last modified"),
width="170px")
enabled = tables.Column("enabled", label=_("Enabled"), width="50px",
align="center")
actions = tables.ActionColumn("actions", label=_("Actions"), width="50px",
align="center", defvalue=domalias_actions)
cols_order = ["name", "target", "creation",
"modified", "enabled", "actions"]
def __init__(self, request, domaliases):
super(DomAliasesTable, self).__init__(request)
self.populate(self._rows_from_model(domaliases))
def parse_enabled(self, value):
return _("yes") if value else _("no")
class MailboxesTable(tables.Table):
tableid = "objects_table"
idkey = "id"
address = tables.Column("address", label=_("Address"))
name = tables.Column("name", label=_("Name"))
creation = tables.Column("creation", label=_("Created"), width="160px")
modified = tables.Column("last_modification", label=_("Last modified"),
width="160px")
aliases = tables.Column("alias_set", label=_("Aliases"), width="70px",
align="center")
quota = tables.Column("quota", label=_("Quota"), width="50px", align="center")
enabled = tables.Column("enabled", label=gender("Enabled", "f"), width="50px",
align="center")
actions = tables.ActionColumn("actions", label=_("Actions"), width="70px",
align="center", defvalue=mailbox_actions)
cols_order = ["address", "name", "creation", "modified", "aliases",
"quota", "enabled", "actions"]
def __init__(self, request, mailboxes):
super(MailboxesTable, self).__init__(request)
self.populate(self._rows_from_model(mailboxes))
def parse_alias_set(self, value):
return len(value.all())
def parse_quota(self, value):
return "%s %s" % (value, _("MB"))
def parse_enabled(self, value):
return _("yes") if value else _("no")
class MbAliasesTable(tables.Table):
tableid = "objects_table"
idkey = "id"
address = tables.Column("full_address", label=_("Address"))
targets = tables.Column("targets", label=_("Target(s)"), safe=True)
creation = tables.Column("creation", label=_("Created"), width="170px")
modified = tables.Column("last_modification", label=_("Last modified"),
width="170px")
enabled = tables.Column("enabled", label=gender("Enabled", "m"), width="50px",
align="center")
actions = tables.ActionColumn("actions", label=_("Actions"), width="50px",
align="center", defvalue=mbalias_actions)
cols_order = ["address", "targets", "creation", "modified", "enabled", "actions"]
def __init__(self, request, aliases):
super(MbAliasesTable, self).__init__(request)
self.populate(self._rows_from_model(aliases))
def rowoptions(self, request, alias):
return "{ui_disabled : '%s'}" % alias.ui_disabled(request.user)
def parse_enabled(self, value):
return _("yes") if value else _("no")
+10 -5
View File
@@ -170,26 +170,31 @@ def domalias_actions(user, aid):
return render_actions(actions)
@register.simple_tag
def mailbox_actions(user, mbox):
def mailbox_actions(user, mboxid):
actions = [
{"name" : "editmailbox",
"url" : reverse(admin.views.editmailbox, args=[mbox.id]),
"url" : reverse(admin.views.editmailbox, args=[mboxid]),
"img" : static_url("pics/edit.png"),
"title" : _("Edit mailbox"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:320}}"},
{"name" : "aliases",
"url" : reverse(admin.views.mbaliases) + "?mbid=%d" % mbox.id,
"url" : reverse(admin.views.mbaliases) + "?mbid=%d" % mboxid,
"img" : static_url("pics/alias.png"),
"title" : _("View this mailbox aliases")},
]
return render_actions(actions)
@register.simple_tag
def mbalias_actions(user, alias):
def mbalias_actions(user, aliasid):
from admin.models import Alias
alias = Alias.objects.get(pk=aliasid)
if alias.ui_disabled(user):
return "--"
actions = [
{"name" : "editmbalias",
"url" : reverse(admin.views.editmbalias, args=[alias.id]),
"url" : reverse(admin.views.editmbalias, args=[aliasid]),
"img" : static_url("pics/edit.png"),
"title" : _("Edit mailbox alias"),
"class" : "boxed",
+49 -24
View File
@@ -10,11 +10,13 @@ from django.db.models import Q
from django.contrib.auth.models import User, Group
from django.contrib import messages
from django.db import transaction, IntegrityError
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from lib import *
from modoboa import admin, userprefs
from models import *
from admin.permissions import *
from admin.tables import *
from modoboa.lib import crypt_password
from modoboa.lib import _render, ajax_response, ajax_simple_response, \
getctx, events, parameters
@@ -22,14 +24,28 @@ from modoboa.lib.emailutils import split_mailbox
from modoboa.lib.models import Parameter
import copy
def render_domains_page(request, page, **kwargs):
template = "admin/%s.html" % page
def render_domains_page(request, objtype, tblclass, tplname="admin/listing.html",
**kwargs):
if request.GET.has_key("domid"):
kwargs["domid"] = request.GET["domid"]
else:
kwargs["domid"] = ""
kwargs["selection"] = page
return _render(request, template, kwargs)
kwargs["selection"] = objtype
paginator = Paginator(kwargs["objects"],
int(parameters.get_admin("ITEMS_PER_PAGE")))
try:
page = request.GET.get("page", "1")
except ValueError:
page = 1
try:
kwargs["objects"] = paginator.page(page)
except (EmptyPage, PageNotAnInteger):
kwargs["objects"] = paginator.page(paginator.num_pages)
kwargs["last_page"] = paginator.num_pages
kwargs["total"] = paginator.count
kwargs["table"] = tblclass(request, kwargs["objects"].object_list).render()
return _render(request, tplname, kwargs)
@login_required
def domains(request):
@@ -43,8 +59,12 @@ def domains(request):
for dom in domains:
dom.mbalias_counter = len(Alias.objects.filter(domain=dom.id))
deloptions = {"keepdir" : _("Do not delete domain directory")}
return render_domains_page(request, "domains",
domains=domains,
return render_domains_page(request, "domains", DomsTable,
"admin/domains.html",
title=_("Available domains"),
emptymsg=_("No domain defined."),
objects=domains,
rel="310 190",
deloptions=deloptions)
def _validate_domain(request, form, successmsg, commonctx,
@@ -137,8 +157,11 @@ def domaliases(request):
else:
domain = None
domaliases = DomainAlias.objects.all()
return render_domains_page(request, "domaliases",
domaliases=domaliases, domain=domain)
return render_domains_page(request, "domaliases", DomAliasesTable,
title=_("Domain aliases"),
emptymsg=_("No domain alias defined."),
rel="310 190",
objects=domaliases)
@login_required
@good_domain
@@ -227,8 +250,11 @@ def mailboxes(request):
mboxes = Mailbox.objects.all()
domain = None
deloptions = {"keepdir" : _("Do not delete mailbox directory")}
return render_domains_page(request, "mailboxes",
mailboxes=mboxes, domain=domain, deloptions=deloptions)
return render_domains_page(request, "mailboxes", MailboxesTable,
title=_("Available mailboxes"),
emptymsg=_("No mailbox defined."),
rel="310 320",
objects=mboxes, domain=domain, deloptions=deloptions)
@login_required
@good_domain
@@ -360,15 +386,12 @@ def mbaliases(request):
aliases = Alias.objects.filter(mboxes__id=request.GET["mbid"]).distinct()
else:
aliases = Alias.objects.all()
if not request.user.is_superuser:
usermb = Mailbox.objects.get(user=request.user.id)
for al in aliases:
al.ui_disabled = False
for mb in al.mboxes.all():
if mb.domain.id != usermb.domain.id:
al.ui_disabled = True
break
return render_domains_page(request, "mbaliases", aliases=aliases)
return render_domains_page(request, "mbaliases", MbAliasesTable,
title=_("Mailbox aliases"),
emptymsg=_("No mailbox alias defined."),
rel="320 300",
objects=aliases)
def _validate_mbalias(request, form, successmsg, tplname, commonctx):
"""Mailbox alias validation
@@ -546,9 +569,11 @@ def viewextensions(request, tplname='admin/extensions.html'):
class ExtensionsTable(tables.Table):
idkey = "id"
selection = tables.SelectionColumn("selection", width="4%", first=True)
_1_name = tables.Column("name", label=_("Name"), width="15%")
_2_version = tables.Column("version", label=_("Version"), width="6%")
_3_descr = tables.Column("description", label=_("Description"))
name = tables.Column("name", label=_("Name"), width="15%")
version = tables.Column("version", label=_("Version"), width="6%")
descr = tables.Column("description", label=_("Description"))
cols_order = ["selection", "name", "version", "descr"]
exts = list_extensions()
for ext in exts:
@@ -562,9 +587,9 @@ def viewextensions(request, tplname='admin/extensions.html'):
dbext.save()
ext["selection"] = False
tbl = ExtensionsTable(exts)
tbl = ExtensionsTable(request, exts)
return _render(request, tplname, {
"extensions" : tbl.render(request)
"extensions" : tbl.render()
})
@login_required