mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
wip: big refactoring
amavis extension still needs work.
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user