mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
+12
-2
@@ -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)
|
||||
|
||||
+17
-20
@@ -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"]
|
||||
|
||||
+23
-33
@@ -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
|
||||
|
||||
@@ -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 <table> 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 "<input type='checkbox' name='selectall' id='selectall' />"
|
||||
|
||||
@@ -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 (<img>).
|
||||
"""
|
||||
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("""
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
{% block setcontent %}
|
||||
{% load i18n %}
|
||||
<form method="POST" action="{% url admin.views.saveextensions %}">
|
||||
{{ extensions }}
|
||||
{{ extensions|safe }}
|
||||
<br />
|
||||
<input type="submit" name="apply" value="{% trans "Apply" %}" />
|
||||
</form>
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
{% block middletitle %}{{ title }}{% endblock %}
|
||||
{% block subcontent %}
|
||||
<div id="objects" name="{{ selection }}" rel="{{ rel }}">
|
||||
{% if not objects %}<div class="info">{{ emptymsg }}</div>
|
||||
{% else %}
|
||||
{{ table }}
|
||||
{% endif %}
|
||||
{{ table|safe }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block footer %}
|
||||
|
||||
Reference in New Issue
Block a user