diff --git a/modoboa/extensions/admin/templatetags/admin_tags.py b/modoboa/extensions/admin/templatetags/admin_tags.py index 24290feef..d05b8ad9c 100644 --- a/modoboa/extensions/admin/templatetags/admin_tags.py +++ b/modoboa/extensions/admin/templatetags/admin_tags.py @@ -147,7 +147,8 @@ def domain_actions(user, domain): if domain.__class__.__name__ == 'Domain': actions = [ {"name": "listidentities", - "url": reverse("admin:identity_list") + "#list/?searchquery=@%s" % domain.name, + "url": "{0}#list/?searchquery=@{1}".format( + reverse("admin:identity_list"), domain.name), "title": _("View the domain's identities"), "img": "fa fa-user"} ] @@ -277,5 +278,3 @@ def get_extra_admin_content(user, target, currentpage): "ExtraAdminContent", user, target, currentpage ) return "".join(res) - - diff --git a/modoboa/extensions/admin/tests/account.py b/modoboa/extensions/admin/tests/account.py index 12b16fee8..6881056a4 100644 --- a/modoboa/extensions/admin/tests/account.py +++ b/modoboa/extensions/admin/tests/account.py @@ -1,10 +1,11 @@ from django.core.urlresolvers import reverse + from modoboa.core.models import User -from modoboa.lib.tests import ModoTestCase +from modoboa.extensions.admin import factories from modoboa.extensions.admin.models import ( Domain, Mailbox ) -from modoboa.extensions.admin import factories +from modoboa.lib.tests import ModoTestCase class AccountTestCase(ModoTestCase): @@ -62,10 +63,14 @@ class AccountTestCase(ModoTestCase): def test_set_nul_quota_as_domainadmin(self): self.clt.logout() - self.assertTrue(self.clt.login(username="admin@test.com", password="toto")) + self.assertTrue( + self.clt.login(username="admin@test.com", password="toto") + ) self._set_quota("user@test.com", 0, 400) self.clt.logout() - self.assertTrue(self.clt.login(username="admin@test2.com", password="toto")) + self.assertTrue( + self.clt.login(username="admin@test2.com", password="toto") + ) self._set_quota("user@test2.com", 0) @@ -119,8 +124,9 @@ class PermissionsTestCase(ModoTestCase): def test_self_modif(self): self.clt.logout() - self.assertEqual(self.clt.login(username="admin@test.com", password="toto"), - True) + self.assertTrue( + self.clt.login(username="admin@test.com", password="toto") + ) admin = User.objects.get(username="admin@test.com") values = dict( username="admin@test.com", first_name="Admin", @@ -132,7 +138,7 @@ class PermissionsTestCase(ModoTestCase): values ) self.assertEqual(admin.group, "DomainAdmins") - self.assertEqual(admin.can_access(Domain.objects.get(name="test.com")), True) + self.assertTrue(admin.can_access(Domain.objects.get(name="test.com"))) values["role"] = "SuperAdmins" self.ajax_post( diff --git a/modoboa/extensions/admin/tests/alias.py b/modoboa/extensions/admin/tests/alias.py index 5dbac1a8d..e470b8d49 100644 --- a/modoboa/extensions/admin/tests/alias.py +++ b/modoboa/extensions/admin/tests/alias.py @@ -1,10 +1,11 @@ from django.core.urlresolvers import reverse + from modoboa.core.models import User -from modoboa.lib.tests import ModoTestCase +from modoboa.extensions.admin import factories from modoboa.extensions.admin.models import ( Alias ) -from modoboa.extensions.admin import factories +from modoboa.lib.tests import ModoTestCase class AliasTestCase(ModoTestCase): @@ -80,8 +81,8 @@ class AliasTestCase(ModoTestCase): self.assertEqual(fwd.get_recipients_count(), 1) self.ajax_post( - reverse("admin:alias_delete") + "?selection=%d" \ - % fwd.id, {} + reverse("admin:alias_delete") + "?selection=%d" + % fwd.id, {} ) self.assertRaises(Alias.DoesNotExist, Alias.objects.get, address="forward2", domain__name="test.com") diff --git a/modoboa/extensions/admin/tests/export.py b/modoboa/extensions/admin/tests/export.py index 19df335a1..ca95c4b7d 100644 --- a/modoboa/extensions/admin/tests/export.py +++ b/modoboa/extensions/admin/tests/export.py @@ -1,6 +1,7 @@ from django.core.urlresolvers import reverse -from modoboa.lib.tests import ModoTestCase + from modoboa.extensions.admin import factories +from modoboa.lib.tests import ModoTestCase class ExportTestCase(ModoTestCase): @@ -12,8 +13,8 @@ class ExportTestCase(ModoTestCase): def __export_identities(self, idtfilter="", grpfilter=""): self.clt.get( - reverse("admin:_identity_list") \ - + "?grpfilter=%s&idtfilter=%s" % (grpfilter, idtfilter) + reverse("admin:_identity_list") + + "?grpfilter=%s&idtfilter=%s" % (grpfilter, idtfilter) ) return self.clt.post( reverse("admin:identity_export"), @@ -39,7 +40,7 @@ class ExportTestCase(ModoTestCase): idtfilter="account", grpfilter="SimpleUsers" ) self.assertListEqual( - "account;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com;10\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com;10", + "account;user@test.com;{PLAIN}toto;;;True;SimpleUsers;user@test.com;10\r\naccount;user@test2.com;{PLAIN}toto;;;True;SimpleUsers;user@test2.com;10", response.content.strip() ) diff --git a/modoboa/extensions/admin/tests/import_.py b/modoboa/extensions/admin/tests/import_.py index 5195ad0e0..dee11d995 100644 --- a/modoboa/extensions/admin/tests/import_.py +++ b/modoboa/extensions/admin/tests/import_.py @@ -1,12 +1,13 @@ # coding: utf-8 -from django.core.urlresolvers import reverse from django.core.files.base import ContentFile +from django.core.urlresolvers import reverse + from modoboa.core.models import User -from modoboa.lib.tests import ModoTestCase +from modoboa.extensions.admin import factories from modoboa.extensions.admin.models import ( Domain, Alias, DomainAlias ) -from modoboa.extensions.admin import factories +from modoboa.lib.tests import ModoTestCase class ImportTestCase(ModoTestCase): @@ -76,7 +77,9 @@ dlist; dlist@test.com; True; user1@test.com; user@extdomain.com self.assertEqual(mb1.quota, 0) self.assertTrue(admin.is_owner(mb1)) self.assertEqual(mb1.full_address, "user1@test.com") - self.assertTrue(self.clt.login(username="user1@test.com", password="toto")) + self.assertTrue( + self.clt.login(username="user1@test.com", password="toto") + ) da = User.objects.get(username="truc@test.com") damb = da.mailbox_set.all()[0] @@ -159,7 +162,9 @@ account; truc@test.com; toto; René; Truc; True; DomainAdmins; truc@test.com; 0; Expected result: no """ self.clt.logout() - self.assertTrue(self.clt.login(username="admin@test.com", password="toto")) + self.assertTrue( + self.clt.login(username="admin@test.com", password="toto") + ) f = ContentFile(b""" account; sa@test.com; toto; Super; Admin; True; SuperAdmins; superadmin@test.com; 50 """, name="identities.csv") diff --git a/modoboa/extensions/admin/views/export.py b/modoboa/extensions/admin/views/export.py index 865371746..38fe6494f 100644 --- a/modoboa/extensions/admin/views/export.py +++ b/modoboa/extensions/admin/views/export.py @@ -1,17 +1,22 @@ -import csv +"""Export related views.""" + import cStringIO +import csv + from rfc6266 import build_header -from django.http import HttpResponse -from django.shortcuts import render -from django.core.urlresolvers import reverse -from django.utils.translation import ugettext as _ + from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) -from modoboa.extensions.admin.lib import get_domains, get_identities +from django.core.urlresolvers import reverse +from django.http import HttpResponse +from django.shortcuts import render +from django.utils.translation import ugettext as _ + from modoboa.extensions.admin.forms import ( ExportIdentitiesForm, ExportDomainsForm ) +from modoboa.extensions.admin.lib import get_domains, get_identities def _export(content, filename): @@ -46,7 +51,9 @@ def export_identities(request): form.is_valid() fp = cStringIO.StringIO() csvwriter = csv.writer(fp, delimiter=form.cleaned_data["sepchar"]) - for ident in get_identities(request.user, **request.session['identities_filters']): + identities = get_identities( + request.user, **request.session['identities_filters']) + for ident in identities: ident.to_csv(csvwriter) content = fp.getvalue() fp.close() diff --git a/modoboa/extensions/admin/views/identity.py b/modoboa/extensions/admin/views/identity.py index bc41b2e55..58b93cebb 100644 --- a/modoboa/extensions/admin/views/identity.py +++ b/modoboa/extensions/admin/views/identity.py @@ -1,30 +1,29 @@ -""" -Identity related views. -""" -from django.shortcuts import render -from django.utils.translation import ugettext as _, ungettext +"""Identity related views.""" + from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) +from django.shortcuts import render +from django.utils.translation import ugettext as _, ungettext from django.views.decorators.csrf import ensure_csrf_cookie import reversion +from modoboa.core.models import User +from modoboa.extensions.admin.forms import ( + AccountForm +) +from modoboa.extensions.admin.lib import get_identities +from modoboa.extensions.admin.models import Mailbox, Domain from modoboa.lib import parameters, events from modoboa.lib.exceptions import ( PermDeniedException, BadRequest ) -from modoboa.lib.web_utils import ( - _render_to_string, render_to_json_response -) -from modoboa.core.models import User -from modoboa.extensions.admin.models import Mailbox, Domain from modoboa.lib.listing import ( get_sort_order, get_listing_page ) -from modoboa.extensions.admin.lib import get_identities -from modoboa.extensions.admin.forms import ( - AccountForm +from modoboa.lib.web_utils import ( + _render_to_string, render_to_json_response ) @@ -80,9 +79,15 @@ def list_quotas(request): where = "admin_mailbox.address||'@'||admin_domain.name" db_type = db_type() if db_type == "postgres": - select = '(admin_quota.bytes::float / (CAST(admin_mailbox.quota AS BIGINT) * 1048576)) * 100' + select = ( + "(admin_quota.bytes::float / (CAST(admin_mailbox.quota " + "AS BIGINT) * 1048576)) * 100" + ) else: - select = 'admin_quota.bytes / (admin_mailbox.quota * 1048576) * 100' + select = ( + "admin_quota.bytes / (admin_mailbox.quota " + "* 1048576) * 100" + ) if db_type == "mysql": where = "CONCAT(admin_mailbox.address,'@',admin_domain.name)" mboxes = mboxes.extra( @@ -191,7 +196,8 @@ def remove_permission(request): domain = Domain.objects.get(pk=domid) except (User.DoesNotExist, Domain.DoesNotExist): raise BadRequest(_("Invalid request")) - if not request.user.can_access(account) or not request.user.can_access(domain): + if not request.user.can_access(account) or \ + not request.user.can_access(domain): raise PermDeniedException domain.remove_admin(account) return render_to_json_response({}) diff --git a/modoboa/extensions/admin/views/import.py b/modoboa/extensions/admin/views/import.py index fb1e6918f..a06a3a8cf 100644 --- a/modoboa/extensions/admin/views/import.py +++ b/modoboa/extensions/admin/views/import.py @@ -1,18 +1,23 @@ +"""Import related views.""" + import csv -import reversion -from django.utils.translation import ugettext as _ -from django.shortcuts import render -from django.core.urlresolvers import reverse + from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) -from modoboa.lib import events -from modoboa.lib.exceptions import ModoboaException, Conflict +from django.core.urlresolvers import reverse +from django.shortcuts import render +from django.utils.translation import ugettext as _ + +import reversion + from modoboa.core.models import User +from modoboa.extensions.admin.forms import ImportIdentitiesForm, ImportDataForm from modoboa.extensions.admin.models import ( Domain, DomainAlias, Alias ) -from modoboa.extensions.admin.forms import ImportIdentitiesForm, ImportDataForm +from modoboa.lib import events +from modoboa.lib.exceptions import ModoboaException, Conflict def import_domain(user, row, formopts): @@ -41,7 +46,8 @@ def import_domains(request):

The first element of each line is mandatory and must be equal to one of the previous values.

You can use a different character as separator.

-""" % ''.join([unicode(hlp) for hlp in events.raiseQueryEvent('ExtraDomainImportHelp')])) +""" % ''.join([unicode(hlp) for hlp in + events.raiseQueryEvent('ExtraDomainImportHelp')])) ctx = dict( title=_("Import domains"), diff --git a/modoboa/extensions/amavis/templatetags/amavis_tags.py b/modoboa/extensions/amavis/templatetags/amavis_tags.py index 79b8ac9b3..f5d1a2c9a 100644 --- a/modoboa/extensions/amavis/templatetags/amavis_tags.py +++ b/modoboa/extensions/amavis/templatetags/amavis_tags.py @@ -80,20 +80,23 @@ def viewm_menu(user, mail_id, rcpt): @register.simple_tag def viewm_menu_simple(user, mail_id, rcpt, secret_id=""): + release_url = "{0}?rcpt={1}".format( + reverse("amavis:mail_release", args=[mail_id]), rcpt) + delete_url = "{0}?rcpt={1}".format( + reverse("amavis:mail_delete", args=[mail_id]), rcpt) + if secret_id: + release_url += "&secret_id={0}".format(secret_id) + delete_url += "&secret_id={0}".format(secret_id) entries = [ {"name": "release", "img": "fa fa-check", "class": "btn-success", - "url": reverse('amavis:mail_release', args=[mail_id]) \ - + ("?rcpt=%s" % rcpt \ - + (("&secret_id=%s" % secret_id) if secret_id != "" else "")), + "url": release_url, "label": _("Release")}, {"name": "delete", "img": "fa fa-trash", "class": "btn-danger", - "url": reverse('amavis:mail_delete', args=[mail_id]) \ - + "?rcpt=%s" % rcpt \ - + ("&secret_id=%s" % secret_id if secret_id != "" else ""), + "url": delete_url, "label": _("Delete")}, ]