mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
@@ -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 '<span class="label label-%s">%s</span>' % (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,
|
||||
})
|
||||
@@ -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():
|
||||
|
||||
@@ -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("""
|
||||
<form method="POST" id="listingform">
|
||||
{{ table }}
|
||||
</form>""")
|
||||
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 = "<div class='alert alert-info'>%s</div>" % _("Empty mailbox")
|
||||
else:
|
||||
listing = self.fetch(request, page.id_start, page.id_stop)
|
||||
return dict(listing=listing, navbar=self.render_navbar(page, self.baseurl))
|
||||
@@ -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("""<div class="alert alert-{{ type }}" role="alert">
|
||||
|
||||
@@ -14,9 +14,6 @@
|
||||
@media (max-width: 768px) {
|
||||
|
||||
.navbar .navbar-header,
|
||||
.navbar #pagination-responsive{
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
tr th#tags,
|
||||
td[name="tags"] {
|
||||
@@ -35,9 +32,6 @@
|
||||
|
||||
@media (max-width: 1198px) {
|
||||
|
||||
#pagination-responsive .display-less-1198{
|
||||
display: inherit;
|
||||
}
|
||||
.display-up-1198{
|
||||
display: none;
|
||||
}
|
||||
@@ -193,10 +187,6 @@ html body div.navbar div.container-fluid div#navigate-navbar-collapse.collapse u
|
||||
color: white;
|
||||
}
|
||||
|
||||
#pagination-responsive #pagination_bar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* left sidebar */
|
||||
|
||||
/* Sidebar navigation */
|
||||
@@ -261,26 +251,6 @@ html body div.navbar div.container-fluid div#navigate-navbar-collapse.collapse u
|
||||
float:none;
|
||||
}
|
||||
|
||||
.simplepagination ul {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.simplepagination li {
|
||||
display: inline;
|
||||
cursor: pointer;
|
||||
}
|
||||
.simplepagination li span {
|
||||
color: white;
|
||||
margin-bottom: 15px;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.simplepagination .disabled a,
|
||||
.simplepagination .disabled a:hover {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
|
||||
/* --------- specific pages --------- */
|
||||
|
||||
/* identities tables */
|
||||
|
||||
@@ -12,9 +12,6 @@ Listing.prototype = {
|
||||
constructor: Listing,
|
||||
|
||||
listing_defaults: {
|
||||
presp_container: '#pagination-responsive',
|
||||
pbar_container: '#bottom-bar-right',
|
||||
pbar_id: '#pagination_bar',
|
||||
sortable_selector: '.sortable',
|
||||
with_searchform: true,
|
||||
load_page_url: null,
|
||||
@@ -28,10 +25,6 @@ Listing.prototype = {
|
||||
this.options = $.extend({}, this.listing_defaults, options);
|
||||
this.tag_handlers = {};
|
||||
this.navobj = new History(this.options);
|
||||
$(document).on("click", this.options.pbar_container + " a",
|
||||
$.proxy(this.load_page, this));
|
||||
$(document).on("click", this.options.presp_container + " a",
|
||||
$.proxy(this.load_page, this));
|
||||
$(document).on("click", "a.filter", $.proxy(this.filter_by_tag, this));
|
||||
if (this.options.with_searchform) {
|
||||
this.init_searchform();
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
<div id="pagination_bar" class="simplepagination">
|
||||
<ul>
|
||||
{% if page.has_previous %}
|
||||
<li>
|
||||
<a href="{{ baseurl }}page=1">
|
||||
<span class="fa fa-fast-backward"></span></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ baseurl }}page={{ page.previous_page_number }}">
|
||||
<span class="fa fa-step-backward"></span></a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li>
|
||||
<span class="fa fa-fast-backward"></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="fa fa-step-backward"></span>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="disabled navbar-text">
|
||||
{{ page.number }}/{{ page.paginator.num_pages }}
|
||||
</li>
|
||||
{% if page.has_next %}
|
||||
<li>
|
||||
<a href="{{ baseurl }}page={{ page.next_page_number }}">
|
||||
<span class="fa fa-step-forward"></span></a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ baseurl }}page={{ page.paginator.num_pages }}">
|
||||
<span class="fa fa-fast-forward"></span></a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li>
|
||||
<span class="fa fa-step-forward"></span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="fa fa-fast-forward"></span>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="display-less-1198 pull-right">
|
||||
{% if page.has_previous %}
|
||||
<a href="{{ baseurl }}page={{ page.previous_page_number }}" class="btn btn-lg btn-link fa fa-chevron-left" type="button"></a>
|
||||
{% else %}
|
||||
<a class="btn btn-lg btn-link fa fa-chevron-left" type="button"></a>
|
||||
{% endif %}
|
||||
{% if page.has_next %}
|
||||
<a href="{{ baseurl }}page={{ page.next_page_number }}" class="btn btn-lg btn-link fa fa-chevron-right" type="button"></a>
|
||||
{% else %}
|
||||
<a class="btn btn-lg btn-link fa fa-chevron-right" type="button"></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
Reference in New Issue
Block a user