Files
modoboa/extensions/sievefilters/views.py
T
Antoine Nguyen 9cde410ae4 * Many changes about internationalization (using gettext_noop when needed for example)
* Some strings were not detected by makemessages (for example in javascript files, behind comments...). There are still some issues with that but I think I'll have to wait a future Django release.
* Support for per-user language selection is almost done.

see #166
2011-09-14 14:18:46 +02:00

286 lines
10 KiB
Python

# coding: utf-8
from sievelib.managesieve import Error
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from modoboa.lib import parameters
from modoboa.lib.webutils import _render, _render_to_string, _render_error, \
ajax_response, ajax_simple_response
from modoboa.admin.lib import is_not_localadmin
from modoboa.lib.connections import ConnectionError
from modoboa.auth.lib import get_password
from lib import *
from forms import *
@login_required
@is_not_localadmin()
def index(request, tplname="sievefilters/index.html"):
try:
sc = SieveClient(user=request.user.username,
password=request.session["password"])
except ConnectionError, e:
return _render_error(request, user_context={"error" : e})
try:
active_script, scripts = sc.listscripts()
except Error, e:
return _render_error(request, user_context={"error" : e})
if active_script is None:
active_script = ""
default_script = scripts[0] if len(scripts) else ""
else:
default_script = active_script
return _render(request, tplname, {
"active_script" : active_script,
"default_script" : default_script,
"scripts" : sorted(scripts),
})
@login_required
@is_not_localadmin()
def get_templates(request, ftype):
if ftype == "condition":
return ajax_simple_response(FilterForm([], [], request).cond_templates)
return ajax_simple_response(FilterForm([], [], request).action_templates)
@login_required
@is_not_localadmin()
def get_user_folders(request):
from modoboa.extensions.webmail.lib import IMAPconnector
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ret = mbc.getfolders(request.user, unseen_messages=False)
return ajax_simple_response(ret)
@login_required
@is_not_localadmin()
def getfs(request, name):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
editormode = parameters.get_user(request.user, "EDITOR_MODE")
error = None
try:
content = sc.getscript(name, format=editormode)
except SieveClientError, e:
error = str(e)
else:
if content is None:
error = _("Failed to retrieve filters set")
if error is not None:
return ajax_response(request, "ko", respmsg=error)
if editormode == "raw":
return ajax_response(request, template="sievefilters/rawfilter.html",
name=name, scriptcontent=content)
return ajax_response(request, template="sievefilters/guieditor.html",
fs=content)
def build_filter_ctx(ctx, form):
ctx["form"] = form
ctx["conds_nb"] = range(form.conds_cnt)
ctx["actions_nb"] = range(form.actions_cnt)
return ctx
def submitfilter(request, setname, okmsg, tplname, tplctx, update=False, sc=None):
form = build_filter_form_from_qdict(request)
if form.is_valid():
if sc is None:
sc = SieveClient(user=request.user.username,
password=request.session["password"])
fset = sc.getscript(setname, format="fset")
conditions, actions = form.tofilter()
match_type = form.cleaned_data["match_type"]
if match_type == "all":
match_type = "anyof"
conditions = [("true",)]
if not update:
fset.addfilter(form.cleaned_data["name"], conditions, actions,
match_type)
else:
fset.updatefilter(request.POST["oldname"],
form.cleaned_data["name"], conditions, actions,
match_type)
sc.pushscript(fset.name, str(fset))
return ajax_response(request, respmsg=okmsg, ajaxnav=True)
tplctx = build_filter_ctx(tplctx, form)
return ajax_response(request, status="ko", template=tplname, **tplctx)
@login_required
@is_not_localadmin()
def newfilter(request, setname, tplname="sievefilters/filter.html"):
ctx = {"title" : _("New filter"),
"actionurl" : reverse(newfilter, args=[setname])}
if request.method == "POST":
return submitfilter(request, setname, _("Filter created"), tplname, ctx)
conds = [("Subject", "contains", "")]
actions = [("fileinto", "")]
form = FilterForm(conds, actions, request)
ctx = build_filter_ctx(ctx, form)
return _render(request, tplname, ctx)
@login_required
@is_not_localadmin()
def editfilter(request, setname, fname, tplname="sievefilters/filter.html"):
ctx = {"title" : _("Edit filter"),
"actionurl" : reverse(editfilter, args=[setname, fname])}
sc = SieveClient(user=request.user.username,
password=request.session["password"])
if request.method == "POST":
return submitfilter(request, setname, _("Filter modified"), tplname, ctx,
update=True, sc=sc)
fset = sc.getscript(setname, format="fset")
f = fset.getfilter(fname)
form = build_filter_form_from_filter(request, fname, f)
ctx = build_filter_ctx(ctx, form)
ctx["oldname"] = fname
ctx["hidestyle"] = "none" \
if form.fields["match_type"].initial == "all" else "block"
return _render(request, tplname, ctx)
@login_required
@is_not_localadmin()
def removefilter(request, setname, fname):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
fset = sc.getscript(setname, format="fset")
if fset.removefilter(fname):
sc.pushscript(fset.name, str(fset))
return ajax_response(request, respmsg=_("Filter removed"))
return ajax_response(request, "ko", respmsg=_("Failed to remove filter"))
@login_required
@is_not_localadmin()
def savefs(request, name):
if not request.POST.has_key("scriptcontent"):
return
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
sc.pushscript(name, request.POST["scriptcontent"])
except SieveClientError, e:
error = str(e)
return ajax_response(request, "ko", respmsg=error)
return ajax_response(request, respmsg=_("Filters set saved"))
@login_required
@is_not_localadmin()
def new_filters_set(request, tplname="sievefilters/newfiltersset.html"):
ctx = {"title" : _("Create a new filters set"),
"fname" : "newfiltersset",
"submit_label" : _("Create"),
"withmenu" : False,
"withunseen" : False}
if request.method == "POST":
form = FiltersSetForm(request.POST)
error = None
if form.is_valid():
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
sc.pushscript(form.cleaned_data["name"], "# Empty script",
form.cleaned_data["active"])
except SieveClientError, e:
error = str(e)
else:
return ajax_response(request,
ajaxnav=True,
url=form.cleaned_data["name"],
respmsg=_("Filters set created"))
ctx["form"] = form
ctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **ctx)
ctx["form"] = FiltersSetForm()
return _render(request, tplname, ctx)
@login_required
@is_not_localadmin()
def remove_filters_set(request, name):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
sc.deletescript(name)
except SieveClientError, e:
return ajax_response(request, "ko", respmsg=str(e))
return ajax_response(request, respmsg=_("Filters set deleted"))
@login_required
@is_not_localadmin()
def activate_filters_set(request, name):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
sc.activatescript(name)
except SieveClientError, e:
return ajax_response(request, "ko", respmsg=str(e))
return ajax_response(request, respmsg=_("Filters set activated"))
@login_required
@is_not_localadmin()
def download_filters_set(request, name):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
script = sc.getscript(name)
except SieveClientError, e:
return ajax_response(request, "ko", respmsg=str(e))
resp = HttpResponse(script)
resp["Content-Type"] = "text/plain"
resp["Content-Length"] = len(script)
resp["Content-Disposition"] = 'attachment; filename="%s.txt"' % name
return resp
@login_required
@is_not_localadmin()
def toggle_filter_state(request, setname, fname):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
fset = sc.getscript(setname, format="fset")
if fset.is_filter_disabled(fname):
ret = fset.enablefilter(fname)
newstate = _("yes")
color = "green"
else:
ret = fset.disablefilter(fname)
newstate = _("no")
color = "red"
if not ret:
pass
sc.pushscript(setname, str(fset))
except SieveClientError, e:
return ajax_response(request, "ko", respmsg=str(e))
return ajax_simple_response({
"status" : "ok",
"label" : newstate,
"color" : color
})
def move_filter(request, setname, fname, direction):
sc = SieveClient(user=request.user.username,
password=request.session["password"])
try:
fset = sc.getscript(setname, format="fset")
fset.movefilter(fname, direction)
sc.pushscript(setname, str(fset))
except (SieveClientError), e:
return ajax_response(request, "ko", respmsg=str(e))
return ajax_response(request, template="sievefilters/filters.html", fs=fset)
@login_required
@is_not_localadmin()
def move_filter_up(request, setname, fname):
return move_filter(request, setname, fname, "up")
@login_required
@is_not_localadmin()
def move_filter_down(request, setname, fname):
return move_filter(request, setname, fname, "down")