diff --git a/modoboa/extensions/admin/views/domain.py b/modoboa/extensions/admin/views/domain.py index 64ddfd807..00846bf33 100644 --- a/modoboa/extensions/admin/views/domain.py +++ b/modoboa/extensions/admin/views/domain.py @@ -21,7 +21,6 @@ from modoboa.lib.webutils import ( from modoboa.lib.exceptions import ( PermDeniedException ) -from modoboa.lib.templatetags.lib_tags import pagination_bar from modoboa.lib.listing import get_sort_order, get_listing_page from modoboa.extensions.admin.models import Domain, Mailbox from modoboa.extensions.admin.forms import ( diff --git a/modoboa/extensions/admin/views/identity.py b/modoboa/extensions/admin/views/identity.py index 73a3eb8f3..7411cebbb 100644 --- a/modoboa/extensions/admin/views/identity.py +++ b/modoboa/extensions/admin/views/identity.py @@ -18,7 +18,6 @@ from modoboa.lib.exceptions import ( from modoboa.lib.webutils import ( _render_to_string, render_to_json_response ) -from modoboa.lib.templatetags.lib_tags import pagination_bar from modoboa.core.models import User from modoboa.extensions.admin.models import Mailbox, Domain from modoboa.lib.listing import ( @@ -115,13 +114,17 @@ def list_quotas(request, tplname="admin/quotas.html"): else: raise BadRequest(_("Invalid request")) page = get_listing_page(mboxes, request.GET.get("page", 1)) - return render_to_json_response({ - "page": page.number, - "paginbar": pagination_bar(page), - "table": _render_to_string(request, tplname, { - "mboxes": page - }) - }) + context = {} + if page is None: + context["length"] = 0 + else: + context["rows"] = _render_to_string( + request, tplname, { + "mboxes": page + } + ) + context["pages"] = [page.number] + return render_to_json_response(context) @login_required diff --git a/modoboa/extensions/amavis/sql_email.py b/modoboa/extensions/amavis/sql_email.py new file mode 100644 index 000000000..6b804778e --- /dev/null +++ b/modoboa/extensions/amavis/sql_email.py @@ -0,0 +1,55 @@ +# coding: utf-8 +""" +An email representation based on a database record. +""" + +from django.template.loader import render_to_string + +from modoboa.lib.emailutils import Email + +from .sql_connector import get_connector + + +class SQLemail(Email): + + """The SQL version of the Email class.""" + + def __init__(self, *args, **kwargs): + super(SQLemail, self).__init__(*args, **kwargs) + fields = ["From", "To", "Cc", "Date", "Subject"] + for f in fields: + label = f + self.headers += [ + {"name": label, "value": self.get_header(self.msg, f)} + ] + setattr(self, label, self.msg[f]) + qreason = self.get_header(self.msg, "X-Amavis-Alert") + self.qtype = "" + self.qreason = "" + if qreason != "": + if ',' in qreason: + self.qtype, self.qreason = qreason.split(',', 1) + elif qreason.startswith("BAD HEADER SECTION "): + # Workaround for amavis <= 2.8.0 :p + self.qtype = "BAD HEADER SECTION" + self.qreason = qreason[19:] + + @property + def msg(self): + """ + """ + import email + + if self._msg is None: + qmails = get_connector().get_mail_content(self.mailid) + self._msg = email.message_from_string( + "".join([qm.mail_text for qm in qmails]) + ) + self._parse(self._msg) + return self._msg + + def render_headers(self, **kwargs): + return render_to_string("amavis/mailheaders.html", { + "qtype": self.qtype, "qreason": self.qreason, + "headers": self.headers, + }) diff --git a/modoboa/extensions/amavis/sql_listing.py b/modoboa/extensions/amavis/sql_listing.py deleted file mode 100644 index b6ef31ec4..000000000 --- a/modoboa/extensions/amavis/sql_listing.py +++ /dev/null @@ -1,113 +0,0 @@ -# coding: utf-8 -from datetime import datetime - -from django.template.loader import render_to_string -from django.utils.translation import ugettext_lazy - -from modoboa.lib import tables -from modoboa.lib.email_listing import EmailListing -from modoboa.lib.emailutils import Email - -from .sql_connector import get_connector - - -class Qtable(tables.Table): - tableid = "emails" - styles = "table-condensed" - idkey = "mailid" - - selection = tables.SelectionColumn( - "selection", safe=True, width='5px', header=None, sortable=False - ) - type = tables.Column( - "type", align="center", width="30px", sort_order="type", safe=True - ) - rstatus = tables.ImgColumn( - "rstatus", width='25px', sortable=False - ) - score = tables.Column( - "score", label=ugettext_lazy("Score"), limit=6, - sort_order="score", cssclass="openable" - ) - to = tables.Column( - "to", label=ugettext_lazy("To"), sort_order="to", cssclass="openable" - ) - from_ = tables.Column( - "from", label=ugettext_lazy("From"), limit=30, - sort_order="from", cssclass="openable" - ) - subject = tables.Column( - "subject", label=ugettext_lazy("Subject"), limit=40, - sort_order="subject", cssclass="openable" - ) - time = tables.Column( - "date", label=ugettext_lazy("Date"), sort_order="date", - cssclass="openable" - ) - - cols_order = [ - 'selection', 'type', 'rstatus', 'score', 'to', 'from_', 'subject', - 'time' - ] - - def parse_type(self, value): - color = 'danger' if value in ['S', 'V'] else 'warning' - return '%s' % (color, value) - - def parse_date(self, value): - return datetime.fromtimestamp(value) - - -class SQLlisting(EmailListing): - tpl = "amavis/index.html" - tbltype = Qtable - deflocation = "listing/" - defcallback = "updatelisting" - reset_wm_url = True - - def __init__(self, user, **kwargs): - self.mbc = get_connector(user=user, navparams=kwargs["navparams"]) - super(SQLlisting, self).__init__(**kwargs) - self.show_listing_headers = True - - -class SQLemail(Email): - def __init__(self, *args, **kwargs): - super(SQLemail, self).__init__(*args, **kwargs) - fields = ["From", "To", "Cc", "Date", "Subject"] - for f in fields: - label = f - self.headers += [ - {"name": label, "value": self.get_header(self.msg, f)} - ] - setattr(self, label, self.msg[f]) - qreason = self.get_header(self.msg, "X-Amavis-Alert") - self.qtype = "" - self.qreason = "" - if qreason != "": - if ',' in qreason: - self.qtype, self.qreason = qreason.split(',', 1) - elif qreason.startswith("BAD HEADER SECTION "): - # Workaround for amavis <= 2.8.0 :p - self.qtype = "BAD HEADER SECTION" - self.qreason = qreason[19:] - - @property - def msg(self): - """ - """ - import email - - if self._msg is None: - qmails = get_connector().get_mail_content(self.mailid) - self._msg = email.message_from_string( - "".join([qm.mail_text for qm in qmails]) - ) - self._parse(self._msg) - return self._msg - - def render_headers(self, **kwargs): - return render_to_string("amavis/mailheaders.html", { - "qtype": self.qtype, "qreason": self.qreason, - "headers": self.headers, - }) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 13e194f42..b10e8401f 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -24,7 +24,7 @@ from modoboa.extensions.amavis.templatetags.amavis_tags import ( from .lib import selfservice, AMrelease, QuarantineNavigationParameters from .models import Msgrcpt from .sql_connector import get_connector -from .sql_listing import SQLemail +from .sql_email import SQLemail def empty_quarantine(): diff --git a/modoboa/lib/email_listing.py b/modoboa/lib/email_listing.py deleted file mode 100644 index a576129df..000000000 --- a/modoboa/lib/email_listing.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -from django.conf import settings -from django.template.loader import render_to_string -from django.template import Template, Context -from django.utils.translation import ugettext as _ - -from modoboa.lib.paginator import Paginator - - -class EmailListing(object): - - def __init__(self, baseurl=None, folder=None, elems_per_page=40, - navparams={}, **kwargs): - self.folder = folder - self.elems_per_page = elems_per_page - self.navparams = navparams - self.extravars = {} - self.show_listing_headers = False - self.empty = "empty" in kwargs and kwargs["empty"] or False - if self.empty: - return - if "order" in kwargs: - order = kwargs["order"] - elif "order" in self.navparams: - order = self.navparams["order"] - else: - order = None - self.paginator = Paginator( - self.mbc.messages_count(folder=self.folder, order=order), - elems_per_page - ) - self.baseurl = baseurl - - @staticmethod - def render_navbar(page, baseurl=None): - if page is None: - return "" - context = { - "page": page, "STATIC_URL": settings.STATIC_URL, "baseurl": baseurl - } - return render_to_string("common/pagination_bar.html", context) - - def fetch(self, request, id_start, id_stop): - table = self.tbltype( - request, - self.mbc.fetch(start=id_start, stop=id_stop, - mbox=self.folder, - nbelems=self.elems_per_page) - ) - tpl = Template(""" -
- {{ table }} -
""") - return tpl.render( - Context({ - "table": table.render(withheader=self.show_listing_headers) - }) - ) - - def render(self, request, pageid=1, **kwargs): - page = self.paginator.getpage(pageid) - if not page: - listing = "
%s
" % _("Empty mailbox") - else: - listing = self.fetch(request, page.id_start, page.id_stop) - return dict(listing=listing, navbar=self.render_navbar(page, self.baseurl)) diff --git a/modoboa/lib/templatetags/lib_tags.py b/modoboa/lib/templatetags/lib_tags.py index f8cd51d13..b1d6562ed 100644 --- a/modoboa/lib/templatetags/lib_tags.py +++ b/modoboa/lib/templatetags/lib_tags.py @@ -25,13 +25,6 @@ def tolist(values): return "[%s]" % ",".join(['"%s"' % v for v in values]) -@register.simple_tag -def pagination_bar(page): - return render_to_string("common/pagination_bar.html", dict( - page=page, baseurl="?" - )) - - @register.simple_tag def alert(msg, typ): t = Template("""