From 1353fe979c5883a653c6f761afe3a9cc2804edc2 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 23 Aug 2013 10:59:12 +0200 Subject: [PATCH] wip: big refactoring amavis extension still needs work. --- modoboa/extensions/amavis/__init__.py | 32 ++++---- modoboa/extensions/amavis/lib.py | 2 +- .../amavis/management/commands/amnotify.py | 4 +- .../amavis/management/commands/qcleanup.py | 15 ++-- modoboa/extensions/amavis/sql_listing.py | 34 ++++----- modoboa/extensions/amavis/views.py | 75 ++++++++++--------- 6 files changed, 83 insertions(+), 79 deletions(-) diff --git a/modoboa/extensions/amavis/__init__.py b/modoboa/extensions/amavis/__init__.py index 1333f3b6e..9a8bc1b15 100644 --- a/modoboa/extensions/amavis/__init__.py +++ b/modoboa/extensions/amavis/__init__.py @@ -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('
{{ label }}
') 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") diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 1d3774ca9..607e93514 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -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): diff --git a/modoboa/extensions/amavis/management/commands/amnotify.py b/modoboa/extensions/amavis/management/commands/amnotify.py index 298a22621..ec3df5ea8 100644 --- a/modoboa/extensions/amavis/management/commands/amnotify.py +++ b/modoboa/extensions/amavis/management/commands/amnotify.py @@ -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 diff --git a/modoboa/extensions/amavis/management/commands/qcleanup.py b/modoboa/extensions/amavis/management/commands/qcleanup.py index d724c93b2..c57aee2ef 100644 --- a/modoboa/extensions/amavis/management/commands/qcleanup.py +++ b/modoboa/extensions/amavis/management/commands/qcleanup.py @@ -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.") diff --git a/modoboa/extensions/amavis/sql_listing.py b/modoboa/extensions/amavis/sql_listing.py index 4fb2e91a7..e92a61b41 100644 --- a/modoboa/extensions/amavis/sql_listing.py +++ b/modoboa/extensions/amavis/sql_listing.py @@ -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, + }) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 46f8f4155..255018a53 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -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, """).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))