wip: big refactoring

amavis extension still needs work.
This commit is contained in:
Antoine Nguyen
2013-08-23 10:59:12 +02:00
parent a310416632
commit 1353fe979c
6 changed files with 83 additions and 79 deletions
+15 -17
View File
@@ -12,7 +12,7 @@ from django.utils.translation import ugettext as _, ugettext_lazy
from django.core.urlresolvers import reverse
from django.template import Template, Context
from modoboa.lib import events, parameters
from modoboa.extensions import ModoExtension, exts_pool
from modoboa.core.extensions import ModoExtension, exts_pool
class Amavis(ModoExtension):
@@ -28,8 +28,8 @@ class Amavis(ModoExtension):
Only run once, when the extension is enabled. We create records
for existing domains to let Amavis consider them local.
"""
from modoboa.admin.models import Domain
from models import Users, Policy
from modoboa.extensions.admin.models import Domain
from .models import Users, Policy
for dom in Domain.objects.all():
try:
@@ -40,10 +40,10 @@ class Amavis(ModoExtension):
priority=7, policy=p)
def load(self):
from app_settings import ParametersForm, UserSettings
from .app_settings import ParametersForm, UserSettings
parameters.register(ParametersForm, "Amavis")
parameters.register(UserSettings, ugettext_lazy("Quarantine"))
def destroy(self):
events.unregister("UserMenuDisplay", menu)
parameters.unregister()
@@ -53,20 +53,18 @@ exts_pool.register_extension(Amavis)
@events.observe("UserMenuDisplay")
def menu(target, user):
from modoboa.lib.webutils import static_url
if target == "top_menu":
return [
{"name": "quarantine",
"label": _("Quarantine"),
"url": reverse('modoboa.extensions.amavis.views.index')}
]
]
return []
@events.observe("CreateDomain")
def on_create_domain(user, domain):
from models import Users, Policy
from .models import Users, Policy
p = Policy.objects.create(policy_name=domain.name)
Users.objects.create(email="@%s" % domain.name, fullname=domain.name,
priority=7, policy=p)
@@ -75,7 +73,7 @@ def on_create_domain(user, domain):
@events.observe("DomainModified")
def on_domain_modified(domain):
if domain.oldname != domain.name:
from models import Users
from .models import Users
u = Users.objects.get(email="@%s" % domain.oldname)
u.email = "@%s" % domain.name
u.fullname = domain.name
@@ -86,7 +84,7 @@ def on_domain_modified(domain):
@events.observe("DeleteDomain")
def on_delete_domain(domain):
from models import Users
from .models import Users
try:
u = Users.objects.get(email="@%s" % domain.name)
@@ -134,7 +132,7 @@ $(document).ready(function() {
@events.observe("TopNotifications")
def display_requests(user):
from sql_listing import get_wrapper
from .sql_listing import get_wrapper
if parameters.get_admin("USER_CAN_RELEASE") == "yes" \
or user.group == "SimpleUsers":
@@ -146,13 +144,13 @@ def display_requests(user):
tpl = Template('<div class="btn-group {{ css }}"><a id="nbrequests" href="{{ url }}" class="btn btn-danger">{{ label }}</a></div>')
css = "hidden" if nbrequests == 0 else ""
return [tpl.render(Context(dict(
label=_("%d pending requests" % nbrequests), url=url, css=css
)))]
label=_("%d pending requests" % nbrequests), url=url, css=css
)))]
@events.observe("ExtraDomainForm")
def extra_domain_form(user, domain):
from forms import DomainPolicyForm
from .forms import DomainPolicyForm
if not user.has_perm("admin.view_domains"):
return []
@@ -160,8 +158,8 @@ def extra_domain_form(user, domain):
dict(
id="amavis", title=_("Content filter"), cls=DomainPolicyForm,
formtpl="amavis/domain_content_filter.html"
)
]
)
]
@events.observe("FillDomainInstances")
+1 -1
View File
@@ -9,7 +9,7 @@ from django.utils.translation import ugettext as _
from django.db.models import Q
from modoboa.lib import parameters
from modoboa.lib.exceptions import ModoboaException
from models import Msgrcpt
from .models import Msgrcpt
def selfservice(ssfunc=None):
@@ -12,7 +12,9 @@ from modoboa.lib import parameters
from modoboa.lib.emailutils import sendmail_simple
from modoboa.admin.models import User, Domain
from modoboa.extensions.amavis import Amavis
from modoboa.extensions.amavis.models import *
from modoboa.extensions.amavis.models import (
Msgrcpt
)
from modoboa.extensions.amavis.sql_listing import get_wrapper
@@ -6,7 +6,10 @@ from optparse import make_option
from django.core.management.base import BaseCommand
from modoboa.lib import parameters
from modoboa.extensions.amavis import Amavis
from modoboa.extensions.amavis.models import *
from modoboa.extensions.amavis.models import (
Msgrcpt, Msgs, Maddr
)
class Command(BaseCommand):
args = ''
@@ -21,7 +24,7 @@ class Command(BaseCommand):
action='store_true',
default=False,
help='Display informational messages')
)
)
def __vprint(self, msg):
if not self.verbose:
@@ -42,7 +45,7 @@ class Command(BaseCommand):
app="amavis"))
flags = ['D']
if parameters.get_admin("RELEASED_MSGS_CLEANUP",
if parameters.get_admin("RELEASED_MSGS_CLEANUP",
app="amavis") == "yes":
flags += ['R']
@@ -51,14 +54,14 @@ class Command(BaseCommand):
for msg in Msgs.objects.filter(mail_id__in=ids):
if not msg.msgrcpt_set.exclude(rs__in=flags).count():
msg.delete()
self.__vprint("Deleting messages older than %d days..." % max_messages_age)
limit = int(time.time()) - (max_messages_age * 24 * 3600)
Msgs.objects.filter(time_num__lt=limit).delete()
self.__vprint("Deleting unreferenced e-mail addresses...")
for maddr in Maddr.objects.all():
if not len(maddr.msgs_set.all()) and not len(maddr.msgrcpt_set.all()):
if not maddr.msgs_set.count() and not maddr.msgrcpt_set.count():
maddr.delete()
self.__vprint("Done.")
+17 -17
View File
@@ -36,7 +36,7 @@ class SQLconnector(MBconnector):
"from": "mail__from_addr",
"subject": "mail__subject",
"date": "mail__time_num"
}
}
def __init__(self, mail_ids=None, filter=None):
self.count = None
@@ -106,7 +106,7 @@ class SQLWrapper(object):
else:
if not request.user.is_superuser:
doms = request.user.get_domains()
regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms))
regexp = "(%s)" % '|'.join([dom.name for dom in doms])
doms_q = Q(rid__email__regex=regexp)
q &= doms_q
if rcptfilter is not None:
@@ -121,7 +121,7 @@ class SQLWrapper(object):
return Msgrcpt.objects.filter(mail__in=mailids, rid__email=address)
def get_domains_pending_requests(self, domains):
regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, domains))
regexp = "(%s)" % '|'.join([dom.name for dom in domains])
return Msgrcpt.objects.filter(rs='p', rid__email__regex=regexp)
def get_pending_requests(self, user):
@@ -134,7 +134,7 @@ class SQLWrapper(object):
doms = user.get_domains()
if not doms.count():
return 0
regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms))
regexp = "(%s)" % '|'.join([dom.name for dom in doms])
doms_q = Q(rid__email__regex=regexp)
rq &= doms_q
return Msgrcpt.objects.filter(rq).count()
@@ -160,11 +160,11 @@ class PgWrapper(SQLWrapper):
where.append("convert_from(maddr.email, 'UTF8') = '%s'" % request.user.email)
return Msgrcpt.objects.filter(q).extra(
where=where, tables=['maddr']
)
)
if not request.user.is_superuser:
doms = request.user.get_domains()
regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms))
regexp = "(%s)" % '|'.join([dom.name for dom in doms])
where.append("convert_from(maddr.email, 'UTF8') ~ '%s'" % regexp)
if rcptfilter is not None:
where.append("convert_from(maddr.email, 'UTF8') LIKE '%%%s%%'" % rcptfilter)
@@ -174,21 +174,21 @@ class PgWrapper(SQLWrapper):
qset = Msgrcpt.objects.filter(mail=mailid).extra(
where=["msgrcpt.rid=maddr.id", "convert_from(maddr.email, 'UTF8') = '%s'" % address],
tables=['maddr']
)
)
return qset.all()[0]
def get_recipient_messages(self, address, mailids):
return Msgrcpt.objects.filter(mail__in=mailids).extra(
where=["U0.rid=maddr.id", "convert_from(maddr.email, 'UTF8') = '%s'" % address],
tables=['maddr']
)
)
def get_domains_pending_requests(self, domains):
regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, domains))
regexp = "(%s)" % '|'.join([dom.name for dom in domains])
return Msgrcpt.objects.filter(rs='p').extra(
where=["msgrcpt.rid=maddr.id", "convert_from(maddr.email, 'UTF8') ~ '%s'" % regexp],
tables=['maddr']
)
)
def get_pending_requests(self, user):
rq = Q(rs='p')
@@ -196,17 +196,17 @@ class PgWrapper(SQLWrapper):
doms = user.get_domains()
if not doms.count():
return 0
regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms))
regexp = "(%s)" % '|'.join([dom.name for dom in doms])
return Msgrcpt.objects.filter(rq).extra(
where=["msgrcpt.rid=maddr.id", "convert_from(maddr.email, 'UTF8') ~ '%s'" % (regexp,)],
tables=['maddr']
).count()
return len(Msgrcpt.objects.filter(rq))
).count()
return Msgrcpt.objects.filter(rq).count()
def get_mail_content(self, mailid):
return Quarantine.objects.filter(mail=mailid).extra(
select={'mail_text': "convert_from(mail_text, 'UTF8')"}
)
)
def get_wrapper():
@@ -267,6 +267,6 @@ class SQLemail(Email):
def render_headers(self, **kwargs):
return render_to_string("amavis/mailheaders.html", {
"qtype": self.qtype, "qreason": self.qreason,
"headers": self.headers,
})
"qtype": self.qtype, "qreason": self.qreason,
"headers": self.headers,
})
+38 -37
View File
@@ -1,5 +1,6 @@
# coding: utf-8
import email
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.template import Template, Context
from django.utils import simplejson
@@ -10,12 +11,14 @@ from django.contrib.auth.decorators \
from django.db.models import Q
from modoboa.lib import parameters
from modoboa.lib.exceptions import ModoboaException
from modoboa.lib.webutils import _render, getctx, ajax_response, ajax_simple_response
from modoboa.admin.models import Mailbox
from lib import *
from templatetags.amextras import *
from modoboa.lib.webutils import (
getctx, ajax_response, ajax_simple_response
)
from modoboa.lib.email_listing import parse_search_parameters
from sql_listing import *
from modoboa.extensions.admin.models import Mailbox
from templatetags.amextras import quar_menu, viewm_menu
from .lib import selfservice, AMrelease
from .sql_listing import SQLlisting, SQLemail, get_wrapper
def __get_current_url(request):
@@ -23,8 +26,9 @@ def __get_current_url(request):
res = "listing?page=%s" % request.session["page"]
else:
res = ""
params = "&".join(map(lambda p: "%s=%s" % (p, request.session[p]),
filter(request.session.has_key, ["criteria", "pattern"])))
params = "&".join(["%s=%s" % (p, request.session[p])
for p in ["criteria", "pattern"]
if p in request.sessions])
if params != "":
res += "?%s" % (params)
return res
@@ -53,7 +57,7 @@ def _listing(request):
request.session["navparams"]["order"] = order
parse_search_parameters(request)
if request.session.has_key("pattern"):
if "pattern" in request.session:
criteria = request.session["criteria"]
if criteria == "both":
criteria = "from_addr,subject,to"
@@ -71,18 +75,19 @@ def _listing(request):
msgs = get_wrapper().get_mails(request, rcptfilter)
if request.GET.has_key("page"):
if "page" in request.GET:
request.session["page"] = request.GET["page"]
pageid = int(request.session["page"])
else:
if request.session.has_key("page"):
if "page" in request.session:
del request.session["page"]
pageid = 1
lst = SQLlisting(request.user, msgs, flt,
navparams=request.session["navparams"],
elems_per_page=int(parameters.get_user(request.user,
"MESSAGES_PER_PAGE")))
lst = SQLlisting(
request.user, msgs, flt,
navparams=request.session["navparams"],
elems_per_page=int(parameters.get_user(request.user, "MESSAGES_PER_PAGE"))
)
page = lst.paginator.getpage(pageid)
if not page:
return empty_quarantine(request)
@@ -96,40 +101,36 @@ def _listing(request):
@login_required
def index(request):
return _render(request, "amavis/index.html", dict(
deflocation="listing/", defcallback="listing_cb", selection="quarantine"
))
return render(request, "amavis/index.html", dict(
deflocation="listing/", defcallback="listing_cb", selection="quarantine"
))
def getmailcontent_selfservice(request, mail_id):
from sql_listing import SQLemail
qmails = get_wrapper().get_mail_content(mail_id)
content = ""
for qm in qmails:
content += qm.mail_text
msg = email.message_from_string(content)
mail = SQLemail(msg, mformat="plain", links="0")
return _render(request, "common/viewmail.html", {
"headers": mail.render_headers(),
"mailbody": mail.body
})
return render(request, "common/viewmail.html", {
"headers": mail.render_headers(),
"mailbody": mail.body
})
@selfservice(getmailcontent_selfservice)
def getmailcontent(request, mail_id):
from sql_listing import SQLemail
qmails = get_wrapper().get_mail_content(mail_id)
content = ""
for qm in qmails:
content += qm.mail_text
msg = email.message_from_string(content)
mail = SQLemail(msg, mformat="plain", links="0")
return _render(request, "common/viewmail.html", {
"headers": mail.render_headers(),
"mailbody": mail.body
})
return render(request, "common/viewmail.html", {
"headers": mail.render_headers(),
"mailbody": mail.body
})
def viewmail_selfservice(request, mail_id,
@@ -142,9 +143,9 @@ def viewmail_selfservice(request, mail_id,
<iframe src="{% url 'modoboa.extensions.amavis.views.getmailcontent' mail_id %}" id="mailcontent"></iframe>
""").render(Context(dict(mail_id=mail_id)))
return _render(request, tplname, dict(
mail_id=mail_id, rcpt=rcpt, secret_id=secret_id, content=content
))
return render(request, tplname, dict(
mail_id=mail_id, rcpt=rcpt, secret_id=secret_id, content=content
))
@selfservice(viewmail_selfservice)
@@ -176,13 +177,13 @@ def viewheaders(request, mail_id):
content += qm.mail_text
msg = email.message_from_string(content)
return _render(request, 'amavis/viewheader.html', {
"headers": msg.items()
})
"headers": msg.items()
})
def check_mail_id(request, mail_id):
if type(mail_id) in [str, unicode]:
if request.GET.has_key("rcpt"):
if "rcpt" in request.GET:
mail_id = ["%s %s" % (request.GET["rcpt"], mail_id)]
else:
mail_id = [mail_id]
@@ -318,5 +319,5 @@ def process(request):
@login_required
@user_passes_test(lambda u: u.group != 'SimpleUsers')
def nbrequests(request):
nbrequests = get_wrapper().get_pending_requests(request.user)
return ajax_simple_response(dict(status="ok", requests=nbrequests))
result = get_wrapper().get_pending_requests(request.user)
return ajax_simple_response(dict(status="ok", requests=result))