mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-19 05:58:34 +02:00
Ticket #46
This commit is contained in:
@@ -21,6 +21,7 @@ from mailng.lib import db
|
||||
from mailng.admin.models import Mailbox
|
||||
from lib import AMrelease
|
||||
from templatetags.amextras import *
|
||||
from mailng.lib.email_listing import parse_search_parameters
|
||||
from sql_listing import *
|
||||
|
||||
def init():
|
||||
@@ -68,17 +69,7 @@ def _listing(request, internal=False, filter=None):
|
||||
else:
|
||||
filter += ["&maddr.email='%s'" % mb.full_address]
|
||||
|
||||
if request.GET.has_key("pattern"):
|
||||
request.session["pattern"] = re.escape(request.GET["pattern"])
|
||||
if request.GET.has_key("criteria"):
|
||||
request.session["criteria"] = request.GET["criteria"]
|
||||
else:
|
||||
request.session["criteria"] = ["from_addr"]
|
||||
else:
|
||||
for p in ["pattern", "criteria"]:
|
||||
if p in request.session.keys():
|
||||
del request.session[p]
|
||||
|
||||
parse_search_parameters(request)
|
||||
if request.session.has_key("pattern"):
|
||||
tmp = ""
|
||||
for c in request.session["criteria"].split(','):
|
||||
@@ -165,13 +156,6 @@ WHERE quarantine.mail_id='%s'
|
||||
"headers" : msg.items()
|
||||
})
|
||||
|
||||
def _redirect_to_index(request, message, count):
|
||||
request.user.message_set.create(message=message)
|
||||
if count > 1:
|
||||
return
|
||||
page = request.GET.has_key("page") and request.GET["page"] or "1"
|
||||
return HttpResponseRedirect(reverse(index) + "?page=%s" % page)
|
||||
|
||||
@login_required
|
||||
def delete(request, mail_id, count=1):
|
||||
conn = db.getconnection("amavis_quarantine")
|
||||
|
||||
@@ -122,6 +122,7 @@ class IMAPconnector(object):
|
||||
__metaclass__ = Singleton
|
||||
|
||||
def __init__(self, request=None, user=None, password=None):
|
||||
self.criterions = []
|
||||
self.address = parameters.get("webmail", "IMAP_SERVER")
|
||||
self.port = int(parameters.get("webmail", "IMAP_PORT"))
|
||||
if request:
|
||||
@@ -172,11 +173,10 @@ class IMAPconnector(object):
|
||||
criterion = "REVERSE %s" % criterion
|
||||
else:
|
||||
criterion = "REVERSE DATE"
|
||||
print criterion
|
||||
|
||||
folder = kwargs.has_key("folder") and kwargs["folder"] or None
|
||||
(status, data) = self.m.select(self._encodefolder(folder))
|
||||
(status, data) = self.m.sort("(%s)" % criterion, "UTF-8", "(NOT DELETED)")
|
||||
(status, data) = self.m.sort("(%s)" % criterion, "UTF-8", "(NOT DELETED)",
|
||||
*self.criterions)
|
||||
self.messages = data[0].split()
|
||||
return len(self.messages)
|
||||
|
||||
@@ -257,6 +257,11 @@ class ImapListing(EmailListing):
|
||||
|
||||
def __init__(self, user, password, **kwargs):
|
||||
self.mbc = IMAPconnector(user=user, password=password)
|
||||
if kwargs.has_key("pattern"):
|
||||
self.parse_search_parameters(kwargs["criteria"],
|
||||
kwargs["pattern"])
|
||||
if kwargs.has_key("reset"):
|
||||
self.mbc.criterions = []
|
||||
EmailListing.__init__(self, **kwargs)
|
||||
|
||||
def getfolders(self):
|
||||
@@ -270,6 +275,23 @@ class ImapListing(EmailListing):
|
||||
md_folders += [{"name" : fd}]
|
||||
return md_folders
|
||||
|
||||
def parse_search_parameters(self, criterion, pattern):
|
||||
def or_criterion(old, c):
|
||||
if old == "":
|
||||
return c
|
||||
return "OR (%s) (%s)" % (old, c)
|
||||
|
||||
criterions = ""
|
||||
for c in criterion.split(','):
|
||||
if c == "from_addr":
|
||||
key = "FROM"
|
||||
elif c == "subject":
|
||||
key = "SUBJECT"
|
||||
else:
|
||||
continue
|
||||
criterions = or_criterion(criterions, '%s "%s"' % (key, pattern))
|
||||
self.mbc.criterions = ["(%s)" % criterions]
|
||||
|
||||
class ImapEmail(Email):
|
||||
def __init__(self, msg, addrfull=False, **kwargs):
|
||||
Email.__init__(self, msg, **kwargs)
|
||||
|
||||
@@ -14,7 +14,7 @@ from mailng.lib import events, parameters, _render, _render_error, getctx
|
||||
from imap_listing import *
|
||||
from forms import *
|
||||
from templatetags.webextras import *
|
||||
from imap_listing import ImapEmail
|
||||
from lib.email_listing import parse_search_parameters
|
||||
|
||||
def init():
|
||||
events.register("UserMenuDisplay", menu)
|
||||
@@ -34,7 +34,6 @@ def init():
|
||||
parameters.register("webmail", "SMTP_SECURED", "list_yesno", "no",
|
||||
help=_("Use a secured connection to access SMTP server"))
|
||||
|
||||
|
||||
def urls():
|
||||
return (r'^mailng/webmail/',
|
||||
include('mailng.extensions.webmail.urls'))
|
||||
@@ -48,6 +47,13 @@ def menu(**kwargs):
|
||||
"img" : "/static/pics/webmail.png"}
|
||||
]
|
||||
|
||||
def __get_current_url(request):
|
||||
res = "%s?page=%s" % (request.session["folder"], request.session["page"])
|
||||
for p in ["criteria", "pattern", "order"]:
|
||||
if p in request.session.keys():
|
||||
res += "&%s=%s" % (p, request.session[p])
|
||||
return res
|
||||
|
||||
def userlogin(**kwargs):
|
||||
kwargs["request"].session["password"] = kwargs["password"]
|
||||
|
||||
@@ -64,12 +70,20 @@ def folder(request, name, updatenav=True):
|
||||
request.session["page"] = pageid
|
||||
if order:
|
||||
request.session["navparams"]["order"] = order
|
||||
parse_search_parameters(request)
|
||||
else:
|
||||
# Internal usage
|
||||
order = request.session["navparams"]["order"]
|
||||
|
||||
optparams = {}
|
||||
if request.session.has_key("pattern"):
|
||||
optparams["pattern"] = request.session["pattern"]
|
||||
optparams["criteria"] = request.session["criteria"]
|
||||
else:
|
||||
optparams["reset"] = True
|
||||
lst = ImapListing(request.user.username, request.session["password"],
|
||||
baseurl=name, folder=name, order=order)
|
||||
baseurl=name, folder=name, order=order, **optparams)
|
||||
|
||||
page = lst.paginator.getpage(request.session["page"])
|
||||
if page:
|
||||
content = lst.fetch(request, page.id_start, page.id_stop)
|
||||
@@ -106,7 +120,7 @@ def viewmail(request, folder, mail_id=None):
|
||||
content = Template("""
|
||||
<iframe width="100%" frameBorder="0" src="{{ url }}" id="mailcontent"></iframe>
|
||||
""").render(Context({"url" : reverse(getmailcontent, args=[folder, mail_id])}))
|
||||
menu = viewm_menu("", request.session, mail_id,
|
||||
menu = viewm_menu("", __get_current_url(request), folder, mail_id,
|
||||
request.user.get_all_permissions())
|
||||
ctx = getctx("ok", menu=menu, listing=content)
|
||||
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
|
||||
@@ -175,7 +189,8 @@ def empty(request, name):
|
||||
return folder(request, name, False)
|
||||
|
||||
def render_compose(request, form, posturl, bodyheader=None, body=None):
|
||||
menu = compose_menu("", request.session, request.user.get_all_permissions())
|
||||
menu = compose_menu("", __get_current_url(request),
|
||||
request.user.get_all_permissions())
|
||||
content = render_to_string("webmail/compose.html", {
|
||||
"form" : form, "bodyheader" : bodyheader, "body" : body,
|
||||
"posturl" : posturl
|
||||
@@ -210,8 +225,7 @@ def send_mail(request, withctx=False):
|
||||
s.login(request.user.username, request.session["password"])
|
||||
s.sendmail(msg['From'], rcpts, msg.as_string())
|
||||
s.quit()
|
||||
ctx = getctx("ok", url="%s?page=%s" % (request.session["folder"],
|
||||
request.session["page"]))
|
||||
ctx = getctx("ok", url=__get_current_url(request))
|
||||
else:
|
||||
ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html",
|
||||
{"form" : form}))
|
||||
|
||||
@@ -24,10 +24,10 @@ def backurl(session, **kwargs):
|
||||
return res
|
||||
|
||||
@register.simple_tag
|
||||
def viewm_menu(selection, session, mail_id, perms):
|
||||
def viewm_menu(selection, backurl, folder, mail_id, perms):
|
||||
entries = [
|
||||
{"name" : "back",
|
||||
"url" : "%s?page=%s" % (session["folder"], session["page"]),
|
||||
"url" : backurl,
|
||||
"img" : "/static/pics/back.png",
|
||||
"label" : _("Back")},
|
||||
{"name" : "reply",
|
||||
@@ -44,7 +44,7 @@ def viewm_menu(selection, session, mail_id, perms):
|
||||
"label" : _("Forward")},
|
||||
{"name" : "delete",
|
||||
"img" : "/static/pics/remove.png",
|
||||
"url" : reverse(webmail.main.delete, args=[session["folder"], mail_id]),
|
||||
"url" : reverse(webmail.main.delete, args=[folder, mail_id]),
|
||||
"label" : _("Delete")},
|
||||
]
|
||||
|
||||
@@ -53,10 +53,10 @@ def viewm_menu(selection, session, mail_id, perms):
|
||||
"perms" : perms})
|
||||
|
||||
@register.simple_tag
|
||||
def compose_menu(selection, session, perms):
|
||||
def compose_menu(selection, backurl, perms):
|
||||
entries = [
|
||||
{"name" : "back",
|
||||
"url" : "%s?page=%s" % (session["folder"], session["page"]),
|
||||
"url" : backurl,
|
||||
"img" : "/static/pics/back.png",
|
||||
"label" : _("Back")},
|
||||
{"name" : "sendmail",
|
||||
|
||||
@@ -227,3 +227,15 @@ class Email(object):
|
||||
body = Template(decode(body)).render({})
|
||||
return (False, body)
|
||||
|
||||
def parse_search_parameters(request):
|
||||
if request.GET.has_key("pattern"):
|
||||
request.session["pattern"] = re.escape(request.GET["pattern"])
|
||||
if request.GET.has_key("criteria"):
|
||||
request.session["criteria"] = request.GET["criteria"]
|
||||
else:
|
||||
request.session["criteria"] = ["from_addr"]
|
||||
else:
|
||||
for p in ["pattern", "criteria"]:
|
||||
if p in request.session.keys():
|
||||
del request.session[p]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user