diff --git a/modoboa/extensions/sievefilters/forms.py b/modoboa/extensions/sievefilters/forms.py index 3db5cf368..01e91e98c 100644 --- a/modoboa/extensions/sievefilters/forms.py +++ b/modoboa/extensions/sievefilters/forms.py @@ -1,10 +1,13 @@ +"""Custom forms.""" + from django import forms -from django.http import QueryDict -from django.utils.translation import ugettext as _, ugettext_lazy from django.forms.widgets import RadioFieldRenderer, RadioSelect, RadioInput -from django.utils.safestring import mark_safe -from django.utils.html import conditional_escape +from django.http import QueryDict from django.utils.encoding import force_unicode +from django.utils.html import conditional_escape +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _, ugettext_lazy + from modoboa.extensions.admin.templatetags.admin_tags import gender @@ -20,6 +23,7 @@ class FiltersSetForm(forms.Form): class CustomRadioInput(RadioInput): + def __unicode__(self): return self.render() @@ -39,13 +43,16 @@ class CustomRadioInput(RadioInput): class CustomRadioFieldRenderer(RadioFieldRenderer): + def __iter__(self): for i, choice in enumerate(self.choices): - yield CustomRadioInput(self.name, self.value, self.attrs.copy(), choice, i) + yield CustomRadioInput( + self.name, self.value, self.attrs.copy(), choice, i) def __getitem__(self, idx): choice = self.choices[idx] - return CustomRadioInput(self.name, self.value, self.attrs.copy(), choice, idx) + return CustomRadioInput( + self.name, self.value, self.attrs.copy(), choice, idx) def render(self): return mark_safe(u'\n'.join([force_unicode(w) for w in self])) @@ -56,6 +63,7 @@ class CustomRadioSelect(RadioSelect): class FilterForm(forms.Form): + def __init__(self, conditions, actions, request, *args, **kwargs): super(FilterForm, self).__init__(*args, **kwargs) @@ -80,10 +88,18 @@ class FilterForm(forms.Form): ] self.cond_templates = [ - {"name": "Subject", "label": _("Subject"), "operators": self.header_operators}, - {"name": "From", "label": _("Sender"), "operators": self.header_operators}, - {"name": "To", "label": _("Recipient"), "operators": self.header_operators}, - {"name": "Cc", "label": _("Cc"), "operators": self.header_operators}, + {"name": "Subject", + "label": _("Subject"), + "operators": self.header_operators}, + {"name": "From", + "label": _("Sender"), + "operators": self.header_operators}, + {"name": "To", + "label": _("Recipient"), + "operators": self.header_operators}, + {"name": "Cc", + "label": _("Cc"), + "operators": self.header_operators}, {"name": "size", "label": _("Size"), "operators": [("over", _("is greater than"), "number"), ("under", _("is less than"), "number")]}, @@ -160,10 +176,14 @@ class FilterForm(forms.Form): arg = args[cnt] aname = "action_arg_%d_%d" % (self.actions_cnt, cnt) if arg["type"] == "string": - self.fields[aname] = forms.CharField(max_length=255, initial=value) + self.fields[aname] = forms.CharField( + max_length=255, + initial=value) elif arg["type"] == "list": choices = getattr(self, arg["vloader"])(request) - self.fields[aname] = forms.ChoiceField(initial=value, choices=choices) + self.fields[aname] = forms.ChoiceField( + initial=value, + choices=choices) self.actions_cnt += 1 def _build_redirect_field(self, request, value): @@ -177,7 +197,10 @@ class FilterForm(forms.Form): for fd in folders: value = fd["path"] if "path" in fd else fd["name"] if parentmb: - ret += [(value, fd["name"].replace("%s%s" % (parentmb, imapc.hdelimiter), ""))] + ret += [ + (value, fd["name"].replace( + "%s%s" % (parentmb, imapc.hdelimiter), "")) + ] else: ret += [(value, fd["name"])] if "sub" in fd: @@ -206,7 +229,10 @@ class FilterForm(forms.Form): argcpt = 0 while True: try: - naction += (self.cleaned_data["action_arg_%d_%d" % (cpt, argcpt)],) + naction += ( + self.cleaned_data[ + "action_arg_%d_%d" % + (cpt, argcpt)],) except KeyError: break argcpt += 1 @@ -228,8 +254,12 @@ def build_filter_form_from_qdict(request): if cpt == int(request.POST["conds"]): break if "cond_target_%d" % i in request.POST: - qdict["cond_target_%d" % cpt] = request.POST["cond_target_%d" % i] - qdict["cond_operator_%d" % cpt] = request.POST["cond_operator_%d" % i] + qdict["cond_target_%d" % cpt] = ( + request.POST["cond_target_%d" % i] + ) + qdict["cond_operator_%d" % cpt] = ( + request.POST["cond_operator_%d" % i] + ) qdict["cond_value_%d" % cpt] = request.POST["cond_value_%d" % i] condtarget = request.POST["cond_target_%d" % i] condop = request.POST["cond_operator_%d" % i] diff --git a/modoboa/extensions/sievefilters/lib.py b/modoboa/extensions/sievefilters/lib.py index b980bc1d4..26cf8a2d1 100644 --- a/modoboa/extensions/sievefilters/lib.py +++ b/modoboa/extensions/sievefilters/lib.py @@ -1,12 +1,16 @@ # coding: utf-8 -from django.utils.translation import ugettext as _ +"""Internal tools.""" + +from sievelib.factory import FiltersSet from sievelib.managesieve import Client, Error from sievelib.parser import Parser -from sievelib.factory import FiltersSet + +from django.utils.translation import ugettext as _ + from modoboa.lib import parameters -from modoboa.lib.exceptions import ModoboaException from modoboa.lib.connections import ConnectionsManager, ConnectionError +from modoboa.lib.exceptions import ModoboaException class SieveClientError(ModoboaException): @@ -19,7 +23,7 @@ class SieveClient(object): def __init__(self, user=None, password=None): try: ret, msg = self.login(user, password) - except Error, e: + except Error as e: raise ConnectionError(str(e)) if not ret: raise ConnectionError(msg) @@ -38,7 +42,10 @@ class SieveClient(object): except Error: ret = False if not ret: - return False, _("Connection to MANAGESIEVE server failed, check your configuration") + return False, _( + "Connection to MANAGESIEVE server failed, check your " + "configuration" + ) return True, None def logout(self): @@ -51,13 +58,13 @@ class SieveClient(object): if self.msc is not None: try: self.msc.capability() - except Error, e: + except Error as e: pass else: return try: ret, msg = self.login(user, password) - except (Error, ssl.SSLError), e: + except (Error, ssl.SSLError) as e: raise ConnectionError(e) if not ret: raise ConnectionError(msg) @@ -80,10 +87,11 @@ class SieveClient(object): return fs def pushscript(self, name, content, active=False): - if type(content) is unicode: + if isinstance(content, unicode): content = content.encode("utf-8") if not self.msc.havespace(name, len(content)): - error = "%s (%s)" % (_("Not enough space on server"), self.msc.errmsg) + error = "%s (%s)" % ( + _("Not enough space on server"), self.msc.errmsg) raise SieveClientError(error) if not self.msc.putscript(name, content): raise SieveClientError(self.msc.errmsg) diff --git a/modoboa/extensions/sievefilters/templatetags/sfilters_tags.py b/modoboa/extensions/sievefilters/templatetags/sfilters_tags.py index c1336a923..3bc0f937f 100644 --- a/modoboa/extensions/sievefilters/templatetags/sfilters_tags.py +++ b/modoboa/extensions/sievefilters/templatetags/sfilters_tags.py @@ -34,7 +34,7 @@ def fset_menu(mode, setname): "img": "fa fa-plus", "label": _("New filter"), "url": reverse("sievefilters:filter_add", - args=[setname]), + args=[setname]), "modal": True, "autowidth": True, "modalcb": "filterform_cb"} @@ -45,7 +45,7 @@ def fset_menu(mode, setname): "img": "fa fa-download-alt", "label": _("Save filters set"), "url": reverse("sievefilters:fs_save", - args=[setname])}, + args=[setname])}, ] entries += [ @@ -53,7 +53,7 @@ def fset_menu(mode, setname): "img": "fa fa-check", "label": _("Activate filters set"), "url": reverse("sievefilters:fs_activate", - args=[setname])}, + args=[setname])}, {"name": "removefs", "img": "fa fa-trash", "label": _("Remove filters set"), diff --git a/modoboa/extensions/sievefilters/test.py b/modoboa/extensions/sievefilters/test.py index 2555f22bc..9d35832dc 100644 --- a/modoboa/extensions/sievefilters/test.py +++ b/modoboa/extensions/sievefilters/test.py @@ -2,7 +2,7 @@ if __name__ == "__main__": clt = ManageSieveClient("mail.koalabs.org", 2000) if clt.connect("tonio@ngyn.org", "aka/12;c", starttls=True): print clt.get_sasl_mechanisms() - print clt.get_sieve_capabilities() + print clt.get_sieve_capabilities() print clt.havespace("test", 45) if not clt.putscript("myscript", """require ["fileinto", "envelope"]; @@ -40,4 +40,3 @@ InvalidSieveCommand else: print clt.errmsg clt.logout() - diff --git a/modoboa/extensions/sievefilters/views.py b/modoboa/extensions/sievefilters/views.py index 2aef75859..2a97b479b 100644 --- a/modoboa/extensions/sievefilters/views.py +++ b/modoboa/extensions/sievefilters/views.py @@ -1,25 +1,31 @@ # coding: utf-8 -from sievelib.managesieve import Error -from sievelib.commands import BadArgument, BadValue + +"""Custom views.""" + from rfc6266 import build_header -from django.shortcuts import render -from django.http import HttpResponse -from django.template.loader import render_to_string +from sievelib.commands import BadArgument, BadValue +from sievelib.managesieve import Error + 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.web_utils import _render_error, \ - ajax_response, render_to_json_response -from modoboa.lib.connections import ConnectionError -from modoboa.lib.exceptions import BadRequest -from modoboa.extensions.admin.lib import needs_mailbox -from .lib import SieveClient, SieveClientError +from django.http import HttpResponse +from django.shortcuts import render +from django.template.loader import render_to_string +from django.utils.translation import ugettext as _ + from .forms import ( FilterForm, build_filter_form_from_qdict, build_filter_form_from_filter, FiltersSetForm ) +from .lib import SieveClient, SieveClientError from .templatetags.sfilters_tags import fset_menu +from modoboa.extensions.admin.lib import needs_mailbox +from modoboa.lib import parameters +from modoboa.lib.connections import ConnectionError +from modoboa.lib.exceptions import BadRequest +from modoboa.lib.web_utils import ( + _render_error, ajax_response, render_to_json_response +) @login_required @@ -30,12 +36,12 @@ def index(request, tplname="sievefilters/index.html"): try: sc = SieveClient(user=request.user.username, password=request.session["password"]) - except ConnectionError, e: + except ConnectionError as e: return _render_error(request, user_context={"error": e}) try: active_script, scripts = sc.listscripts() - except Error, e: + except Error as e: return _render_error(request, user_context={"error": e}) if active_script is None: @@ -73,7 +79,7 @@ def getfs(request, name): error = None try: content = sc.getscript(name, format=editormode) - except SieveClientError, e: + except SieveClientError as e: error = str(e) else: if content is None: @@ -104,7 +110,8 @@ def build_filter_ctx(ctx, form): return ctx -def submitfilter(request, setname, okmsg, tplname, tplctx, update=False, sc=None): +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: @@ -169,11 +176,13 @@ def editfilter(request, setname, fname, tplname="sievefilters/filter.html"): 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) + return submitfilter( + request, setname, _("Filter modified"), tplname, ctx, + update=True, sc=sc + ) fset = sc.getscript(setname, format="fset") - if type(fname) is unicode: + if isinstance(fname, unicode): fname = fname.encode("utf-8") f = fset.getfilter(fname) form = build_filter_form_from_filter(request, fname, f) @@ -199,13 +208,13 @@ def removefilter(request, setname, fname): @login_required @needs_mailbox() def savefs(request, name): - if not "scriptcontent" in request.POST: + if "scriptcontent" not in request.POST: return sc = SieveClient(user=request.user.username, password=request.session["password"]) try: sc.pushscript(name, request.POST["scriptcontent"]) - except SieveClientError, e: + except SieveClientError as e: error = str(e) return ajax_response(request, "ko", respmsg=error) return ajax_response(request, respmsg=_("Filters set saved")) @@ -258,7 +267,7 @@ def activate_filters_set(request, name): password=request.session["password"]) try: sc.activatescript(name) - except SieveClientError, e: + except SieveClientError as e: return ajax_response(request, "ko", respmsg=str(e)) return ajax_response(request, respmsg=_("Filters set activated")) @@ -270,7 +279,7 @@ def download_filters_set(request, name): password=request.session["password"]) try: script = sc.getscript(name) - except SieveClientError, e: + except SieveClientError as e: return ajax_response(request, "ko", respmsg=str(e)) resp = HttpResponse(script) @@ -285,7 +294,7 @@ def download_filters_set(request, name): def toggle_filter_state(request, setname, fname): sc = SieveClient(user=request.user.username, password=request.session["password"]) - if type(fname) is unicode: + if isinstance(fname, unicode): fname = fname.encode("utf-8") fset = sc.getscript(setname, format="fset") if fset.is_filter_disabled(fname):