From 893dcfdb3f6052e6cdab9c770db1769b43ef71a4 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 27 Jul 2011 10:49:55 +0200 Subject: [PATCH] Some code cleanup. fixed #76 --- admin/models.py | 14 +++++++-- admin/tables.py | 37 ++++++++++------------ admin/views.py | 56 ++++++++++++++------------------- lib/tables.py | 23 ++++++++++++++ templates/admin/extensions.html | 2 +- templates/admin/listing.html | 5 +-- 6 files changed, 77 insertions(+), 60 deletions(-) diff --git a/admin/models.py b/admin/models.py index 3ce6a221b..493ab3053 100644 --- a/admin/models.py +++ b/admin/models.py @@ -84,6 +84,14 @@ class Domain(DatesAware): ("view_domains", "View domains"), ) + def __domainalias_count(self): + return len(self.domainalias_set.all()) + domainalias_count = property(__domainalias_count) + + def __mailbox_count(self): + return len(self.mailbox_set.all()) + mailbox_count = property(__mailbox_count) + def create_dir(self): path = "%s/%s" % (parameters.get_admin("STORAGE_PATH"), self.name) return exec_as_vuser("mkdir -p %s" % path) @@ -163,14 +171,16 @@ class Mailbox(DatesAware): def __full_address(self): return "%s@%s" % (self.address, self.domain.name) - full_address = property(__full_address) def __enabled(self): return self.user.is_active - enabled = property(__enabled) + def __alias_count(self): + return len(self.alias_set.all()) + alias_count = property(__alias_count) + def create_dir(self): relpath = "%s/%s" % (self.domain.name, self.address) abspath = os.path.join(parameters.get_admin("STORAGE_PATH"), relpath) diff --git a/admin/tables.py b/admin/tables.py index 24fd39d93..0226c3330 100644 --- a/admin/tables.py +++ b/admin/tables.py @@ -3,7 +3,7 @@ from django.utils.translation import ugettext as _ from modoboa.lib import tables from templatetags.admin_extras import * -class DomsTable(tables.Table): +class DomainsTable(tables.Table): tableid = "objects_table" idkey = "id" @@ -11,9 +11,9 @@ class DomsTable(tables.Table): 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"), + domaliases = tables.Column("domainalias_count", label=_("Domain aliases"), width="100px", align="center") - mboxes = tables.Column("mailbox_set", label=_("Mailboxes"), + mboxes = tables.Column("mailbox_count", label=_("Mailboxes"), width="100px", align="center") mbaliases = tables.Column("mbalias_counter", label=_("Mailbox aliases"), width="100px", align="center") @@ -28,22 +28,16 @@ class DomsTable(tables.Table): "quota", "enabled", "actions"] def __init__(self, request, doms): - super(DomsTable, self).__init__(request) + super(DomainsTable, 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): +class DomaliasesTable(tables.Table): tableid = "objects_table" idkey = "id" @@ -61,7 +55,7 @@ class DomAliasesTable(tables.Table): "modified", "enabled", "actions"] def __init__(self, request, domaliases): - super(DomAliasesTable, self).__init__(request) + super(DomaliasesTable, self).__init__(request) self.populate(self._rows_from_model(domaliases)) def parse_enabled(self, value): @@ -76,7 +70,7 @@ class MailboxesTable(tables.Table): 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", + aliases = tables.Column("alias_count", 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", @@ -91,16 +85,13 @@ class MailboxesTable(tables.Table): 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): +class MbaliasesTable(tables.Table): tableid = "objects_table" idkey = "id" @@ -117,7 +108,7 @@ class MbAliasesTable(tables.Table): cols_order = ["address", "targets", "creation", "modified", "enabled", "actions"] def __init__(self, request, aliases): - super(MbAliasesTable, self).__init__(request) + super(MbaliasesTable, self).__init__(request) self.populate(self._rows_from_model(aliases)) def rowoptions(self, request, alias): @@ -126,5 +117,11 @@ class MbAliasesTable(tables.Table): def parse_enabled(self, value): return _("yes") if value else _("no") - - +class ExtensionsTable(tables.Table): + idkey = "id" + selection = tables.SelectionColumn("selection", width="4%", first=True) + 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"] diff --git a/admin/views.py b/admin/views.py index 7bd4a9cbd..cfef6f45a 100644 --- a/admin/views.py +++ b/admin/views.py @@ -24,8 +24,12 @@ from modoboa.lib.emailutils import split_mailbox from modoboa.lib.models import Parameter import copy -def render_domains_page(request, objtype, tblclass, tplname="admin/listing.html", - **kwargs): +def render_listing(request, objtype, tplname="admin/listing.html", + **kwargs): + tblclass = "%sTable" % objtype.capitalize() + if not globals().has_key(tblclass): + raise AdminError(_("Unknown object type")) + tblclass = globals()[tblclass] if request.GET.has_key("domid"): kwargs["domid"] = request.GET["domid"] else: @@ -43,7 +47,7 @@ def render_domains_page(request, objtype, tblclass, tplname="admin/listing.html" 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() + kwargs["table"] = tblclass(request, kwargs["objects"].object_list) return _render(request, tplname, kwargs) @@ -59,13 +63,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", DomsTable, - "admin/domains.html", - title=_("Available domains"), - emptymsg=_("No domain defined."), - objects=domains, - rel="310 190", - deloptions=deloptions) + return render_listing(request, "domains", + "admin/domains.html", + title=_("Available domains"), + objects=domains, + rel="310 190", + deloptions=deloptions) def _validate_domain(request, form, successmsg, commonctx, callback=None, tplname="admin/adminform.html"): @@ -157,9 +160,8 @@ def domaliases(request): else: domain = None domaliases = DomainAlias.objects.all() - return render_domains_page(request, "domaliases", DomAliasesTable, + return render_listing(request, "domaliases", title=_("Domain aliases"), - emptymsg=_("No domain alias defined."), rel="310 190", objects=domaliases) @@ -250,11 +252,10 @@ def mailboxes(request): mboxes = Mailbox.objects.all() domain = None deloptions = {"keepdir" : _("Do not delete mailbox directory")} - return render_domains_page(request, "mailboxes", MailboxesTable, - title=_("Available mailboxes"), - emptymsg=_("No mailbox defined."), - rel="310 320", - objects=mboxes, domain=domain, deloptions=deloptions) + return render_listing(request, "mailboxes", + title=_("Available mailboxes"), + rel="310 320", + objects=mboxes, domain=domain, deloptions=deloptions) @login_required @good_domain @@ -387,11 +388,10 @@ def mbaliases(request): else: aliases = Alias.objects.all() - return render_domains_page(request, "mbaliases", MbAliasesTable, - title=_("Mailbox aliases"), - emptymsg=_("No mailbox alias defined."), - rel="320 300", - objects=aliases) + return render_listing(request, "mbaliases", + title=_("Mailbox aliases"), + rel="320 300", + objects=aliases) def _validate_mbalias(request, form, successmsg, tplname, commonctx): """Mailbox alias validation @@ -564,16 +564,6 @@ def saveparameters(request): @user_passes_test(lambda u: u.is_superuser) def viewextensions(request, tplname='admin/extensions.html'): from modoboa.extensions import list_extensions - from modoboa.lib import tables - - class ExtensionsTable(tables.Table): - idkey = "id" - selection = tables.SelectionColumn("selection", width="4%", first=True) - 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: @@ -589,7 +579,7 @@ def viewextensions(request, tplname='admin/extensions.html'): tbl = ExtensionsTable(request, exts) return _render(request, tplname, { - "extensions" : tbl.render() + "extensions" : tbl }) @login_required diff --git a/lib/tables.py b/lib/tables.py index 705b28811..832b0d8d3 100644 --- a/lib/tables.py +++ b/lib/tables.py @@ -1,4 +1,13 @@ # -*- coding: utf-8 -*- +""" +:mod:`tables` --- simple tabular renderer +----------------------------------------- + +This module offers a simple (I hope so) interface to render tabular +data. For a given Table class, it generates the corresponding HTML +output (using standard tags like and co.). + +""" import inspect import lxml from django.utils.translation import ugettext as _ @@ -6,6 +15,8 @@ from django.template import Template, Context from django.template.loader import render_to_string class Column: + """Simple column representation + """ sortable = True def __init__(self, name, **kwargs): @@ -22,6 +33,11 @@ class Column: class SelectionColumn(Column): + """Specific column: selection + + A 'selection' column contains only checkboxes (one per row). It is + usefull to select rows for grouped actions (modify, delete, etc.) + """ def __str__(self): return "" @@ -30,6 +46,10 @@ class SelectionColumn(Column): % (self.name, value, value, selection and "checked" or "") class ImgColumn(Column): + """Specific column: image + + This kind of column only contains images tags (). + """ sortable = False def __str__(self): @@ -164,6 +184,9 @@ class Table(object): except AttributeError: return value + def __str__(self): + return self.render() + def render(self): if len(self.rows): t = Template(""" diff --git a/templates/admin/extensions.html b/templates/admin/extensions.html index 7b86890c7..08ffd2001 100644 --- a/templates/admin/extensions.html +++ b/templates/admin/extensions.html @@ -6,7 +6,7 @@ {% block setcontent %} {% load i18n %} - {{ extensions }} + {{ extensions|safe }}
diff --git a/templates/admin/listing.html b/templates/admin/listing.html index f688a097b..eb1d00896 100644 --- a/templates/admin/listing.html +++ b/templates/admin/listing.html @@ -3,10 +3,7 @@ {% block middletitle %}{{ title }}{% endblock %} {% block subcontent %}
- {% if not objects %}
{{ emptymsg }}
- {% else %} - {{ table }} - {% endif %} + {{ table|safe }}
{% endblock %} {% block footer %}