mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
@@ -82,7 +82,7 @@ def check_for_new_version(user, include_all):
|
||||
return [{"id": "newversionavailable"}] if include_all else []
|
||||
return [{
|
||||
"id": "newversionavailable",
|
||||
"url": reverse("admin_index") + "#info/",
|
||||
"url": reverse("core:index") + "#info/",
|
||||
"text": _("New Modoboa version available"),
|
||||
"level": "info",
|
||||
}]
|
||||
|
||||
@@ -86,8 +86,11 @@ class ExtensionsPool(object):
|
||||
try:
|
||||
baseurl = extinstance.url \
|
||||
if extinstance.url is not None else extname
|
||||
result += [(r'^%s/' % (baseurl),
|
||||
include("%s.urls" % extinstance.__module__))]
|
||||
result += [
|
||||
(r'^%s/' % (baseurl),
|
||||
include("%s.urls" % extinstance.__module__,
|
||||
namespace=extname))
|
||||
]
|
||||
except ImportError:
|
||||
# No urls for this extension
|
||||
pass
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% load i18n %}{% load url from future %}
|
||||
<h2>{% trans "Extensions" %} <small>{% trans "Choose the extension(s) to use" %}</small></h2><hr />
|
||||
<form id="settings_form" method="POST" action="{% url 'modoboa.core.views.admin.saveextensions' %}">{% csrf_token %}
|
||||
<form id="settings_form" method="POST" action="{% url 'core:extension_save' %}">{% csrf_token %}
|
||||
{{ extensions|safe }}
|
||||
</form>
|
||||
<a href="#" class="btn btn-primary" id="update" name="update">{% trans 'Save' %}</a>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% load i18n lib_tags %}{% load url from future %}
|
||||
<h2>{% trans "Parameters" %} <small>{% trans "Configure Modoboa" %}</small></h2><hr />
|
||||
<form id="settings_form" method="POST" action="{% url 'modoboa.core.views.admin.saveparameters' %}" class="form-horizontal">{% csrf_token %}
|
||||
<form id="settings_form" method="POST" action="{% url 'core:parameter_save' %}" class="form-horizontal">{% csrf_token %}
|
||||
{% include "common/parameters.html" %}
|
||||
</form>
|
||||
<hr>
|
||||
<a href="#" class="btn btn-primary col-lg-offset-7 col-md-offset-7 col-sm-offset-7 col-lg-1 col-md-2 col-sm-2" id="update" name="update">{% trans 'Save' %}</a>
|
||||
<a href="#" class="btn btn-primary col-lg-offset-7 col-md-offset-7 col-sm-offset-7 col-lg-1 col-md-2 col-sm-2" id="update" name="update">{% trans 'Save' %}</a>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% load i18n %}{% load url from future %}
|
||||
<h2>{% trans "Preferences" %} <small>{% trans "Customize Modoboa" %}</small></h2>
|
||||
<hr>
|
||||
<form class="form-horizontal" method="POST" action="{% url 'modoboa.core.views.user.preferences' %}"
|
||||
<form class="form-horizontal" method="POST" action="{% url 'core:user_preferences' %}"
|
||||
id="uprefs_form">{% csrf_token %}
|
||||
{% include "common/parameters.html" %}
|
||||
<hr>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% load i18n form_tags %}{% load url from future %}
|
||||
<h2>{% trans "Profile" %} <small>{% trans "Update your personal information" %}</small></h2>
|
||||
<hr>
|
||||
<form class="form-horizontal" method="POST" action="{% url 'modoboa.core.views.user.profile' %}"
|
||||
<form class="form-horizontal" method="POST" action="{% url 'core:user_profile' %}"
|
||||
id="uprefs_form">{% csrf_token %}
|
||||
{% render_form form %}
|
||||
<div class="form-actions">
|
||||
|
||||
@@ -19,7 +19,7 @@ def core_menu(selection, user):
|
||||
entries += [
|
||||
{"name": "settings",
|
||||
"label": _("Modoboa"),
|
||||
"url": reverse("modoboa.core.views.admin.viewsettings")}
|
||||
"url": reverse("core:index")}
|
||||
]
|
||||
|
||||
if not len(entries):
|
||||
@@ -79,14 +79,14 @@ def user_menu(user, selection):
|
||||
{"name": "settings",
|
||||
"img": "glyphicon glyphicon-list",
|
||||
"label": _("Settings"),
|
||||
"url": reverse("modoboa.core.views.user.index")}
|
||||
"url": reverse("core:user_index")}
|
||||
]}
|
||||
]
|
||||
|
||||
entries[0]["menu"] += \
|
||||
events.raiseQueryEvent("UserMenuDisplay", "options_menu", user) \
|
||||
+ [{"name": "logout",
|
||||
"url": reverse("modoboa.core.views.auth.dologout"),
|
||||
"url": reverse("core:logout"),
|
||||
"label": _("Logout"),
|
||||
"img": "glyphicon glyphicon-off"}]
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ class ProfileTestCase(ModoTestCase):
|
||||
* The default admin changes his password (no associated Mailbox)
|
||||
* A normal user changes his password
|
||||
"""
|
||||
self.ajax_post(reverse("modoboa.core.views.user.profile"),
|
||||
self.ajax_post(reverse("core:user_profile"),
|
||||
{"oldpassword": "password",
|
||||
"newpassword": "titi", "confirmation": "titi"})
|
||||
self.clt.logout()
|
||||
@@ -38,7 +38,7 @@ class ProfileTestCase(ModoTestCase):
|
||||
)
|
||||
|
||||
self.ajax_post(
|
||||
reverse("modoboa.core.views.user.profile"),
|
||||
reverse("core:user_profile"),
|
||||
{"oldpassword": "toto",
|
||||
"newpassword": "tutu", "confirmation": "tutu"}
|
||||
)
|
||||
|
||||
+20
-12
@@ -4,23 +4,31 @@ from django.conf.urls import patterns, url
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
|
||||
(r'^accounts/login/$', 'modoboa.core.views.auth.dologin'),
|
||||
(r'^accounts/logout/$', 'modoboa.core.views.auth.dologout'),
|
||||
url(r'^accounts/login/$', 'modoboa.core.views.auth.dologin',
|
||||
name="login"),
|
||||
url(r'^accounts/logout/$', 'modoboa.core.views.auth.dologout',
|
||||
name="logout"),
|
||||
|
||||
url(r'^core/$', 'modoboa.core.views.admin.viewsettings',
|
||||
name="admin_index"),
|
||||
(r'^core/parameters/$', 'modoboa.core.views.admin.viewparameters'),
|
||||
(r'^core/parameters/save/$', 'modoboa.core.views.admin.saveparameters'),
|
||||
(r'^core/extensions/$', 'modoboa.core.views.admin.viewextensions'),
|
||||
(r'^core/extensions/save/$', 'modoboa.core.views.admin.saveextensions'),
|
||||
name="index"),
|
||||
url(r'^core/parameters/$', 'modoboa.core.views.admin.viewparameters',
|
||||
name="parameter_listl"),
|
||||
url(r'^core/parameters/save/$', 'modoboa.core.views.admin.saveparameters',
|
||||
name="parameter_save"),
|
||||
url(r'^core/extensions/$', 'modoboa.core.views.admin.viewextensions',
|
||||
name="extension_list"),
|
||||
url(r'^core/extensions/save/$', 'modoboa.core.views.admin.saveextensions',
|
||||
name="extension_save"),
|
||||
url(r'^core/info/$', 'modoboa.core.views.admin.information',
|
||||
name="information"),
|
||||
(r'^core/logs/$', 'modoboa.core.views.admin.logs'),
|
||||
url(r'^core/logs/$', 'modoboa.core.views.admin.logs', name="log_list"),
|
||||
url(r'^core/top_notifications/check/$',
|
||||
'modoboa.core.views.admin.check_top_notifications',
|
||||
name='check_top_notifications'),
|
||||
name='top_notifications_check'),
|
||||
|
||||
(r'^user/$', 'modoboa.core.views.user.index'),
|
||||
(r'^user/preferences/$', 'modoboa.core.views.user.preferences'),
|
||||
(r'^user/profile/$', 'modoboa.core.views.user.profile'),
|
||||
url(r'^user/$', 'modoboa.core.views.user.index', name="user_index"),
|
||||
url(r'^user/preferences/$', 'modoboa.core.views.user.preferences',
|
||||
name="user_preferences"),
|
||||
url(r'^user/profile/$', 'modoboa.core.views.user.profile',
|
||||
name="user_profile"),
|
||||
)
|
||||
|
||||
@@ -36,14 +36,17 @@ def dologin(request):
|
||||
nextlocation = request.POST.get("next", None)
|
||||
if nextlocation is None or nextlocation == "None":
|
||||
if user.group == "SimpleUsers":
|
||||
nextlocation = reverse("modoboa.lib.webutils.topredirection")
|
||||
nextlocation = reverse("topredirection")
|
||||
else:
|
||||
nextlocation = reverse("domains")
|
||||
nextlocation = reverse("admin:domain_list")
|
||||
return HttpResponseRedirect(nextlocation)
|
||||
error = _("Your username and password didn't match. Please try again.")
|
||||
logger.warning("Failed connection attempt from '%(addr)s' as user '%(user)s'" \
|
||||
% {"addr": request.META["REMOTE_ADDR"],
|
||||
"user": form.cleaned_data["username"]})
|
||||
error = _(
|
||||
"Your username and password didn't match. Please try again.")
|
||||
logger.warning(
|
||||
"Failed connection attempt from '%(addr)s' as user '%(user)s'" \
|
||||
% {"addr": request.META["REMOTE_ADDR"],
|
||||
"user": form.cleaned_data["username"]}
|
||||
)
|
||||
|
||||
nextlocation = request.POST.get("next", None)
|
||||
httpcode = 401
|
||||
@@ -68,4 +71,4 @@ def dologout(request):
|
||||
logger = logging.getLogger("modoboa.auth")
|
||||
logger.info(_("User '%s' logged out" % request.user.username))
|
||||
logout(request)
|
||||
return HttpResponseRedirect(reverse(dologin))
|
||||
return HttpResponseRedirect(reverse("core:login"))
|
||||
|
||||
@@ -20,10 +20,10 @@ def menu(target, user):
|
||||
"menu": [
|
||||
{"name": "sendvirus",
|
||||
"label": _("Send virus"),
|
||||
"url": reverse("modoboa.demo.views.send_virus")},
|
||||
"url": reverse("demo:virus_send")},
|
||||
{"name": "sendspam",
|
||||
"label": _("Send spam"),
|
||||
"url": reverse("modoboa.demo.views.send_spam")}
|
||||
"url": reverse("demo:spam_send")}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# coding: utf-8
|
||||
from django.conf.urls import patterns
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('modoboa.demo.views',
|
||||
(r'^sendvirus/$', 'send_virus'),
|
||||
(r'^sendspam/$', 'send_spam'),
|
||||
urlpatterns = patterns(
|
||||
'modoboa.demo.views',
|
||||
|
||||
url(r'^sendvirus/$', 'send_virus', name="virus_send"),
|
||||
url(r'^sendspam/$', 'send_spam', name="spam_send"),
|
||||
)
|
||||
|
||||
@@ -11,9 +11,10 @@ from modoboa.extensions.admin.lib import needs_mailbox
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def send_virus(request):
|
||||
status, error = sendmail_fromfile("virus@example.net", request.user.username,
|
||||
os.path.join(settings.MODOBOA_DIR,
|
||||
"tmp/virus.msg"))
|
||||
status, error = sendmail_fromfile(
|
||||
"virus@example.net", request.user.username,
|
||||
os.path.join(settings.MODOBOA_DIR, "tmp/virus.msg")
|
||||
)
|
||||
if status:
|
||||
return render_to_json_response(_("Message sent"))
|
||||
return render_to_json_response(error, status=500)
|
||||
@@ -22,7 +23,8 @@ def send_virus(request):
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def send_spam(request):
|
||||
status, error = sendmail_simple("spam@example.net", request.user.username, content="""
|
||||
status, error = sendmail_simple(
|
||||
"spam@example.net", request.user.username, content="""
|
||||
This is the GTUBE, the
|
||||
Generic
|
||||
Test for
|
||||
|
||||
@@ -47,7 +47,9 @@ class AdminConsole(ModoExtension):
|
||||
name = "admin"
|
||||
label = ugettext_lazy("Administration console")
|
||||
version = "1.0"
|
||||
description = ugettext_lazy("Web based console to manage domains, accounts and aliases")
|
||||
description = ugettext_lazy(
|
||||
"Web based console to manage domains, accounts and aliases"
|
||||
)
|
||||
always_active = True
|
||||
|
||||
def load(self):
|
||||
@@ -63,8 +65,12 @@ exts_pool.register_extension(AdminConsole, show=False)
|
||||
|
||||
@events.observe("ExtraUprefsRoutes")
|
||||
def extra_routes():
|
||||
return [(r'^user/forward/',
|
||||
'modoboa.extensions.admin.views.user.forward'), ]
|
||||
from django.conf.urls import url
|
||||
return [
|
||||
url(r'^user/forward/',
|
||||
'modoboa.extensions.admin.views.user.forward',
|
||||
name="user_forward"),
|
||||
]
|
||||
|
||||
|
||||
@events.observe("AdminMenuDisplay")
|
||||
@@ -75,13 +81,13 @@ def admin_menu(target, user):
|
||||
if user.has_perm("admin.view_domains"):
|
||||
entries += [
|
||||
{"name" : "domains",
|
||||
"url" : reverse("modoboa.extensions.admin.views.domain.domains"),
|
||||
"url" : reverse("admin:domain_list"),
|
||||
"label" : _("Domains")}
|
||||
]
|
||||
if user.has_perm("core.add_user") or user.has_perm("admin.add_alias"):
|
||||
entries += [
|
||||
{"name" : "identities",
|
||||
"url" : reverse("modoboa.extensions.admin.views.identity.identities"),
|
||||
"url" : reverse("admin:identity_list"),
|
||||
"label" : _("Identities")},
|
||||
]
|
||||
return entries
|
||||
|
||||
@@ -36,8 +36,6 @@ class AccountFormGeneral(forms.ModelForm):
|
||||
label=ugettext_lazy("Confirmation"),
|
||||
help_text=ugettext_lazy("Enter the same password as above, for verification.")
|
||||
)
|
||||
first_name = forms.CharField()
|
||||
last_name = forms.CharField()
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
@@ -373,7 +371,7 @@ class AccountForm(TabForms):
|
||||
context.update({
|
||||
'title': account.username,
|
||||
'formid': 'accountform',
|
||||
'action': reverse("edit_account", args=[account.id]),
|
||||
'action': reverse("admin:account_change", args=[account.id]),
|
||||
})
|
||||
|
||||
def check_perms(self, account):
|
||||
@@ -438,7 +436,7 @@ class AccountWizard(WizardForm):
|
||||
def extra_context(self, context):
|
||||
context.update({
|
||||
'title': _("New account"),
|
||||
'action': reverse("new_account"),
|
||||
'action': reverse("admin:account_add"),
|
||||
'formid': 'newaccount_form'
|
||||
})
|
||||
|
||||
|
||||
@@ -283,7 +283,7 @@ class DomainForm(TabForms):
|
||||
domadmins = [u for u in domadmins if u.group == "DomainAdmins"]
|
||||
context.update({
|
||||
"title": domain.name,
|
||||
"action": reverse("edit_domain", args=[domain.pk]),
|
||||
"action": reverse("admin:domain_change", args=[domain.pk]),
|
||||
"formid": "domform",
|
||||
"domain": domain,
|
||||
"domadmins": domadmins
|
||||
@@ -334,7 +334,7 @@ class DomainWizard(WizardForm):
|
||||
def extra_context(self, context):
|
||||
context.update({
|
||||
"title": _("New domain"),
|
||||
"action": reverse("new_domain"),
|
||||
"action": reverse("admin:domain_add"),
|
||||
"formid": "domform"
|
||||
})
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
{% load i18n form_tags %}{% load url from future %}
|
||||
<h2>{% trans "Forward" %} <small>{% trans "Automatically forward emails to another address" %}</small></h2>
|
||||
<hr>
|
||||
<form class="form-horizontal" method="POST" action="{% url 'modoboa.extensions.admin.views.user.forward' %}"
|
||||
id="uprefs_form">{% csrf_token %}
|
||||
<form class="form-horizontal" method="POST" action="{% url 'user_forward' %}"
|
||||
id="uprefs_form">
|
||||
{% csrf_token %}
|
||||
{% render_form form %}
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-primary col-lg-offset-8 col-md-offset-8 col-sm-offset-7 col-lg-1 col-md-1 col-sm-2" id="update" name="update">{% trans 'Update' %}</button>
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
<script type="text/javascript" src="{{ STATIC_URL }}js/autocompleter.js"></script>
|
||||
<script type="text/javascript">
|
||||
function get_domains_list(container) {
|
||||
$.getJSON("{% url 'modoboa.extensions.admin.views.domain.domains_list' %}", function(data) {
|
||||
$.getJSON("{% url 'admin:domain_flat_list' %}", function(data) {
|
||||
container.value = data;
|
||||
});
|
||||
}
|
||||
|
||||
function get_account_list(container) {
|
||||
$.getJSON("{% url 'modoboa.extensions.admin.views.identity.accounts_list' %}", function(data) {
|
||||
$.getJSON("{% url 'admin:account_list' %}", function(data) {
|
||||
container.value = data;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -31,23 +31,23 @@ def domains_menu(selection, user):
|
||||
entries = [
|
||||
{"name": "newdomain",
|
||||
"label": _("Add domain"),
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"img": "fa fa-plus",
|
||||
"modal": True,
|
||||
"modalcb": "admin.newdomain_cb",
|
||||
"url": reverse("modoboa.extensions.admin.views.domain.newdomain")},
|
||||
"url": reverse("admin:domain_add")},
|
||||
]
|
||||
entries += events.raiseQueryEvent("ExtraDomainMenuEntries", user)
|
||||
entries += [
|
||||
{"name": "import",
|
||||
"label": _("Import"),
|
||||
"img": "glyphicon glyphicon-folder-open",
|
||||
"url": reverse("modoboa.extensions.admin.views.import.import_domains"),
|
||||
"img": "fa fa-folder-open",
|
||||
"url": reverse("admin:domain_import"),
|
||||
"modal": True,
|
||||
"modalcb": "admin.importform_cb"},
|
||||
{"name": "export",
|
||||
"label": _("Export"),
|
||||
"img": "glyphicon glyphicon-share-alt",
|
||||
"url": reverse("modoboa.extensions.admin.views.export.export_domains"),
|
||||
"img": "fa fa-share-alt",
|
||||
"url": reverse("admin:domain_export"),
|
||||
"modal": True,
|
||||
"modalcb": "admin.exportform_cb"}
|
||||
]
|
||||
@@ -70,48 +70,48 @@ def identities_menu(user, selection=None):
|
||||
entries = [
|
||||
{"name": "identities",
|
||||
"label": _("List identities"),
|
||||
"img": "glyphicon glyphicon-user",
|
||||
"img": "fa fa-user",
|
||||
"class": "ajaxlink navigation",
|
||||
"url": "list/"},
|
||||
{"name": "quotas",
|
||||
"label": _("List quotas"),
|
||||
"img": "glyphicon glyphicon-hdd",
|
||||
"img": "fa fa-hdd-o",
|
||||
"class": "ajaxlink navigation",
|
||||
"url": "quotas/"},
|
||||
{"name": "newaccount",
|
||||
"label": _("Add account"),
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"img": "fa fa-plus",
|
||||
"modal": True,
|
||||
"modalcb": "admin.newaccount_cb",
|
||||
"url": reverse("modoboa.extensions.admin.views.identity.newaccount")},
|
||||
"url": reverse("admin:account_add")},
|
||||
{"name": "newalias",
|
||||
"label": _("Add alias"),
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"img": "fa fa-plus",
|
||||
"modal": True,
|
||||
"modalcb": "admin.aliasform_cb",
|
||||
"url": reverse("modoboa.extensions.admin.views.alias.newalias")},
|
||||
"url": reverse("admin:alias_add")},
|
||||
{"name": "newforward",
|
||||
"label": _("Add forward"),
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"img": "fa fa-plus",
|
||||
"modal": True,
|
||||
"modalcb": "admin.aliasform_cb",
|
||||
"url": reverse("modoboa.extensions.admin.views.alias.newforward")},
|
||||
"url": reverse("admin:forward_add")},
|
||||
{"name": "newdlist",
|
||||
"label": _("Add distribution list"),
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"img": "fa fa-plus",
|
||||
"modal": True,
|
||||
"modalcb": "admin.aliasform_cb",
|
||||
"url": reverse("modoboa.extensions.admin.views.alias.newdlist")},
|
||||
"url": reverse("admin:dlist_add")},
|
||||
{"name": "import",
|
||||
"label": _("Import"),
|
||||
"img": "glyphicon glyphicon-folder-open",
|
||||
"url": reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
"img": "fa fa-folder-open",
|
||||
"url": reverse("admin:domain_import"),
|
||||
"modal": True,
|
||||
"modalcb": "admin.importform_cb"},
|
||||
{"name": "export",
|
||||
"label": _("Export"),
|
||||
"img": "glyphicon glyphicon-share-alt",
|
||||
"url": reverse("modoboa.extensions.admin.views.export.export_identities"),
|
||||
"img": "fa fa-share-alt",
|
||||
"url": reverse("admin:identity_export"),
|
||||
"modal": True,
|
||||
"modalcb": "admin.exportform_cb"
|
||||
}
|
||||
@@ -130,19 +130,16 @@ def domain_actions(user, domain):
|
||||
if domain.__class__.__name__ == 'Domain':
|
||||
actions = [
|
||||
{"name": "listidentities",
|
||||
"url": reverse("modoboa.extensions.admin.views.identity.identities") + "#list/?searchquery=@%s" % domain.name,
|
||||
"url": reverse("admin:identity_list") + "#list/?searchquery=@%s" % domain.name,
|
||||
"title": _("View the domain's identities"),
|
||||
"img": "glyphicon glyphicon-user"}
|
||||
"img": "fa fa-user"}
|
||||
]
|
||||
if user.has_perm("admin.delete_domain"):
|
||||
actions.append({
|
||||
"name": "deldomain",
|
||||
"url": reverse(
|
||||
"modoboa.extensions.admin.views.domain.deldomain",
|
||||
args=[domain.id]
|
||||
),
|
||||
"url": reverse("admin:domain_delete", args=[domain.id]),
|
||||
"title": _("Delete %s?" % domain.name),
|
||||
"img": "glyphicon glyphicon-trash"
|
||||
"img": "fa fa-trash"
|
||||
})
|
||||
else:
|
||||
actions = events.raiseQueryEvent('GetDomainActions', user, domain)
|
||||
@@ -158,19 +155,20 @@ def identity_actions(user, ident):
|
||||
actions = events.raiseQueryEvent("ExtraAccountActions", ident)
|
||||
actions += [
|
||||
{"name": "delaccount",
|
||||
"url": reverse("modoboa.extensions.admin.views.identity.delaccount", args=[objid]),
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"url": reverse("admin:account_delete", args=[objid]),
|
||||
"img": "fa fa-trash",
|
||||
"title": _("Delete %s?" % ident.username)},
|
||||
]
|
||||
else:
|
||||
actions = [
|
||||
{"name": "delalias",
|
||||
"url": reverse("modoboa.extensions.admin.views.alias.delalias") + "?selection=%s" % objid,
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"url": reverse("admin:alias_delete") + "?selection=%s" % objid,
|
||||
"img": "fa fa-trash",
|
||||
"title": _("Delete %s?" % ident.full_address)},
|
||||
]
|
||||
return render_actions(actions)
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def disable_identity(identity):
|
||||
"""Disable an identity.
|
||||
@@ -189,10 +187,7 @@ def disable_identity(identity):
|
||||
def domain_modify_link(domain):
|
||||
linkdef = {"label": domain.name, "modal": True}
|
||||
if domain.__class__.__name__ == "Domain":
|
||||
linkdef["url"] = reverse(
|
||||
"modoboa.extensions.admin.views.domain.editdomain",
|
||||
args=[domain.id]
|
||||
)
|
||||
linkdef["url"] = reverse("admin:domain_change", args=[domain.id])
|
||||
linkdef["modalcb"] = "admin.domainform_cb"
|
||||
else:
|
||||
tmp = events.raiseDictEvent('GetDomainModifyLink', domain)
|
||||
@@ -229,17 +224,11 @@ def identity_modify_link(identity, active_tab='default'):
|
||||
"""
|
||||
linkdef = {"label": identity.identity, "modal": True}
|
||||
if identity.__class__.__name__ == "User":
|
||||
linkdef["url"] = reverse(
|
||||
"modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[identity.id]
|
||||
)
|
||||
linkdef["url"] = reverse("admin:account_change", args=[identity.id])
|
||||
linkdef["url"] += "?active_tab=%s" % active_tab
|
||||
linkdef["modalcb"] = "admin.editaccount_cb"
|
||||
else:
|
||||
linkdef["url"] = reverse(
|
||||
"modoboa.extensions.admin.views.alias.editalias",
|
||||
args=[identity.id]
|
||||
)
|
||||
linkdef["url"] = reverse("admin:alias_change", args=[identity.id]),
|
||||
linkdef["modalcb"] = "admin.aliasform_cb"
|
||||
return render_link(linkdef)
|
||||
|
||||
@@ -248,8 +237,8 @@ def identity_modify_link(identity, active_tab='default'):
|
||||
def domadmin_actions(daid, domid):
|
||||
actions = [{
|
||||
"name": "removeperm",
|
||||
"url": reverse("modoboa.extensions.admin.views.identity.remove_permission") + "?domid=%s&daid=%s" % (domid, daid),
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"url": reverse("admin:permission_delete") + "?domid=%s&daid=%s" % (domid, daid),
|
||||
"img": "fa fa-trash",
|
||||
"title": _("Remove this permission")
|
||||
}]
|
||||
return render_actions(actions)
|
||||
|
||||
@@ -21,10 +21,7 @@ class AccountTestCase(ModoTestCase):
|
||||
quota_act=True,
|
||||
is_active=True, email="tester@test.com", stepid='step2'
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.newaccount"),
|
||||
values
|
||||
)
|
||||
self.ajax_post(reverse("admin:account_add"), values)
|
||||
|
||||
account = User.objects.get(username="tester@test.com")
|
||||
mb = account.mailbox_set.all()[0]
|
||||
@@ -40,17 +37,13 @@ class AccountTestCase(ModoTestCase):
|
||||
|
||||
values["username"] = "pouet@test.com"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[account.id]),
|
||||
values
|
||||
reverse("admin:account_change", args=[account.id]), values
|
||||
)
|
||||
mb = Mailbox.objects.get(pk=mb.id)
|
||||
self.assertEqual(mb.full_address, "pouet@test.com")
|
||||
self.assertEqual(mb.quota_value.username, "pouet@test.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.delaccount",
|
||||
args=[account.id]),
|
||||
{}
|
||||
reverse("admin:account_delete", args=[account.id]), {}
|
||||
)
|
||||
|
||||
def _set_quota(self, email, value, expected_status=200):
|
||||
@@ -60,8 +53,7 @@ class AccountTestCase(ModoTestCase):
|
||||
"is_active": True, "quota": value, "email": email
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[account.id]),
|
||||
reverse("admin:account_change", args=[account.id]),
|
||||
values, status=expected_status
|
||||
)
|
||||
|
||||
@@ -95,16 +87,14 @@ class PermissionsTestCase(ModoTestCase):
|
||||
|
||||
def test_domain_admins(self):
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[self.user.id]),
|
||||
reverse("admin:account_change", args=[self.user.id]),
|
||||
self.values
|
||||
)
|
||||
self.assertEqual(self.user.group, "DomainAdmins")
|
||||
|
||||
self.values["role"] = "SimpleUsers"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[self.user.id]),
|
||||
reverse("admin:account_change", args=[self.user.id]),
|
||||
self.values
|
||||
)
|
||||
self.assertNotEqual(self.user.group, 'DomainAdmins')
|
||||
@@ -112,19 +102,20 @@ class PermissionsTestCase(ModoTestCase):
|
||||
def test_superusers(self):
|
||||
self.values["role"] = "SuperAdmins"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[self.user.id]),
|
||||
reverse("admin:account_change", args=[self.user.id]),
|
||||
self.values
|
||||
)
|
||||
self.assertEqual(User.objects.get(username="user@test.com").is_superuser, True)
|
||||
self.assertEqual(
|
||||
User.objects.get(username="user@test.com").is_superuser, True
|
||||
)
|
||||
|
||||
self.values["role"] = "SimpleUsers"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[self.user.id]),
|
||||
reverse("admin:account_change", args=[self.user.id]),
|
||||
self.values
|
||||
)
|
||||
self.assertEqual(User.objects.get(username="user@test.com").is_superuser, False)
|
||||
self.assertEqual(User.objects.get(
|
||||
username="user@test.com").is_superuser, False)
|
||||
|
||||
def test_self_modif(self):
|
||||
self.clt.logout()
|
||||
@@ -137,8 +128,7 @@ class PermissionsTestCase(ModoTestCase):
|
||||
quota=10, is_active=True, email="admin@test.com"
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[admin.id]),
|
||||
reverse("admin:account_change", args=[admin.id]),
|
||||
values
|
||||
)
|
||||
self.assertEqual(admin.group, "DomainAdmins")
|
||||
@@ -146,8 +136,7 @@ class PermissionsTestCase(ModoTestCase):
|
||||
|
||||
values["role"] = "SuperAdmins"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[admin.id]),
|
||||
reverse("admin:account_change", args=[admin.id]),
|
||||
values
|
||||
)
|
||||
admin = User.objects.get(username="admin@test.com")
|
||||
@@ -155,16 +144,14 @@ class PermissionsTestCase(ModoTestCase):
|
||||
|
||||
def test_domadmin_access(self):
|
||||
self.clt.logout()
|
||||
self.assertEqual(self.clt.login(username="admin@test.com", password="toto"),
|
||||
True)
|
||||
response = self.clt.get(
|
||||
reverse("modoboa.extensions.admin.views.domain.domains")
|
||||
)
|
||||
self.assertEqual(
|
||||
self.clt.login(username="admin@test.com", password="toto"),
|
||||
True)
|
||||
response = self.clt.get(reverse("admin:domain_list"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
response = self.clt.get(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[self.user.id]),
|
||||
reverse("admin:account_change", args=[self.user.id]),
|
||||
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
|
||||
self.assertNotEqual(response["Content-Type"], "application/json")
|
||||
|
||||
@@ -182,15 +169,14 @@ class PermissionsTestCase(ModoTestCase):
|
||||
email="superadmin2@test.com", stepid='step2'
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.newaccount"),
|
||||
reverse("admin:account_add"),
|
||||
values
|
||||
)
|
||||
account = User.objects.get(username="superadmin2@test.com")
|
||||
self.clt.logout()
|
||||
self.clt.login(username="admin@test.com", password="toto")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.delaccount",
|
||||
args=[account.id]), {}, 403
|
||||
reverse("admin:account_delete", args=[account.id]), {}, 403
|
||||
)
|
||||
|
||||
def test_domainadmin_dlist_local_domain_not_owned(self):
|
||||
@@ -202,6 +188,4 @@ class PermissionsTestCase(ModoTestCase):
|
||||
recipients_1="user@test2.com",
|
||||
enabled=True
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.newdlist"), values
|
||||
)
|
||||
self.ajax_post(reverse("admin:dlist_add"), values)
|
||||
|
||||
@@ -22,16 +22,14 @@ class AliasTestCase(ModoTestCase):
|
||||
aliases="toto@test.com", aliases_1="titi@test.com"
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
self.assertEqual(user.mailbox_set.all()[0].alias_set.count(), 2)
|
||||
|
||||
del values["aliases_1"]
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
self.assertEqual(user.mailbox_set.all()[0].alias_set.count(), 1)
|
||||
@@ -43,7 +41,7 @@ class AliasTestCase(ModoTestCase):
|
||||
recipients_2="ext@titi.com",
|
||||
enabled=True)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.newdlist"), values
|
||||
reverse("admin:dlist_add"), values
|
||||
)
|
||||
user = User.objects.get(username="user@test.com")
|
||||
self.assertEqual(user.mailbox_set.all()[0].alias_set.count(), 2)
|
||||
@@ -54,15 +52,13 @@ class AliasTestCase(ModoTestCase):
|
||||
self.assertEqual(len(dlist.get_recipients()), 3)
|
||||
del values["recipients_1"]
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.editalias",
|
||||
args=[dlist.id]),
|
||||
reverse("admin:alias_change", args=[dlist.id]),
|
||||
values
|
||||
)
|
||||
self.assertEqual(dlist.get_recipients_count(), 2)
|
||||
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.delalias") + "?selection=%d" \
|
||||
% dlist.id, {}
|
||||
reverse("admin:alias_delete") + "?selection=%d" % dlist.id, {}
|
||||
)
|
||||
self.assertRaises(Alias.DoesNotExist, Alias.objects.get,
|
||||
address="all", domain__name="test.com")
|
||||
@@ -70,21 +66,21 @@ class AliasTestCase(ModoTestCase):
|
||||
def test_forward(self):
|
||||
values = dict(email="forward2@test.com", recipients="rcpt@dest.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.newforward"), values
|
||||
reverse("admin:forward_add"), values
|
||||
)
|
||||
fwd = Alias.objects.get(address="forward2", domain__name="test.com")
|
||||
self.assertEqual(fwd.get_recipients_count(), 1)
|
||||
|
||||
values["recipients"] = "rcpt2@dest.com"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.editalias",
|
||||
reverse("admin:alias_change",
|
||||
args=[fwd.id]),
|
||||
values
|
||||
)
|
||||
self.assertEqual(fwd.get_recipients_count(), 1)
|
||||
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.delalias") + "?selection=%d" \
|
||||
reverse("admin:alias_delete") + "?selection=%d" \
|
||||
% fwd.id, {}
|
||||
)
|
||||
self.assertRaises(Alias.DoesNotExist, Alias.objects.get,
|
||||
@@ -93,7 +89,7 @@ class AliasTestCase(ModoTestCase):
|
||||
def test_forward_and_local_copies(self):
|
||||
values = dict(email="user@test.com", recipients="rcpt@dest.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.newforward"), values
|
||||
reverse("admin:forward_add"), values
|
||||
)
|
||||
fwd = Alias.objects.get(address="user", domain__name="test.com")
|
||||
self.assertEqual(fwd.get_recipients_count(), 1)
|
||||
@@ -101,7 +97,7 @@ class AliasTestCase(ModoTestCase):
|
||||
values["recipients"] = "rcpt@dest.com"
|
||||
values["recipients_1"] = "user@test.com"
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.editalias", args=[fwd.id]),
|
||||
reverse("admin:alias_change", args=[fwd.id]),
|
||||
values
|
||||
)
|
||||
fwd = Alias.objects.get(pk=fwd.pk)
|
||||
|
||||
@@ -22,7 +22,7 @@ class DomainTestCase(ModoTestCase):
|
||||
"name": "pouet.com", "quota": 100, "create_dom_admin": "no",
|
||||
"stepid": 'step2'
|
||||
}
|
||||
self.ajax_post(reverse("modoboa.extensions.admin.views.domain.newdomain"), values)
|
||||
self.ajax_post(reverse("admin:domain_add"), values)
|
||||
dom = Domain.objects.get(name="pouet.com")
|
||||
self.assertEqual(dom.name, "pouet.com")
|
||||
self.assertEqual(dom.quota, 100)
|
||||
@@ -39,7 +39,7 @@ class DomainTestCase(ModoTestCase):
|
||||
"stepid": 'step2'
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.newdomain"),
|
||||
reverse("admin:domain_add"),
|
||||
values
|
||||
)
|
||||
dom = Domain.objects.get(name="pouet.com")
|
||||
@@ -57,7 +57,7 @@ class DomainTestCase(ModoTestCase):
|
||||
"stepid": 'step2'
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.newdomain"),
|
||||
reverse("admin:domain_add"),
|
||||
values
|
||||
)
|
||||
dom = Domain.objects.get(name="pouet.com")
|
||||
@@ -75,7 +75,7 @@ class DomainTestCase(ModoTestCase):
|
||||
"stepid": 'step2'
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.newdomain"),
|
||||
reverse("admin:domain_add"),
|
||||
values
|
||||
)
|
||||
dom = Domain.objects.get(name="pouet.com")
|
||||
@@ -93,8 +93,7 @@ class DomainTestCase(ModoTestCase):
|
||||
}
|
||||
dom = Domain.objects.get(name="test.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.editdomain",
|
||||
args=[dom.id]),
|
||||
reverse("admin:domain_change", args=[dom.id]),
|
||||
values
|
||||
)
|
||||
dom = Domain.objects.get(name="pouet.com")
|
||||
@@ -106,8 +105,7 @@ class DomainTestCase(ModoTestCase):
|
||||
"""
|
||||
dom = Domain.objects.get(name="test.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.deldomain",
|
||||
args=[dom.id]),
|
||||
reverse("admin:domain_delete", args=[dom.id]),
|
||||
{}
|
||||
)
|
||||
with self.assertRaises(Domain.DoesNotExist):
|
||||
|
||||
@@ -32,7 +32,7 @@ class DomainAliasTestCase(ModoTestCase):
|
||||
values = dict(name=dom.name, quota=dom.quota, enabled=dom.enabled,
|
||||
aliases="domalias.net", aliases_1="domalias.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.editdomain",
|
||||
reverse("admin:domain_change",
|
||||
args=[dom.id]),
|
||||
values
|
||||
)
|
||||
@@ -40,7 +40,7 @@ class DomainAliasTestCase(ModoTestCase):
|
||||
|
||||
del values["aliases_1"]
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.editdomain",
|
||||
reverse("admin:domain_change",
|
||||
args=[dom.id]),
|
||||
values
|
||||
)
|
||||
|
||||
@@ -12,11 +12,11 @@ class ExportTestCase(ModoTestCase):
|
||||
|
||||
def __export_identities(self, idtfilter="", grpfilter=""):
|
||||
self.clt.get(
|
||||
reverse("modoboa.extensions.admin.views.identity._identities") \
|
||||
reverse("admin:_identity_list") \
|
||||
+ "?grpfilter=%s&idtfilter=%s" % (grpfilter, idtfilter)
|
||||
)
|
||||
return self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.export.export_identities"),
|
||||
reverse("admin:identity_export"),
|
||||
{"filename": "test.csv"}
|
||||
)
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ domain; domain2.com; 200; False
|
||||
domainalias; domalias1.com; domain1.com; True
|
||||
""", name="domains.csv")
|
||||
self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_domains"), {
|
||||
reverse("admin:domain_import"), {
|
||||
"sourcefile": f
|
||||
}
|
||||
)
|
||||
@@ -45,7 +45,7 @@ domainalias; domalias1.com; domain1.com; True
|
||||
domainalias;test.alias;test.com;True
|
||||
""", name="domains.csv")
|
||||
resp = self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_domains"), {
|
||||
reverse("admin:domain_import"), {
|
||||
"sourcefile": f
|
||||
}
|
||||
)
|
||||
@@ -60,7 +60,7 @@ forward; fwd1@test.com; True; user@extdomain.com
|
||||
dlist; dlist@test.com; True; user1@test.com; user@extdomain.com
|
||||
""", name="identities.csv")
|
||||
self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True}
|
||||
)
|
||||
admin = User.objects.get(username="admin")
|
||||
@@ -108,7 +108,7 @@ dlist; dlist@test.com; True; user1@test.com; user@extdomain.com
|
||||
account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; ; test.com
|
||||
""", name="identities.csv")
|
||||
resp = self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True}
|
||||
)
|
||||
self.assertIn('wrong quota value', resp.content)
|
||||
@@ -120,7 +120,7 @@ account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; ; t
|
||||
account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; 20
|
||||
""", name="identities.csv")
|
||||
resp = self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True}
|
||||
)
|
||||
self.assertIn('Quota is greater than the allowed', resp.content)
|
||||
@@ -130,7 +130,7 @@ account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com; 20
|
||||
account; user1@test.com; toto; User; One; True; SimpleUsers; user1@test.com
|
||||
""", name="identities.csv")
|
||||
resp = self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True}
|
||||
)
|
||||
account = User.objects.get(username="user1@test.com")
|
||||
@@ -145,7 +145,7 @@ account; admin@test.com; toto; Admin; ; True; DomainAdmins; admin@test.com; 0; t
|
||||
account; truc@test.com; toto; René; Truc; True; DomainAdmins; truc@test.com; 0; test.com
|
||||
""", name="identities.csv")
|
||||
self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True,
|
||||
"continue_if_exists": True}
|
||||
)
|
||||
@@ -164,7 +164,7 @@ account; truc@test.com; toto; René; Truc; True; DomainAdmins; truc@test.com; 0;
|
||||
account; sa@test.com; toto; Super; Admin; True; SuperAdmins; superadmin@test.com; 50
|
||||
""", name="identities.csv")
|
||||
self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True,
|
||||
"continue_if_exists": True}
|
||||
)
|
||||
@@ -176,7 +176,7 @@ account; sa@test.com; toto; Super; Admin; True; SuperAdmins; superadmin@test.com
|
||||
alias;user.alias@test.com;True;user@test.com;;;;;;;;;;;;;;;;
|
||||
""", name="identities.csv")
|
||||
self.clt.post(
|
||||
reverse("modoboa.extensions.admin.views.import.import_identities"),
|
||||
reverse("admin:identity_import"),
|
||||
{"sourcefile": f, "crypt_password": True,
|
||||
"continue_if_exists": True}
|
||||
)
|
||||
|
||||
@@ -22,7 +22,7 @@ class PasswordSchemesTestCase(ModoTestCase):
|
||||
is_active=True, email="tester@test.com", stepid='step2'
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.newaccount"),
|
||||
reverse("admin:account_add"),
|
||||
values
|
||||
)
|
||||
|
||||
@@ -35,7 +35,7 @@ class PasswordSchemesTestCase(ModoTestCase):
|
||||
|
||||
def test_sha512crypt_scheme(self):
|
||||
self._test_scheme('sha512crypt', '{SHA512-CRYPT}')
|
||||
|
||||
|
||||
def test_sha256crypt_scheme(self):
|
||||
self._test_scheme('sha256crypt', '{SHA256-CRYPT}')
|
||||
|
||||
|
||||
@@ -16,11 +16,11 @@ class ForwardTestCase(ModoTestCase):
|
||||
self.clt.logout()
|
||||
self.clt.login(username='user@test.com', password='toto')
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.admin.views.user.forward'),
|
||||
reverse('user_forward'),
|
||||
{'dest': 'user@extdomain.com', 'keepcopies': True}
|
||||
)
|
||||
forward = Alias.objects.get(address='user', domain__name='test.com')
|
||||
sadmin = User.objects.get(username='admin')
|
||||
self.assertTrue(sadmin.can_access(forward))
|
||||
self.assertTrue(sadmin.can_access(forward))
|
||||
domadmin = User.objects.get(username='admin@test.com')
|
||||
self.assertTrue(domadmin.can_access(forward))
|
||||
|
||||
@@ -3,48 +3,55 @@ from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.admin.views.domain',
|
||||
(r'^$', 'index'),
|
||||
url(r'^domains/$', 'domains', name="domains"),
|
||||
(r'^domains/list/$', '_domains'),
|
||||
(r'^domains/flatlist/$', 'domains_list'),
|
||||
url(r'^domains/new/', 'newdomain', name='new_domain'),
|
||||
url(r'^domains/(?P<dom_id>\d+)/edit/$', 'editdomain', name="edit_domain"),
|
||||
(r'^domains/(?P<dom_id>\d+)/delete/$', 'deldomain'),
|
||||
|
||||
url(r'^$', 'index', name="index"),
|
||||
url(r'^domains/$', 'domains', name="domain_list"),
|
||||
url(r'^domains/list/$', '_domains', name="_domain_list"),
|
||||
url(r'^domains/flatlist/$', 'domains_list', name="domain_flat_list"),
|
||||
url(r'^domains/new/', 'newdomain', name='domain_add'),
|
||||
url(r'^domains/(?P<dom_id>\d+)/edit/$', 'editdomain', name="domain_change"),
|
||||
url(r'^domains/(?P<dom_id>\d+)/delete/$', 'deldomain',
|
||||
name="domain_delete"),
|
||||
)
|
||||
|
||||
urlpatterns += patterns(
|
||||
'modoboa.extensions.admin.views.identity',
|
||||
(r'^permissions/remove/$', 'remove_permission'),
|
||||
url(r'^permissions/remove/$', 'remove_permission',
|
||||
name="permission_remove"),
|
||||
|
||||
(r'^identities/$', 'identities'),
|
||||
(r'^identities/list/$', '_identities'),
|
||||
(r'^identities/quotas/$', 'list_quotas'),
|
||||
url(r'^identities/$', 'identities', name="identity_list"),
|
||||
url(r'^identities/list/$', '_identities', name="_identity_list"),
|
||||
url(r'^identities/quotas/$', 'list_quotas', name="quota_list"),
|
||||
|
||||
(r'^accounts/list/$', 'accounts_list'),
|
||||
url(r'^accounts/new/$', 'newaccount', name="new_account"),
|
||||
url(r'^accounts/list/$', 'accounts_list', name="account_list"),
|
||||
url(r'^accounts/new/$', 'newaccount', name="account_add"),
|
||||
url(r'^accounts/edit/(?P<accountid>\d+)/$', 'editaccount',
|
||||
name="edit_account"),
|
||||
(r'^accounts/delete/(?P<accountid>\d+)/$', 'delaccount'),
|
||||
name="account_change"),
|
||||
url(r'^accounts/delete/(?P<accountid>\d+)/$', 'delaccount',
|
||||
name="account_delete"),
|
||||
)
|
||||
|
||||
urlpatterns += patterns(
|
||||
'modoboa.extensions.admin.views.alias',
|
||||
(r'^distriblists/new/$', 'newdlist'),
|
||||
(r'^forwards/new/$', 'newforward'),
|
||||
|
||||
(r'^aliases/new/$', 'newalias'),
|
||||
(r'^aliases/edit/(?P<alid>\d+)/$', 'editalias'),
|
||||
(r'^aliases/delete/$', 'delalias'),
|
||||
url(r'^distriblists/new/$', 'newdlist', name="dlist_add"),
|
||||
url(r'^forwards/new/$', 'newforward', name="forward_add"),
|
||||
|
||||
url(r'^aliases/new/$', 'newalias', name="alias_add"),
|
||||
url(r'^aliases/edit/(?P<alid>\d+)/$', 'editalias', name="alias_change"),
|
||||
url(r'^aliases/delete/$', 'delalias', name="alias_delete"),
|
||||
)
|
||||
|
||||
urlpatterns += patterns(
|
||||
'modoboa.extensions.admin.views.import',
|
||||
(r'^domains/import/$', 'import_domains'),
|
||||
(r'^identities/import/$', 'import_identities'),
|
||||
|
||||
url(r'^domains/import/$', 'import_domains', name="domain_import"),
|
||||
url(r'^identities/import/$', 'import_identities', name="identity_import"),
|
||||
)
|
||||
|
||||
urlpatterns += patterns(
|
||||
'modoboa.extensions.admin.views.export',
|
||||
(r'^domains/export/$', 'export_domains'),
|
||||
(r'^identities/export/$', 'export_identities'),
|
||||
|
||||
url(r'^domains/export/$', 'export_domains', name="domain_export"),
|
||||
url(r'^identities/export/$', 'export_identities', name="identity_export"),
|
||||
)
|
||||
|
||||
@@ -60,7 +60,7 @@ def _new_alias(request, title, action, successmsg,
|
||||
@reversion.create_revision()
|
||||
def newdlist(request):
|
||||
return _new_alias(
|
||||
request, _("New distribution list"), reverse(newdlist),
|
||||
request, _("New distribution list"), reverse("admin:dlist_add"),
|
||||
_("Distribution list created")
|
||||
)
|
||||
|
||||
@@ -71,7 +71,7 @@ def newdlist(request):
|
||||
@reversion.create_revision()
|
||||
def newalias(request):
|
||||
return _new_alias(
|
||||
request, _("New alias"), reverse(newalias),
|
||||
request, _("New alias"), reverse("admin:alias_add"),
|
||||
_("Alias created")
|
||||
)
|
||||
|
||||
@@ -82,7 +82,7 @@ def newalias(request):
|
||||
@reversion.create_revision()
|
||||
def newforward(request):
|
||||
return _new_alias(
|
||||
request, _("New forward"), reverse(newforward),
|
||||
request, _("New forward"), reverse("admin:forward_add"),
|
||||
_("Forward created")
|
||||
)
|
||||
|
||||
@@ -106,7 +106,7 @@ def editalias(request, alid, tplname="admin/aliasform.html"):
|
||||
return _validate_alias(request, form, successmsg)
|
||||
|
||||
ctx = {
|
||||
'action': reverse(editalias, args=[alias.id]),
|
||||
'action': reverse("admin:alias_change", args=[alias.id]),
|
||||
'formid': 'aliasform',
|
||||
'title': alias.full_address,
|
||||
'action_label': _('Update'),
|
||||
|
||||
@@ -26,7 +26,7 @@ from modoboa.extensions.admin.lib import get_domains
|
||||
|
||||
@login_required
|
||||
def index(request):
|
||||
return HttpResponseRedirect(reverse(domains))
|
||||
return HttpResponseRedirect(reverse("admin:domain_list"))
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -72,9 +72,9 @@ def domains(request, tplname="admin/domains.html"):
|
||||
if not request.user.has_perm("admin.view_domains"):
|
||||
if request.user.has_perm("admin.view_mailboxes"):
|
||||
return HttpResponseRedirect(
|
||||
reverse('modoboa.extensions.admin.views.identity.identities')
|
||||
reverse("admin:identity_list")
|
||||
)
|
||||
return HttpResponseRedirect(reverse("modoboa.core.views.user.index"))
|
||||
return HttpResponseRedirect(reverse("core:user_index"))
|
||||
return render(request, tplname, {"selection": "domains"})
|
||||
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ def export_identities(request):
|
||||
"action_label": _("Export"),
|
||||
"action_classes": "submit",
|
||||
"formid": "exportform",
|
||||
"action": reverse(export_identities),
|
||||
"action": reverse("admin:identity_export"),
|
||||
}
|
||||
|
||||
if request.method == "POST":
|
||||
@@ -64,7 +64,7 @@ def export_domains(request):
|
||||
"action_label": _("Export"),
|
||||
"action_classes": "submit",
|
||||
"formid": "exportform",
|
||||
"action": reverse(export_domains),
|
||||
"action": reverse("admin:domain_export"),
|
||||
}
|
||||
|
||||
if request.method == "POST":
|
||||
|
||||
@@ -51,7 +51,7 @@ def import_domains(request):
|
||||
title=_("Import domains"),
|
||||
action_label=_("Import"),
|
||||
action_classes="submit",
|
||||
action=reverse(import_domains),
|
||||
action=reverse("admin:domain_import"),
|
||||
formid="importform",
|
||||
enctype="multipart/form-data",
|
||||
target="import_target",
|
||||
@@ -167,7 +167,7 @@ def import_identities(request):
|
||||
title=_("Import identities"),
|
||||
action_label=_("Import"),
|
||||
action_classes="submit",
|
||||
action=reverse(import_identities),
|
||||
action=reverse("admin:identity_import"),
|
||||
formid="importform",
|
||||
enctype="multipart/form-data",
|
||||
target="import_target",
|
||||
|
||||
@@ -16,7 +16,7 @@ def menu(target, user):
|
||||
return [
|
||||
{"name": "quarantine",
|
||||
"label": _("Quarantine"),
|
||||
"url": reverse('modoboa.extensions.amavis.views.index')}
|
||||
"url": reverse('amavis:index')}
|
||||
]
|
||||
return []
|
||||
|
||||
@@ -82,7 +82,7 @@ def check_for_pending_requests(user, include_all):
|
||||
return [{"id": "nbrequests", "counter": 0}] if include_all \
|
||||
else []
|
||||
|
||||
url = reverse("modoboa.extensions.amavis.views.index")
|
||||
url = reverse("amavis:index")
|
||||
url += "#listing/?viewrequests=1"
|
||||
return [{
|
||||
"id": "nbrequests", "url": url, "text": _("Pending requests"),
|
||||
|
||||
@@ -31,7 +31,7 @@ def selfservice(ssfunc=None):
|
||||
if parameters.get_admin("SELF_SERVICE") == "no":
|
||||
from django.contrib.auth.views import redirect_to_login
|
||||
return redirect_to_login(
|
||||
reverse("modoboa.extensions.amavis.views.index")
|
||||
reverse("amavis:index")
|
||||
)
|
||||
return ssfunc(request, *args, **kwargs)
|
||||
return wrapped_f
|
||||
|
||||
@@ -71,7 +71,7 @@ class Command(BaseCommand):
|
||||
app="amavis")
|
||||
self.baseurl = self.options["baseurl"].strip("/")
|
||||
self.listingurl = self.baseurl \
|
||||
+ reverse("modoboa.extensions.amavis.views._listing") \
|
||||
+ reverse("amavis:_mail_list") \
|
||||
+ "?viewrequests=1"
|
||||
|
||||
for da in User.objects.filter(groups__name="DomainAdmins"):
|
||||
|
||||
@@ -17,12 +17,12 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a name="release-multi" href="{% url 'modoboa.extensions.amavis.views.process' %}" class="btn btn-success disabled">
|
||||
<a name="release-multi" href="{% url 'amavis:mail_process' %}" class="btn btn-success disabled">
|
||||
<i class="glyphicon glyphicon-ok"></i> <span>{% trans "Release" %}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<a name="delete-multi" href="{% url 'modoboa.extensions.amavis.views.process' %}" class="btn btn-danger disabled">
|
||||
<a name="delete-multi" href="{% url 'amavis:mail_process' %}" class="btn btn-danger disabled">
|
||||
<i class="glyphicon glyphicon-trash"></i> <span>{% trans "Delete" %}</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -9,6 +9,6 @@
|
||||
{% trans "To:" %} {{ msg.rid.email }}
|
||||
{% trans "Date:" %} {{ msg.mail.time_num|fromunix|date:"DATETIME_FORMAT" }}
|
||||
{% trans "Subject:" %} {{ msg.mail.subject }}
|
||||
{% trans "Act on this message:" %} {{ baseurl }}{% url "modoboa.extensions.amavis.views.index" %}#{{ msg.mail.mail_id }}/?rcpt={{ msg.rid.email }}
|
||||
{% trans "Act on this message:" %} {{ baseurl }}{% url "amavis:index" %}#{{ msg.mail.mail_id }}/?rcpt={{ msg.rid.email }}
|
||||
{% endfor %}
|
||||
{% blocktrans %}Please visit {{ listingurl }} for a full listing.{% endblocktrans %}
|
||||
|
||||
@@ -19,18 +19,18 @@ def viewm_menu(mail_id, rcpt):
|
||||
{"name": "release",
|
||||
"img": "glyphicon glyphicon-ok",
|
||||
"class": "btn-success",
|
||||
"url": reverse('modoboa.extensions.amavis.views.release', args=[mail_id])
|
||||
"url": reverse('amavis:mail_release', args=[mail_id])
|
||||
+ ("?rcpt=%s" % rcpt if rcpt else ""),
|
||||
"label": _("Release")},
|
||||
{"name": "delete",
|
||||
"class": "btn-danger",
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"url": reverse('modoboa.extensions.amavis.views.delete', args=[mail_id])
|
||||
"url": reverse('amavis:mail_delete', args=[mail_id])
|
||||
+ ("?rcpt=%s" % rcpt if rcpt else ""),
|
||||
"label": _("Delete")},
|
||||
{"name": "headers",
|
||||
"class": "btn-default",
|
||||
"url": reverse('modoboa.extensions.amavis.views.viewheaders', args=[mail_id]),
|
||||
"url": reverse('amavis:headers_detail', args=[mail_id]),
|
||||
"label": _("View full headers")},
|
||||
]
|
||||
|
||||
@@ -54,14 +54,14 @@ def viewm_menu_simple(user, mail_id, rcpt, secret_id=""):
|
||||
{"name": "release",
|
||||
"img": "glyphicon glyphicon-ok",
|
||||
"class": "btn-success",
|
||||
"url": reverse('modoboa.extensions.amavis.views.release', args=[mail_id]) \
|
||||
"url": reverse('amavis:mail_release', args=[mail_id]) \
|
||||
+ ("?rcpt=%s" % rcpt \
|
||||
+ (("&secret_id=%s" % secret_id) if secret_id != "" else "")),
|
||||
"label": _("Release")},
|
||||
{"name": "delete",
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"class": "btn-danger",
|
||||
"url": reverse('modoboa.extensions.amavis.views.delete', args=[mail_id]) \
|
||||
"url": reverse('amavis:mail_delete', args=[mail_id]) \
|
||||
+ "?rcpt=%s" % rcpt \
|
||||
+ ("&secret_id=%s" % secret_id if secret_id != "" else ""),
|
||||
"label": _("Delete")},
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
from django.conf.urls import patterns
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.amavis.views',
|
||||
(r'^$', 'index'),
|
||||
(r'^listing/$', '_listing'),
|
||||
(r'^getmailcontent/(?P<mail_id>[\w\-\+]+)/$', 'getmailcontent'),
|
||||
(r'^process/$', 'process'),
|
||||
(r'^delete/(?P<mail_id>[\w\-\+]+)/$', 'delete'),
|
||||
(r'^release/(?P<mail_id>[\w\-\+]+)/$', 'release'),
|
||||
(r'^(?P<mail_id>[\w\-\+]+)/$', 'viewmail'),
|
||||
(r'^(?P<mail_id>[\w\-\+]+)/headers/$', 'viewheaders'),
|
||||
)
|
||||
|
||||
url(r'^$', 'index', name="index"),
|
||||
url(r'^listing/$', '_listing', name="_mail_list"),
|
||||
url(r'^getmailcontent/(?P<mail_id>[\w\-\+]+)/$', 'getmailcontent',
|
||||
name="mailcontent_get"),
|
||||
url(r'^process/$', 'process', name="mail_process"),
|
||||
url(r'^delete/(?P<mail_id>[\w\-\+]+)/$', 'delete', name="mail_delete"),
|
||||
url(r'^release/(?P<mail_id>[\w\-\+]+)/$', 'release',
|
||||
name="mail_release"),
|
||||
url(r'^(?P<mail_id>[\w\-\+]+)/$', 'viewmail', name="mail_detail"),
|
||||
url(r'^(?P<mail_id>[\w\-\+]+)/headers/$', 'viewheaders',
|
||||
name="headers_detail"),
|
||||
)
|
||||
|
||||
@@ -92,7 +92,7 @@ def viewmail_selfservice(request, mail_id,
|
||||
if rcpt is None:
|
||||
raise Http404
|
||||
content = Template("""{% load url from future %}
|
||||
<iframe src="{% url 'modoboa.extensions.amavis.views.getmailcontent' mail_id %}" id="mailcontent"></iframe>
|
||||
<iframe src="{% url 'amavis:mailcontent_get' mail_id %}" id="mailcontent"></iframe>
|
||||
""").render(Context(dict(mail_id=mail_id)))
|
||||
|
||||
return render(request, tplname, dict(
|
||||
@@ -112,7 +112,7 @@ def viewmail(request, mail_id):
|
||||
|
||||
content = Template("""
|
||||
<iframe src="{{ url }}" id="mailcontent"></iframe>
|
||||
""").render(Context({"url": reverse(getmailcontent, args=[mail_id])}))
|
||||
""").render(Context({"url": reverse("amavis:mailcontent_get", args=[mail_id])}))
|
||||
menu = viewm_menu(mail_id, rcpt)
|
||||
ctx = getctx("ok", menu=menu, listing=content)
|
||||
request.session['location'] = 'viewmail'
|
||||
@@ -260,7 +260,7 @@ def process(request):
|
||||
ids = request.POST.get("selection", "")
|
||||
ids = ids.split(",")
|
||||
if not len(ids):
|
||||
return HttpResponseRedirect(reverse(index))
|
||||
return HttpResponseRedirect(reverse("amavis:index"))
|
||||
|
||||
if request.POST["action"] == "release":
|
||||
return release(request, ids)
|
||||
|
||||
@@ -28,12 +28,12 @@ class PermissionsTestCase(ExtTestCase):
|
||||
password1="toto", password2="toto", role="Resellers",
|
||||
is_active=True, email="reseller@test.com", stepid='step2'
|
||||
)
|
||||
self.ajax_post(reverse("modoboa.extensions.admin.views.identity.newaccount"), values)
|
||||
self.ajax_post(reverse("admin:account_add"), values)
|
||||
account = User.objects.get(username="reseller@test.com")
|
||||
self.clt.logout()
|
||||
self.clt.login(username="admin@test.com", password="toto")
|
||||
resp = self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.delaccount", args=[account.id]),
|
||||
reverse("admin:account_delete", args=[account.id]),
|
||||
{}, status=403
|
||||
)
|
||||
self.assertEqual(resp, "Permission denied")
|
||||
@@ -62,8 +62,7 @@ class ResourceTestCase(ExtTestCase):
|
||||
is_active=True, email=username, stepid='step2',
|
||||
)
|
||||
return self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.newaccount"),
|
||||
values, status
|
||||
reverse("admin:account_add"), values, status
|
||||
)
|
||||
|
||||
def _create_alias(self, email, rcpt='user@test.com', status=200):
|
||||
@@ -71,8 +70,7 @@ class ResourceTestCase(ExtTestCase):
|
||||
email=email, recipients=rcpt, enabled=True
|
||||
)
|
||||
return self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.alias.newalias"),
|
||||
values, status
|
||||
reverse("admin:alias_add"), values, status
|
||||
)
|
||||
|
||||
def _create_domain(self, name, status=200, withtpl=False):
|
||||
@@ -85,8 +83,7 @@ class ResourceTestCase(ExtTestCase):
|
||||
values['dom_admin_username'] = 'admin'
|
||||
values['create_aliases'] = 'yes'
|
||||
return self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.newdomain"),
|
||||
values, status
|
||||
reverse("admin:domain_add"), values, status
|
||||
)
|
||||
|
||||
def _domain_alias_operation(self, optype, domain, name, status=200):
|
||||
@@ -103,8 +100,7 @@ class ResourceTestCase(ExtTestCase):
|
||||
fname = 'aliases' if not cpt else 'aliases_%d' % cpt
|
||||
values[fname] = alias
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.editdomain",
|
||||
args=[dom.id]),
|
||||
reverse("admin:domain_change", args=[dom.id]),
|
||||
values, status
|
||||
)
|
||||
|
||||
@@ -124,7 +120,7 @@ class DomainAdminTestCase(ResourceTestCase):
|
||||
self.clt.logout()
|
||||
self.clt.login(username='admin@test.com', password='toto')
|
||||
|
||||
def test_mailboxes_limit(self):
|
||||
def test_mailboxes_limit(self):
|
||||
self._create_account('tester1@test.com')
|
||||
self._check_limit('mailboxes', 1, 2)
|
||||
self._create_account('tester2@test.com')
|
||||
@@ -132,7 +128,7 @@ class DomainAdminTestCase(ResourceTestCase):
|
||||
resp = self._create_account('tester3@test.com', status=403)
|
||||
self._check_limit('mailboxes', 2, 2)
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.admin.views.identity.delaccount',
|
||||
reverse('admin:account_delete',
|
||||
args=[User.objects.get(username='tester2@test.com').id]),
|
||||
{}
|
||||
)
|
||||
@@ -146,7 +142,7 @@ class DomainAdminTestCase(ResourceTestCase):
|
||||
resp = self._create_alias('alias3@test.com', status=403)
|
||||
self._check_limit('mailbox_aliases', 2, 2)
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.admin.views.alias.delalias') + '?selection=%d' \
|
||||
reverse('admin:alias_delete') + '?selection=%d' \
|
||||
% Alias.objects.get(address='alias2', domain__name='test.com').id,
|
||||
{}
|
||||
)
|
||||
@@ -160,8 +156,7 @@ class DomainAdminTestCase(ResourceTestCase):
|
||||
aliases="alias1@test.com", aliases_1="alias2@test.com"
|
||||
)
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
Alias.objects.get(address='alias1', domain__name='test.com')
|
||||
@@ -186,7 +181,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
resp = self._create_domain('domain3.tld', 403)
|
||||
self._check_limit('domains', 2, 2)
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.admin.views.domain.deldomain',
|
||||
reverse('admin:domain_delete',
|
||||
args=[Domain.objects.get(name='domain2.tld').id]),
|
||||
{}
|
||||
)
|
||||
@@ -217,17 +212,17 @@ class ResellerTestCase(ResourceTestCase):
|
||||
'Select a valid choice. DomainAdmins is not one of the available choices.'
|
||||
)
|
||||
self._check_limit('domain_admins', 2, 2)
|
||||
|
||||
|
||||
self.user.limitspool.set_maxvalue('mailboxes_limit', 3)
|
||||
self._create_account('user1@domain.tld')
|
||||
user = User.objects.get(username='user1@domain.tld')
|
||||
values = {
|
||||
'username': user.username, 'role': 'DomainAdmins', 'quota_act': True,
|
||||
'is_active': user.is_active, 'email': user.email
|
||||
'username': user.username, 'role': 'DomainAdmins',
|
||||
'quota_act': True, 'is_active': user.is_active,
|
||||
'email': user.email
|
||||
}
|
||||
resp = self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values, status=400
|
||||
)
|
||||
self.assertEqual(
|
||||
@@ -261,8 +256,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
self._create_domain('domain.tld', withtpl=True)
|
||||
dom = Domain.objects.get(name="domain.tld")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.deldomain",
|
||||
args=[dom.id]),
|
||||
reverse("admin:domain_delete", args=[dom.id]),
|
||||
{}
|
||||
)
|
||||
self._check_limit('domains', 0, 2)
|
||||
@@ -276,10 +270,9 @@ class ResellerTestCase(ResourceTestCase):
|
||||
self.clt.logout()
|
||||
self.clt.login(username='admin', password='password')
|
||||
self.ajax_get(
|
||||
reverse(
|
||||
'modoboa.extensions.admin.views.identity.remove_permission'
|
||||
) + '?domid=%d&daid=%d' % (dom.id, self.user.id)
|
||||
, {}
|
||||
"{}?domid={}&daid={}".format(
|
||||
reverse('admin:permission_remove'), dom.id, self.user.id
|
||||
), {}
|
||||
)
|
||||
self._check_limit('domains', 0, 2)
|
||||
self._check_limit('domain_admins', 0, 2)
|
||||
@@ -298,8 +291,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
'mailboxes_limit': 1, 'mailbox_aliases_limit': 2
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
self._check_limit('mailboxes', 1, 1)
|
||||
@@ -308,8 +300,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
# Delete the admin -> resources should go back to the
|
||||
# reseller's pool
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.delaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_delete", args=[user.id]),
|
||||
{}
|
||||
)
|
||||
self._check_limit('mailboxes', 0, 2)
|
||||
@@ -326,8 +317,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
'mailboxes_limit': 1, 'mailbox_aliases_limit': 2
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
dom.add_admin(user)
|
||||
@@ -341,8 +331,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
# Delete the admin -> resources should go back to the
|
||||
# reseller's pool
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.delaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_delete", args=[user.id]),
|
||||
{}
|
||||
)
|
||||
self._check_limit('mailboxes', 1, 2)
|
||||
@@ -360,8 +349,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
'mailboxes_limit': 1, 'mailbox_aliases_limit': 2
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
self._check_limit('mailboxes', 1, 1)
|
||||
@@ -374,13 +362,11 @@ class ResellerTestCase(ResourceTestCase):
|
||||
'is_active': user.is_active, 'email': user.email,
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values
|
||||
)
|
||||
self._check_limit('mailboxes', 1, 2)
|
||||
self._check_limit('mailbox_aliases', 0, 2)
|
||||
|
||||
|
||||
def test_allocate_too_much(self):
|
||||
self._create_domain('domain.tld')
|
||||
@@ -394,8 +380,7 @@ class ResellerTestCase(ResourceTestCase):
|
||||
'mailboxes_limit': 2, 'mailbox_aliases_limit': 3
|
||||
}
|
||||
resp = self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[user.id]),
|
||||
reverse("admin:account_change", args=[user.id]),
|
||||
values, 424
|
||||
)
|
||||
self.assertEqual(resp, 'Not enough resources')
|
||||
|
||||
@@ -60,5 +60,10 @@ exts_pool.register_extension(PostfixAutoreply)
|
||||
|
||||
@events.observe("ExtraUprefsRoutes")
|
||||
def extra_routes():
|
||||
return [(r'^user/autoreply/$',
|
||||
'modoboa.extensions.postfix_autoreply.views.autoreply'), ]
|
||||
from django.conf.urls import url
|
||||
|
||||
return [
|
||||
url(r'^user/autoreply/$',
|
||||
'modoboa.extensions.postfix_autoreply.views.autoreply',
|
||||
name="autoreply")
|
||||
]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<h2>{% trans "Auto-reply message" %} <small>{% trans "Define a message to automatically send when you are off" %}</small></h2>
|
||||
<hr>
|
||||
<form class="form-horizontal" method="POST"
|
||||
action="{% url 'modoboa.extensions.postfix_autoreply.views.autoreply' %}"
|
||||
action="{% url 'autoreply' %}"
|
||||
id="uprefs_form">{% csrf_token %}
|
||||
{% render_form form %}
|
||||
<div class="form-actions">
|
||||
|
||||
@@ -24,8 +24,7 @@ class EventsTestCase(ExtTestCase):
|
||||
"stepid": 'step2'
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.newdomain"),
|
||||
values
|
||||
reverse("admin:domain_add"), values
|
||||
)
|
||||
trans = Transport.objects.get(domain='autoreply.domain.tld')
|
||||
|
||||
@@ -33,8 +32,7 @@ class EventsTestCase(ExtTestCase):
|
||||
dom = Domain.objects.get(name="test.com")
|
||||
trans = Transport.objects.get(domain='autoreply.test.com')
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.deldomain",
|
||||
args=[dom.id]),
|
||||
reverse("admin:domain_delete", args=[dom.id]),
|
||||
{}
|
||||
)
|
||||
with self.assertRaises(Transport.DoesNotExist):
|
||||
@@ -46,8 +44,7 @@ class EventsTestCase(ExtTestCase):
|
||||
}
|
||||
dom = Domain.objects.get(name="test.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.domain.editdomain",
|
||||
args=[dom.id]),
|
||||
reverse("admin:domain_change", args=[dom.id]),
|
||||
values
|
||||
)
|
||||
trans = Transport.objects.get(domain='autoreply.test.fr')
|
||||
@@ -59,42 +56,44 @@ class EventsTestCase(ExtTestCase):
|
||||
|
||||
def test_mailbox_created_event(self):
|
||||
values = {
|
||||
'username': "tester@test.com", 'first_name': 'Tester', 'last_name': 'Toto',
|
||||
'username': "tester@test.com",
|
||||
'first_name': 'Tester', 'last_name': 'Toto',
|
||||
'password1': 'toto', 'password2': 'toto', 'role': 'SimpleUsers',
|
||||
'quota_act': True, 'is_active': True, 'email': 'tester@test.com',
|
||||
'stepid': 'step2', 'autoreply': 'no'
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.newaccount"),
|
||||
values
|
||||
reverse("admin:account_add"), values
|
||||
)
|
||||
al = Alias.objects.get(full_address='tester@test.com')
|
||||
self.assertEqual(al.autoreply_address, 'tester@test.com@autoreply.test.com')
|
||||
self.assertEqual(
|
||||
al.autoreply_address, 'tester@test.com@autoreply.test.com')
|
||||
arm = ARmessage.objects.get(mbox__address='tester')
|
||||
|
||||
def test_mailbox_deleted_event(self):
|
||||
account = User.objects.get(username="user@test.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.delaccount",
|
||||
args=[account.id]),
|
||||
reverse("admin:account_delete", args=[account.id]),
|
||||
{}
|
||||
)
|
||||
with self.assertRaises(Alias.DoesNotExist):
|
||||
Alias.objects.get(full_address='user@test.com')
|
||||
with self.assertRaises(ARmessage.DoesNotExist):
|
||||
ARmessage.objects.get(mbox__address='user', mbox__domain__name='test.com')
|
||||
ARmessage.objects.get(
|
||||
mbox__address='user', mbox__domain__name='test.com')
|
||||
|
||||
|
||||
def test_modify_mailbox_event(self):
|
||||
values = {
|
||||
'username': "leon@test.com", 'first_name': 'Tester', 'last_name': 'Toto',
|
||||
'role': 'SimpleUsers', 'quota_act': True, 'is_active': True,
|
||||
'email': 'leon@test.com', 'autoreply': 'no'
|
||||
'username': "leon@test.com",
|
||||
'first_name': 'Tester', 'last_name': 'Toto',
|
||||
'role': 'SimpleUsers', 'quota_act': True,
|
||||
'is_active': True, 'email': 'leon@test.com',
|
||||
'autoreply': 'no'
|
||||
}
|
||||
account = User.objects.get(username="user@test.com")
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.admin.views.identity.editaccount",
|
||||
args=[account.id]),
|
||||
reverse("admin:account_change", args=[account.id]),
|
||||
values
|
||||
)
|
||||
with self.assertRaises(Alias.DoesNotExist):
|
||||
|
||||
@@ -163,7 +163,8 @@ class RelayDomainForm(TabForms):
|
||||
"""
|
||||
rdom = self.instances["general"]
|
||||
context.update({
|
||||
'action': reverse("edit_relaydomain", args=[rdom.id]),
|
||||
'action': reverse(
|
||||
"postfix_relay_domains:relaydomain_change", args=[rdom.id]),
|
||||
'formid': 'rdomform',
|
||||
'title': rdom.name
|
||||
})
|
||||
|
||||
@@ -30,16 +30,14 @@ def extra_domain_filters():
|
||||
|
||||
@events.observe('ExtraDomainMenuEntries')
|
||||
def extra_domain_menu_entries(user):
|
||||
return [
|
||||
{"name": "newrelaydomain",
|
||||
"label": ugettext_lazy("Add relay domain"),
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"modal": True,
|
||||
"modalcb": "rdomain.domainform_cb",
|
||||
"url": reverse(
|
||||
"modoboa.extensions.postfix_relay_domains.views.create"
|
||||
)},
|
||||
]
|
||||
return [{
|
||||
"name": "newrelaydomain",
|
||||
"label": ugettext_lazy("Add relay domain"),
|
||||
"img": "fa fa-plus",
|
||||
"modal": True,
|
||||
"modalcb": "rdomain.domainform_cb",
|
||||
"url": reverse("postfix_relay_domains:relaydomain_add")
|
||||
}]
|
||||
|
||||
|
||||
@events.observe('ExtraDomainEntries')
|
||||
@@ -64,7 +62,7 @@ def rdomain_modify_link(domain):
|
||||
return {}
|
||||
return {
|
||||
'url': reverse(
|
||||
'modoboa.extensions.postfix_relay_domains.views.edit',
|
||||
"postfix_relay_domains:relaydomain_change",
|
||||
args=[domain.id]
|
||||
),
|
||||
'modalcb': 'rdomain.editdomain_form_cb'
|
||||
@@ -79,10 +77,12 @@ def rdomain_actions(user, domain):
|
||||
return []
|
||||
return [{
|
||||
"name": "delrelaydomain",
|
||||
"url": reverse("modoboa.extensions.postfix_relay_domains.views.delete",
|
||||
args=[domain.id]),
|
||||
"url": reverse(
|
||||
"postfix_relay_domains:relaydomain_delete",
|
||||
args=[domain.id]
|
||||
),
|
||||
"title": ugettext_lazy("Delete %s?" % domain.name),
|
||||
"img": "glyphicon glyphicon-trash"
|
||||
"img": "fa fa-trash"
|
||||
}]
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
{% extends "common/generic_field.html" %}{% load i18n %}
|
||||
{% block extra_controls %}
|
||||
<a id="btnscan" class="btn btn-success" style="margin-top: 2px" href="{% url 'modoboa.extensions.postfix_relay_domains.views.scan_for_services' %}">{% trans "Scan" %}</a>
|
||||
<a id="btnscan" class="btn btn-success" style="margin-top: 2px" href="{% url 'postfix_relay_domains:service_scan' %}">{% trans "Scan" %}</a>
|
||||
{% endblock %}
|
||||
|
||||
@@ -17,7 +17,7 @@ class Operations(object):
|
||||
'service': srv.id, 'enabled': True
|
||||
}
|
||||
return self.ajax_post(
|
||||
reverse("modoboa.extensions.postfix_relay_domains.views.create"),
|
||||
reverse("postfix_relay_domains:relaydomain_add"),
|
||||
values, status
|
||||
)
|
||||
|
||||
@@ -36,7 +36,7 @@ class Operations(object):
|
||||
fname = 'aliases' if not cpt else 'aliases_%d' % cpt
|
||||
values[fname] = alias
|
||||
return self.ajax_post(
|
||||
reverse("modoboa.extensions.postfix_relay_domains.views.edit",
|
||||
reverse("postfix_relay_domains:relaydomain_change",
|
||||
args=[rdom.id]),
|
||||
values, status
|
||||
)
|
||||
@@ -117,7 +117,7 @@ class RelayDomainsTestCase(ExtTestCase, Operations):
|
||||
'service': self.rdom.service.id
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.postfix_relay_domains.views.edit',
|
||||
reverse('postfix_relay_domains:relaydomain_change',
|
||||
args=[self.rdom.id]),
|
||||
values
|
||||
)
|
||||
@@ -133,7 +133,7 @@ class RelayDomainsTestCase(ExtTestCase, Operations):
|
||||
'service': self.rdom.service.id, 'aliases': 'relaydomainalias.net'
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.postfix_relay_domains.views.edit',
|
||||
reverse('postfix_relay_domains:relaydomain_change',
|
||||
args=[self.rdom.id]),
|
||||
values
|
||||
)
|
||||
@@ -145,7 +145,7 @@ class RelayDomainsTestCase(ExtTestCase, Operations):
|
||||
"""Test the removal of a relay domain
|
||||
"""
|
||||
self.ajax_post(
|
||||
reverse("modoboa.extensions.postfix_relay_domains.views.delete",
|
||||
reverse("postfix_relay_domains:relaydomain_delete",
|
||||
args=[self.rdom.id]),
|
||||
{}
|
||||
)
|
||||
@@ -186,7 +186,7 @@ class LimitsTestCase(ExtTestCase, Operations):
|
||||
resp = self._create_relay_domain('relaydomain3.tld', 403)
|
||||
self._check_limit('relay_domains', 2, 2)
|
||||
self.ajax_post(
|
||||
reverse('modoboa.extensions.postfix_relay_domains.views.delete',
|
||||
reverse('postfix_relay_domains:relaydomain_delete',
|
||||
args=[RelayDomain.objects.get(name='relaydomain2.tld').id]),
|
||||
{}
|
||||
)
|
||||
|
||||
@@ -2,9 +2,12 @@ from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.postfix_relay_domains.views',
|
||||
(r'^relaydomains/new/', 'create'),
|
||||
|
||||
url(r'^relaydomains/new/', 'create', name="relaydomain_add"),
|
||||
url(r'^relaydomains/(?P<rdom_id>\d+)/edit/$', 'edit',
|
||||
name='edit_relaydomain'),
|
||||
(r'^relaydomains/(?P<rdom_id>\d+)/delete/$', 'delete'),
|
||||
(r'^relaydomains/scan_services/$', 'scan_for_services'),
|
||||
name='relaydomain_change'),
|
||||
url(r'^relaydomains/(?P<rdom_id>\d+)/delete/$', 'delete',
|
||||
name="relaydomain_delete"),
|
||||
url(r'^relaydomains/scan_services/$', 'scan_for_services',
|
||||
name="service_scan"),
|
||||
)
|
||||
|
||||
@@ -33,7 +33,7 @@ def create(request, tplname="postfix_relay_domains/new_relaydomain_form.html"):
|
||||
ctx = {"title": _("New relay domain"),
|
||||
"action_label": _("Create"),
|
||||
"action_classes": "submit",
|
||||
"action": reverse(create),
|
||||
"action": reverse("postfix_relay_domains:relaydomain_add"),
|
||||
"formid": "rdomform",
|
||||
"form": RelayDomainFormGeneral()}
|
||||
return render(request, tplname, ctx)
|
||||
|
||||
@@ -160,7 +160,7 @@ class UserCalendarWizard(WizardForm):
|
||||
def extra_context(self, context):
|
||||
context.update({
|
||||
"title": _("New calendar"),
|
||||
"action": reverse("new_user_calendar"),
|
||||
"action": reverse("radicale:user_calendar_add"),
|
||||
"formid": "newcal_form"
|
||||
})
|
||||
|
||||
@@ -200,7 +200,7 @@ class UserCalendarEditionForm(TabForms):
|
||||
context.update({
|
||||
"title": self.instances["general"].name,
|
||||
"formid": "ucal_form",
|
||||
"action": reverse("user_calendar", args=[calendar.id])
|
||||
"action": reverse("radicale:user_calendar", args=[calendar.id])
|
||||
})
|
||||
|
||||
def save(self):
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
"""
|
||||
General callbacks.
|
||||
"""
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.template import Template, Context
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib import events
|
||||
|
||||
|
||||
@events.observe("UserMenuDisplay")
|
||||
@@ -10,7 +13,7 @@ def top_menu(target, user):
|
||||
return [
|
||||
{"name": "radicale",
|
||||
"label": _("Calendars"),
|
||||
"url": reverse('modoboa.extensions.radicale.views.index')}
|
||||
"url": reverse('radicale:index')}
|
||||
]
|
||||
return []
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
radicale = new Radicale({
|
||||
"username_list_url": "{% url 'usernames' %}"
|
||||
"username_list_url": "{% url 'radicale:username_list' %}"
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -25,7 +25,7 @@ def radicale_left_menu(user):
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"modal": True,
|
||||
"modalcb": "radicale.add_calendar_cb",
|
||||
"url": reverse("new_user_calendar")},
|
||||
"url": reverse("radicale:user_calendar_add")},
|
||||
]
|
||||
if user.group != "SimpleUsers":
|
||||
entries += [
|
||||
@@ -34,7 +34,7 @@ def radicale_left_menu(user):
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"modal": True,
|
||||
"modalcb": "radicale.shared_calendar_cb",
|
||||
"url": reverse("new_shared_calendar")},
|
||||
"url": reverse("radicale:shared_calendar_add")},
|
||||
]
|
||||
return render_to_string('common/menulist.html', {
|
||||
"entries": entries,
|
||||
@@ -49,12 +49,12 @@ def calendar_modify_link(calendar):
|
||||
linkdef = {"label": calendar.name, "modal": True}
|
||||
if calendar.__class__.__name__ == "UserCalendar":
|
||||
linkdef["url"] = reverse(
|
||||
"user_calendar", args=[calendar.pk]
|
||||
"radicale:user_calendar", args=[calendar.pk]
|
||||
)
|
||||
linkdef["modalcb"] = "radicale.edit_calendar_cb"
|
||||
else:
|
||||
linkdef["url"] = reverse(
|
||||
"shared_calendar", args=[calendar.pk]
|
||||
"radicale:shared_calendar", args=[calendar.pk]
|
||||
)
|
||||
linkdef["modalcb"] = "radicale.shared_calendar_cb"
|
||||
return render_link(linkdef)
|
||||
@@ -70,9 +70,11 @@ def calendar_actions(calendar):
|
||||
"img": "glyphicon glyphicon-trash"
|
||||
}]
|
||||
if calendar.__class__.__name__ == 'UserCalendar':
|
||||
actions[0]["url"] = reverse("user_calendar", args=[calendar.id])
|
||||
actions[0]["url"] = reverse(
|
||||
"radicale:user_calendar", args=[calendar.id])
|
||||
else:
|
||||
actions[0]["url"] = reverse("shared_calendar", args=[calendar.id])
|
||||
actions[0]["url"] = reverse(
|
||||
"radicale:shared_calendar", args=[calendar.id])
|
||||
return render_actions(actions)
|
||||
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
"stepid": "step2"
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_user_calendar"), values)
|
||||
reverse("radicale:user_calendar_add"), values)
|
||||
self.clt.logout()
|
||||
self.assertRuleEqual("Test calendar", "admin@test.com", read=True)
|
||||
|
||||
@@ -69,7 +69,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
"stepid": "step2"
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_user_calendar"), values)
|
||||
reverse("radicale:user_calendar_add"), values)
|
||||
self.clt.logout()
|
||||
self.assertRuleEqual(
|
||||
"Test calendar 2", "admin@test.com", read=True, write=True
|
||||
@@ -87,7 +87,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
"stepid": "step2"
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_user_calendar"), values)
|
||||
reverse("radicale:user_calendar_add"), values)
|
||||
UserCalendar.objects.get(name="My calendar")
|
||||
self.assertRuleEqual(
|
||||
"My calendar", "admin@test.com", read=True, write=True)
|
||||
@@ -101,7 +101,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
"name": "Modified", "mailbox": cal.mailbox.pk
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("user_calendar", args=[cal.pk]), values
|
||||
reverse("radicale:user_calendar", args=[cal.pk]), values
|
||||
)
|
||||
|
||||
def test_del_calendar(self):
|
||||
@@ -109,7 +109,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
mailbox__user__username='test@modoboa.org',
|
||||
mailbox__address='test', mailbox__domain__name='modoboa.org')
|
||||
self.ajax_delete(
|
||||
reverse("user_calendar", args=[cal.pk])
|
||||
reverse("radicale:user_calendar", args=[cal.pk])
|
||||
)
|
||||
with self.assertRaises(ObjectDoesNotExist):
|
||||
UserCalendar.objects.get(pk=cal.pk)
|
||||
@@ -121,7 +121,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
self.clt.logout()
|
||||
self.clt.login(username="admin@test.com", password="toto")
|
||||
self.ajax_delete(
|
||||
reverse("user_calendar", args=[cal.pk]), status=403
|
||||
reverse("radicale:user_calendar", args=[cal.pk]), status=403
|
||||
)
|
||||
|
||||
def test_add_calendar_denied(self):
|
||||
@@ -134,7 +134,7 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
"stepid": "step2"
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_user_calendar"), values, status=400)
|
||||
reverse("radicale:user_calendar_add"), values, status=400)
|
||||
|
||||
|
||||
class SharedCalendarTestCase(ExtTestCase):
|
||||
@@ -153,7 +153,7 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
"domain": domain.pk,
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_shared_calendar"), values)
|
||||
reverse("radicale:shared_calendar_add"), values)
|
||||
self.clt.logout()
|
||||
|
||||
# As a domain administrator
|
||||
@@ -163,7 +163,7 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
"domain": domain.pk
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_shared_calendar"), values)
|
||||
reverse("radicale:shared_calendar_add"), values)
|
||||
self.clt.logout()
|
||||
|
||||
def test_add_calendar_denied(self):
|
||||
@@ -174,7 +174,7 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
"domain": Domain.objects.get(name="test2.com")
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("new_shared_calendar"), values, status=400)
|
||||
reverse("radicale:shared_calendar_add"), values, status=400)
|
||||
|
||||
def test_edit_calendar(self):
|
||||
cal = SharedCalendarFactory(
|
||||
@@ -183,7 +183,7 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
"name": "Modified", "domain": cal.domain.pk
|
||||
}
|
||||
self.ajax_post(
|
||||
reverse("shared_calendar", args=[cal.pk]), values
|
||||
reverse("radicale:shared_calendar", args=[cal.pk]), values
|
||||
)
|
||||
cal = SharedCalendar.objects.get(pk=cal.pk)
|
||||
self.assertEqual(cal.name, "Modified")
|
||||
@@ -191,7 +191,7 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
def test_del_calendar(self):
|
||||
cal = SharedCalendarFactory(domain__name='modoboa.org')
|
||||
self.ajax_delete(
|
||||
reverse("shared_calendar", args=[cal.pk])
|
||||
reverse("radicale:shared_calendar", args=[cal.pk])
|
||||
)
|
||||
with self.assertRaises(ObjectDoesNotExist):
|
||||
SharedCalendar.objects.get(pk=cal.pk)
|
||||
@@ -201,7 +201,7 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
self.clt.logout()
|
||||
self.clt.login(username="admin@test.com", password="toto")
|
||||
self.ajax_delete(
|
||||
reverse("shared_calendar", args=[cal.pk]), status=403
|
||||
reverse("radicale:shared_calendar", args=[cal.pk]), status=403
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -2,13 +2,15 @@ from django.conf.urls import url, patterns
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.radicale.views',
|
||||
(r'^$', 'index'),
|
||||
(r'^calendars/$', 'calendars'),
|
||||
url(r'^usercalendar/$', 'new_user_calendar', name='new_user_calendar'),
|
||||
url(r'^usercalendar/(?P<pk>\d+)/$', 'user_calendar', name='user_calendar'),
|
||||
|
||||
url(r'^$', 'index', name="index"),
|
||||
url(r'^calendars/$', 'calendars', name="calendar_list"),
|
||||
url(r'^usercalendar/$', 'new_user_calendar', name='user_calendar_add'),
|
||||
url(r'^usercalendar/(?P<pk>\d+)/$', 'user_calendar',
|
||||
name='user_calendar'),
|
||||
url(r'^sharedcalendar/$', 'new_shared_calendar',
|
||||
name='new_shared_calendar'),
|
||||
name='shared_calendar_add'),
|
||||
url(r'^sharedcalendar/(?P<pk>\d+)/$', 'shared_calendar',
|
||||
name='shared_calendar'),
|
||||
url(r'^usernames/$', 'username_list', name='usernames'),
|
||||
url(r'^usernames/$', 'username_list', name='username_list'),
|
||||
)
|
||||
|
||||
@@ -111,7 +111,7 @@ def new_shared_calendar(request):
|
||||
"form": form,
|
||||
"formid": "sharedcal_form",
|
||||
"title": _("New shared calendar"),
|
||||
"action": reverse("new_shared_calendar"),
|
||||
"action": reverse("radicale:shared_calendar_add"),
|
||||
"action_classes": "submit",
|
||||
"action_label": _("Submit")
|
||||
})
|
||||
@@ -149,7 +149,7 @@ def shared_calendar(request, pk):
|
||||
"form": form,
|
||||
"formid": "sharedcal_form",
|
||||
"title": scal.name,
|
||||
"action": reverse("shared_calendar", args=[scal.pk]),
|
||||
"action": reverse("radicale:shared_calendar", args=[scal.pk]),
|
||||
"action_classes": "submit",
|
||||
"action_label": _("Submit")
|
||||
})
|
||||
|
||||
@@ -12,7 +12,7 @@ def menu(target, user):
|
||||
return [
|
||||
{"name": "sievefilters",
|
||||
"label": _("Message filters"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.index"),
|
||||
"url": reverse("sievefilters:index"),
|
||||
"img": "glyphicon glyphicon-check"}
|
||||
]
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<td>
|
||||
<a name="togglestate"
|
||||
class={% if filter.enabled %}"green"{% else %}"red"{% endif %}
|
||||
href="{% url 'modoboa.extensions.sievefilters.views.toggle_filter_state' fs.name filter.name %}">
|
||||
href="{% url 'sievefilters:filter_toggle_state' fs.name filter.name %}">
|
||||
{{ filter.enabled|yesno }}
|
||||
</a>
|
||||
</td>
|
||||
|
||||
@@ -34,8 +34,8 @@ function display_filter_errors(data) {
|
||||
}
|
||||
|
||||
function filterform_cb() {
|
||||
cond_templates = fetch_templates("{% url 'modoboa.extensions.sievefilters.views.get_templates' 'condition' %}", cond_templates);
|
||||
action_templates = fetch_templates("{% url 'modoboa.extensions.sievefilters.views.get_templates' 'action' %}", action_templates);
|
||||
cond_templates = fetch_templates("{% url 'sievefilters:templates_get' 'condition' %}", cond_templates);
|
||||
action_templates = fetch_templates("{% url 'sievefilters:templates_get' 'action' %}", action_templates);
|
||||
|
||||
var $dc = $("#condition_0").dyncondition({
|
||||
templates: cond_templates
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% load url from future %}
|
||||
<form action="{% url 'modoboa.extensions.sievefilters.views.savefs' name %}"
|
||||
<form action="{% url 'sievefilters:fs_save' name %}"
|
||||
method="POST" id="feditor" name="feditor">{% csrf_token %}
|
||||
<textarea id="scriptcontent" name="scriptcontent">{{ scriptcontent }}</textarea>
|
||||
</form>
|
||||
|
||||
@@ -15,7 +15,7 @@ def sfilters_menu(user):
|
||||
{"name": "newfilterset",
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"label": _("New filters set"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.new_filters_set"),
|
||||
"url": reverse("sievefilters:fs_add"),
|
||||
"modal": True,
|
||||
"modalcb": "filtersetform_cb"
|
||||
}
|
||||
@@ -33,7 +33,7 @@ def fset_menu(mode, setname):
|
||||
{"name": "newfilter",
|
||||
"img": "glyphicon glyphicon-plus",
|
||||
"label": _("New filter"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.newfilter",
|
||||
"url": reverse("sievefilters:filter_add",
|
||||
args=[setname]),
|
||||
"modal": True,
|
||||
"autowidth": True,
|
||||
@@ -44,7 +44,7 @@ def fset_menu(mode, setname):
|
||||
{"name": "savefs",
|
||||
"img": "glyphicon glyphicon-download-alt",
|
||||
"label": _("Save filters set"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.savefs",
|
||||
"url": reverse("sievefilters:fs_save",
|
||||
args=[setname])},
|
||||
]
|
||||
|
||||
@@ -52,18 +52,16 @@ def fset_menu(mode, setname):
|
||||
{"name": "activatefs",
|
||||
"img": "glyphicon glyphicon-ok",
|
||||
"label": _("Activate filters set"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.activate_filters_set",
|
||||
"url": reverse("sievefilters:fs_activate",
|
||||
args=[setname])},
|
||||
{"name": "removefs",
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"label": _("Remove filters set"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.remove_filters_set",
|
||||
args=[setname])},
|
||||
"url": reverse("sievefilters:fs_delete", args=[setname])},
|
||||
{"name": "downloadfs",
|
||||
"img": "glyphicon glyphicon-download",
|
||||
"label": _("Download"),
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.download_filters_set",
|
||||
args=[setname])}
|
||||
"url": reverse("sievefilters:fs_download", args=[setname])}
|
||||
]
|
||||
|
||||
return render_to_string('common/menulist.html',
|
||||
@@ -74,32 +72,32 @@ def fset_menu(mode, setname):
|
||||
def filter_actions(setname, f, position, islast):
|
||||
actions = [
|
||||
{"name": "editfilter",
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.editfilter",
|
||||
args=[setname, f["name"]]),
|
||||
"url": reverse(
|
||||
"sievefilters:filter_change", args=[setname, f["name"]]),
|
||||
"img": "glyphicon glyphicon-edit",
|
||||
"title": _("Edit filter"),
|
||||
"modal": True,
|
||||
"autowidth": True,
|
||||
"modalcb": "filterform_cb"},
|
||||
{"name": "removefilter",
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.removefilter",
|
||||
args=[setname, f["name"]]),
|
||||
"url": reverse(
|
||||
"sievefilters:filter_delete", args=[setname, f["name"]]),
|
||||
"img": "glyphicon glyphicon-trash",
|
||||
"title": _("Remove this filter")}
|
||||
]
|
||||
if position != 1:
|
||||
actions += [
|
||||
{"name": "movefilter_up",
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.move_filter_up",
|
||||
args=[setname, f["name"]]),
|
||||
"url": reverse(
|
||||
"sievefilters:filter_move_up", args=[setname, f["name"]]),
|
||||
"img": "glyphicon glyphicon-arrow-up",
|
||||
"title": _("Move this filter up")}
|
||||
]
|
||||
if not islast:
|
||||
actions += [
|
||||
{"name": "movefilter_down",
|
||||
"url": reverse("modoboa.extensions.sievefilters.views.move_filter_down",
|
||||
args=[setname, f["name"]]),
|
||||
"url": reverse(
|
||||
"sievefilters:filter_move_down", args=[setname, f["name"]]),
|
||||
"img": "glyphicon glyphicon-arrow-down",
|
||||
"title": _("Move this filter down")},
|
||||
]
|
||||
|
||||
@@ -1,21 +1,29 @@
|
||||
from django.conf.urls import patterns
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('modoboa.extensions.sievefilters.views',
|
||||
(r'^$', 'index'),
|
||||
(r'^savefs/(?P<name>.+)/$', 'savefs'),
|
||||
(r'^newfs/$', 'new_filters_set'),
|
||||
(r'^removefs/(?P<name>.+)/$', 'remove_filters_set'),
|
||||
(r'^activatefs/(?P<name>.+)/$', 'activate_filters_set'),
|
||||
(r'^downloadfs/(?P<name>.+)/$', 'download_filters_set'),
|
||||
(r'^templates/(?P<ftype>\w+)/$', 'get_templates'),
|
||||
(r'^(?P<setname>.+)/newfilter/$', 'newfilter'),
|
||||
(r'^(?P<setname>.+)/editfilter/(?P<fname>.+)/$', 'editfilter'),
|
||||
(r'^(?P<setname>.+)/removefilter/(?P<fname>.+)/$', 'removefilter'),
|
||||
(r'^(?P<setname>.+)/togglestate/(?P<fname>.+)/$',
|
||||
'toggle_filter_state'),
|
||||
(r'^(?P<setname>.+)/moveup/(?P<fname>.+)/$',
|
||||
'move_filter_up'),
|
||||
(r'^(?P<setname>.+)/movedown/(?P<fname>.+)/$',
|
||||
'move_filter_down'),
|
||||
(r'^(?P<name>.+)/$', 'getfs'),
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.sievefilters.views',
|
||||
|
||||
url(r'^$', 'index', name="index"),
|
||||
url(r'^savefs/(?P<name>.+)/$', 'savefs', name="fs_save"),
|
||||
url(r'^newfs/$', 'new_filters_set', name="fs_add"),
|
||||
url(r'^removefs/(?P<name>.+)/$', 'remove_filters_set', name="fs_delete"),
|
||||
url(r'^activatefs/(?P<name>.+)/$', 'activate_filters_set',
|
||||
name="fs_activate"),
|
||||
url(r'^downloadfs/(?P<name>.+)/$', 'download_filters_set',
|
||||
name="fs_download"),
|
||||
url(r'^templates/(?P<ftype>\w+)/$', 'get_templates',
|
||||
name="templates_get"),
|
||||
url(r'^(?P<setname>.+)/newfilter/$', 'newfilter',
|
||||
name="filter_add"),
|
||||
url(r'^(?P<setname>.+)/editfilter/(?P<fname>.+)/$', 'editfilter',
|
||||
name="filter_change"),
|
||||
url(r'^(?P<setname>.+)/removefilter/(?P<fname>.+)/$', 'removefilter',
|
||||
name="filter_delete"),
|
||||
url(r'^(?P<setname>.+)/togglestate/(?P<fname>.+)/$',
|
||||
'toggle_filter_state', name="filter_toggle_state"),
|
||||
url(r'^(?P<setname>.+)/moveup/(?P<fname>.+)/$',
|
||||
'move_filter_up', name="filter_move_up"),
|
||||
url(r'^(?P<setname>.+)/movedown/(?P<fname>.+)/$',
|
||||
'move_filter_down', name="filter_move_down"),
|
||||
url(r'^(?P<name>.+)/$', 'getfs', name="fs_get"),
|
||||
)
|
||||
|
||||
@@ -140,7 +140,7 @@ def newfilter(request, setname, tplname="sievefilters/filter.html"):
|
||||
ctx = dict(
|
||||
title=_("New filter"),
|
||||
formid="filterform",
|
||||
action=reverse(newfilter, args=[setname]),
|
||||
action=reverse("sievefilters:filter_add", args=[setname]),
|
||||
action_label=_("Create"),
|
||||
action_classes="submit"
|
||||
)
|
||||
@@ -162,7 +162,7 @@ def editfilter(request, setname, fname, tplname="sievefilters/filter.html"):
|
||||
ctx = dict(
|
||||
title=_("Edit filter"),
|
||||
formid="filterform",
|
||||
action=reverse(editfilter, args=[setname, fname]),
|
||||
action=reverse("sievefilters:filter_change", args=[setname, fname]),
|
||||
action_label=_("Update"),
|
||||
action_classes="submit"
|
||||
)
|
||||
@@ -232,7 +232,7 @@ def new_filters_set(request, tplname="common/generic_modal_form.html"):
|
||||
"formid": "newfiltersset",
|
||||
"action_label": _("Create"),
|
||||
"action_classes": "submit",
|
||||
"action": reverse(new_filters_set),
|
||||
"action": reverse("sievefilters:fs_add"),
|
||||
"withmenu": False,
|
||||
"withunseen": False,
|
||||
"form": FiltersSetForm()}
|
||||
|
||||
@@ -10,7 +10,7 @@ def menu(target, user):
|
||||
return [
|
||||
{"name": "stats",
|
||||
"label": _("Statistics"),
|
||||
"url": reverse('fullindex')}
|
||||
"url": reverse('stats:fullindex')}
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
var stats = new Stats({
|
||||
graphurl: "{% url 'modoboa.extensions.stats.views.graphs' %}",
|
||||
domain_list_url: "{% url 'modoboa.extensions.admin.views.domain.domains_list' %}",
|
||||
graphurl: "{% url 'stats:graph_list' %}",
|
||||
domain_list_url: "{% url 'admin:domain_flat_list' %}",
|
||||
deflocation: "{{ deflocation|safe }}",
|
||||
language: "{{ LANGUAGE_CODE }}"
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.stats.views',
|
||||
|
||||
url(r'^$', 'index', name='fullindex'),
|
||||
url(r'^graphs/$', "graphs"),
|
||||
url(r'^graphs/$', "graphs", name="graph_list"),
|
||||
)
|
||||
|
||||
@@ -12,7 +12,7 @@ def menu(target, user):
|
||||
return [
|
||||
{"name": "webmail",
|
||||
"label": _("Webmail"),
|
||||
"url": reverse("modoboa.extensions.webmail.views.index")},
|
||||
"url": reverse("webmail:index")},
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -780,10 +780,20 @@ Webmail.prototype = {
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Compress the currently selected mailbox.
|
||||
*
|
||||
* @this {Webmail}
|
||||
* @param {object} e - event object
|
||||
*/
|
||||
compress: function(e) {
|
||||
e.preventDefault();
|
||||
var $link = $(e.target);
|
||||
this.send_mb_action($link.attr("href"));
|
||||
var $selected = $("#folders li.active").children("a");
|
||||
|
||||
this.send_mb_action(
|
||||
"{0}?name={1}".format($link.attr("href"), $selected.attr("href"))
|
||||
);
|
||||
},
|
||||
|
||||
delete_message: function(e) {
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
{% for att in attachments %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<a href="{% url 'modoboa.extensions.webmail.views.delattachment' %}?name={{ att.tmpname }}"
|
||||
<a href="{% url 'webmail:attachment_delete' %}?name={{ att.tmpname }}"
|
||||
name="delattachment">
|
||||
<span class="glyphicon glyphicon-remove"></span>
|
||||
</a>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
{% block extra_buttons %}
|
||||
<div class="nav navbar-nav action-buttons btn-group">
|
||||
<a name="attachments" href="{% url 'modoboa.extensions.webmail.views.attachments' %}" class="btn btn-default">
|
||||
<a name="attachments" href="{% url 'webmail:attachment_list' %}" class="btn btn-default">
|
||||
<span class="fa fa-paperclip"></span>
|
||||
{% trans "Attachments" %}
|
||||
<span id="attachment_counter">{% if attachment_counter %}({{ attachment_counter }}){% endif %}</span>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
{% block extraheaders %}{% if attachments %}
|
||||
<div class="row">
|
||||
<div class="header">{% trans "Attachments" %}</div>
|
||||
<div class="value">{% url "modoboa.extensions.webmail.views.getattachment" as url %}
|
||||
<div class="value">{% url "webmail:attachment_get" as url %}
|
||||
{% for key, fname in attachments.items %}
|
||||
<a href="{{ url }}?mbox={{ folder }}&mailid={{ mail_id }}&fname={{ fname }}&partnumber={{ key }}">{{ fname }}</a>
|
||||
{% endfor %}
|
||||
|
||||
@@ -16,11 +16,11 @@ var webmail = undefined;
|
||||
$(document).ready(function() {
|
||||
webmail = new Webmail({
|
||||
poller_interval: {{ refreshrate }},
|
||||
poller_url: "{% url 'modoboa.extensions.webmail.views.check_unseen_messages' %}",
|
||||
listing_url: "{% url 'modoboa.extensions.webmail.views.index' %}?action=listmailbox",
|
||||
move_url: "{% url 'modoboa.extensions.webmail.views.move' %}",
|
||||
submboxes_url: "{% url 'modoboa.extensions.webmail.views.submailboxes' %}",
|
||||
delattachment_url: "{% url 'modoboa.extensions.webmail.views.delattachment' %}",
|
||||
poller_url: "{% url 'webmail:unseen_messages_check' %}",
|
||||
listing_url: "{% url 'webmail:index' %}?action=listmailbox",
|
||||
move_url: "{% url 'webmail:mail_move' %}",
|
||||
submboxes_url: "{% url 'webmail:submailboxes_get' %}",
|
||||
delattachment_url: "{% url 'webmail:attachment_delete' %}",
|
||||
deflocation: "{{ deflocation }}",
|
||||
defcallback: "{{ defcallback }}",
|
||||
ro_mboxes: {% tolist ro_mboxes %},
|
||||
|
||||
@@ -5,7 +5,6 @@ from django.utils.translation import ugettext as _
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.conf import settings
|
||||
|
||||
from modoboa.extensions import webmail
|
||||
from modoboa.extensions.webmail.lib import (
|
||||
imapheader, separate_mailbox
|
||||
)
|
||||
@@ -16,6 +15,7 @@ register = template.Library()
|
||||
|
||||
@register.simple_tag
|
||||
def viewmail_menu(selection, folder, user, mail_id=None):
|
||||
"""Menu of the viewmail location."""
|
||||
entries = [
|
||||
{"name": "back",
|
||||
# "url": reverse("modoboa.extensions.webmail.views.index")
|
||||
@@ -42,7 +42,8 @@ def viewmail_menu(selection, folder, user, mail_id=None):
|
||||
{"name": "delete",
|
||||
"img": "fa fa-trash",
|
||||
"class": "btn-danger",
|
||||
"url": reverse(webmail.views.delete) + "?mbox=%s&selection[]=%s" % (folder, mail_id),
|
||||
"url": "{}?mbox={}&selection[]={}".format(
|
||||
reverse("webmail:mail_delete"), folder, mail_id),
|
||||
"title": _("Delete")
|
||||
},
|
||||
{"name": "display_options",
|
||||
@@ -87,12 +88,13 @@ def compose_menu(selection, backurl, user, **kwargs):
|
||||
|
||||
@register.simple_tag
|
||||
def listmailbox_menu(selection, folder, user):
|
||||
"""The menu of the listmailbox action."""
|
||||
entries = [
|
||||
{"name": "totrash",
|
||||
"title": _("Delete"),
|
||||
"class": "btn-danger",
|
||||
"img": "fa fa-trash",
|
||||
"url": reverse("modoboa.extensions.webmail.views.delete"),
|
||||
"url": reverse("webmail:mail_delete")
|
||||
},
|
||||
{"name": "actions",
|
||||
"label": _("Actions"),
|
||||
@@ -100,14 +102,12 @@ def listmailbox_menu(selection, folder, user):
|
||||
"menu": [
|
||||
{"name": "mark-read",
|
||||
"label": _("Mark as read"),
|
||||
"url": reverse(webmail.views.mark, args=[folder]) + "?status=read"},
|
||||
"url": "{}?status=read".format(
|
||||
reverse("webmail:mail_mark", args=[folder]))},
|
||||
{"name": "mark-unread",
|
||||
"label": _("Mark as unread"),
|
||||
"url": reverse(webmail.views.mark, args=[folder]) + "?status=unread"},
|
||||
{"divider": True},
|
||||
{"name": "compress",
|
||||
"label": _("Compress folder"),
|
||||
"url": "compact/%s/" % folder}
|
||||
"url": "{}?status=unread".format(
|
||||
reverse("webmail:mail_mark", args=[folder]))},
|
||||
]
|
||||
},
|
||||
]
|
||||
@@ -116,7 +116,7 @@ def listmailbox_menu(selection, folder, user):
|
||||
entries[1]["menu"] += [
|
||||
{"name": "empty",
|
||||
"label": _("Empty folder"),
|
||||
"url": reverse(webmail.views.empty, args=[folder])}
|
||||
"url": "{}?name={}".format(reverse("webmail:trash_empty"), folder)}
|
||||
]
|
||||
return render_to_string('webmail/main_action_bar.html', {
|
||||
'selection': selection, 'entries': entries, 'user': user, 'css': "nav",
|
||||
@@ -175,9 +175,10 @@ def print_mailboxes(tree, selected=None, withunseen=False, selectonly=False, hde
|
||||
|
||||
@register.simple_tag
|
||||
def mboxes_menu():
|
||||
"""Mailboxes menu."""
|
||||
entries = [
|
||||
{"name": "newmbox",
|
||||
"url": reverse(webmail.views.newfolder),
|
||||
"url": reverse("webmail:folder_add"),
|
||||
"img": "fa fa-plus",
|
||||
"label": _("Create a new mailbox"),
|
||||
"modal": True,
|
||||
@@ -185,15 +186,20 @@ def mboxes_menu():
|
||||
"closecb": "webmail.mboxform_close",
|
||||
"class": "btn-default btn-xs"},
|
||||
{"name": "editmbox",
|
||||
"url": reverse(webmail.views.editfolder),
|
||||
"url": reverse("webmail:folder_change"),
|
||||
"img": "fa fa-edit",
|
||||
"label": _("Edit the selected mailbox"),
|
||||
"class": "btn-default btn-xs"},
|
||||
{"name": "removembox",
|
||||
"url": reverse(webmail.views.delfolder),
|
||||
"url": reverse("webmail:folder_delete"),
|
||||
"img": "fa fa-trash",
|
||||
"label": _("Remove the selected mailbox"),
|
||||
"class": "btn-default btn-xs"}
|
||||
"class": "btn-default btn-xs"},
|
||||
{"name": "compress",
|
||||
"img": "fa fa-compress",
|
||||
"label": _("Compress folder"),
|
||||
"class": "btn-default btn-xs",
|
||||
"url": reverse("webmail:folder_compress")}
|
||||
]
|
||||
|
||||
return render_to_string('common/menu.html', dict(
|
||||
|
||||
@@ -1,23 +1,25 @@
|
||||
# coding: utf-8
|
||||
from django.conf.urls import patterns
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.extensions.webmail.views',
|
||||
(r'^$', "index"),
|
||||
(r'^submailboxes', "submailboxes"),
|
||||
(r'^getmailcontent', 'getmailcontent'),
|
||||
(r'^unseenmsgs', 'check_unseen_messages'),
|
||||
|
||||
(r'^delete/$', 'delete'),
|
||||
(r'^move/$', "move"),
|
||||
(r'^mark/(?P<name>.+)/$', "mark"),
|
||||
(r'^empty/(?P<name>.+)/$', "empty"),
|
||||
(r'^compact/(?P<name>.+)/$', "compact"),
|
||||
(r'^newfolder/$', "newfolder"),
|
||||
(r'^editfolder/$', 'editfolder'),
|
||||
(r'^delfolder/$', 'delfolder'),
|
||||
url(r'^$', "index", name="index"),
|
||||
url(r'^submailboxes', "submailboxes", name="submailboxes_get"),
|
||||
url(r'^getmailcontent', 'getmailcontent', name="mailcontent_get"),
|
||||
url(r'^unseenmsgs', 'check_unseen_messages', name="unseen_messages_check"),
|
||||
|
||||
(r'^attachments/$', 'attachments'),
|
||||
(r'^delattachment/$', 'delattachment'),
|
||||
(r'^getattachment/$', 'getattachment'),
|
||||
url(r'^delete/$', 'delete', name="mail_delete"),
|
||||
url(r'^move/$', "move", name="mail_move"),
|
||||
url(r'^mark/(?P<name>.+)/$', "mark", name="mail_mark"),
|
||||
|
||||
url(r'^newfolder/$', "newfolder", name="folder_add"),
|
||||
url(r'^editfolder/$', "editfolder", name="folder_change"),
|
||||
url(r'^delfolder/$', "delfolder", name="folder_delete"),
|
||||
url(r'^compressfolder/$', "folder_compress", name="folder_compress"),
|
||||
url(r'^emptytrash/$', "empty", name="trash_empty"),
|
||||
|
||||
url(r'^attachments/$', 'attachments', name="attachment_list"),
|
||||
url(r'^delattachment/$', 'delattachment', name="attachment_delete"),
|
||||
url(r'^getattachment/$', 'getattachment', name="attachment_get"),
|
||||
)
|
||||
|
||||
@@ -118,7 +118,9 @@ def mark(request, name):
|
||||
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def empty(request, name):
|
||||
def empty(request):
|
||||
"""Empty the trash folder."""
|
||||
name = request.GET.get("name", None)
|
||||
if name != parameters.get_user(request.user, "TRASH_FOLDER"):
|
||||
raise BadRequest(_("Invalid request"))
|
||||
get_imapconnector(request).empty(name)
|
||||
@@ -130,7 +132,11 @@ def empty(request, name):
|
||||
|
||||
@login_required
|
||||
@needs_mailbox()
|
||||
def compact(request, name):
|
||||
def folder_compress(request):
|
||||
"""Compress a mailbox."""
|
||||
name = request.GET.get("name", None)
|
||||
if name is None:
|
||||
raise BadRequest(_("Invalid request"))
|
||||
imapc = get_imapconnector(request)
|
||||
imapc.compact(name)
|
||||
return render_to_json_response({})
|
||||
@@ -156,7 +162,7 @@ def newfolder(request, tplname="webmail/folder.html"):
|
||||
|
||||
ctx = {"title": _("Create a new mailbox"),
|
||||
"formid": "mboxform",
|
||||
"action": reverse(newfolder),
|
||||
"action": reverse("webmail:folder_add"),
|
||||
"action_label": _("Create"),
|
||||
"action_classes": "submit",
|
||||
"withunseen": False,
|
||||
@@ -175,7 +181,7 @@ def editfolder(request, tplname="webmail/folder.html"):
|
||||
password=request.session["password"])
|
||||
ctx = {"title": _("Edit mailbox"),
|
||||
"formid": "mboxform",
|
||||
"action": reverse(editfolder),
|
||||
"action": reverse("webmail:folder_change"),
|
||||
"action_label": _("Update"),
|
||||
"action_classes": "submit",
|
||||
"withunseen": False,
|
||||
@@ -210,7 +216,7 @@ def editfolder(request, tplname="webmail/folder.html"):
|
||||
shortname, parent = separate_mailbox(name, sep=mbc.hdelimiter)
|
||||
ctx = {"title": _("Edit mailbox"),
|
||||
"formid": "mboxform",
|
||||
"action": reverse(editfolder),
|
||||
"action": reverse("webmail:folder_change"),
|
||||
"action_label": _("Update"),
|
||||
"action_classes": "submit",
|
||||
"withunseen": False,
|
||||
@@ -275,7 +281,7 @@ def attachments(request, tplname="webmail/attachments.html"):
|
||||
"target": "upload_target",
|
||||
"enctype": "multipart/form-data",
|
||||
"form": AttachmentForm(),
|
||||
"action": reverse(attachments),
|
||||
"action": reverse("webmail:attachment_list"),
|
||||
"attachments": request.session["compose_mail"]["attachments"]
|
||||
}
|
||||
return render(request, tplname, ctx)
|
||||
@@ -490,12 +496,13 @@ def viewmail(request):
|
||||
raise BadRequest(_("Invalid request"))
|
||||
links = request.GET.get("links", None)
|
||||
if links is None:
|
||||
links = 1 if parameters.get_user(request.user, "ENABLE_LINKS") == "yes" else 0
|
||||
links = 1 if parameters.get_user(
|
||||
request.user, "ENABLE_LINKS") == "yes" else 0
|
||||
else:
|
||||
links = int(links)
|
||||
|
||||
url = reverse(getmailcontent) + "?mbox=%s&mailid=%s&links=%d" % \
|
||||
(mbox, mailid, links)
|
||||
url = "{}?mbox={}&mailid={}&links={}".format(
|
||||
reverse("webmail:mailcontent_get"), mbox, mailid, links)
|
||||
content = Template("""
|
||||
<iframe src="{{ url }}" id="mailcontent"></iframe>
|
||||
""").render(Context({"url": url}))
|
||||
|
||||
+10
-5
@@ -38,13 +38,13 @@ class ExtTestCase(ModoTestCase):
|
||||
|
||||
def setUp(self, *args, **kwargs):
|
||||
super(ExtTestCase, self).setUp(*args, **kwargs)
|
||||
self.clt.get(reverse("modoboa.core.views.admin.viewextensions"))
|
||||
self.clt.get(reverse("core:extension_list"))
|
||||
|
||||
def activate_extensions(self, *names):
|
||||
from modoboa.core.extensions import exts_pool
|
||||
|
||||
self.ajax_post(
|
||||
reverse("modoboa.core.views.admin.saveextensions"),
|
||||
reverse("core:extension_save"),
|
||||
dict(("select_%s" % name, "1") for name in names)
|
||||
)
|
||||
for name in names:
|
||||
@@ -89,7 +89,10 @@ class ParameterTestCase(TestCase):
|
||||
self.assertNotIn("test", parameters._params['A'])
|
||||
|
||||
def test_get_parameter_form(self):
|
||||
self.assertIs(parameters.get_parameter_form('A', 'PARAM1', 'test'), TestParams)
|
||||
self.assertIs(
|
||||
parameters.get_parameter_form('A', 'PARAM1', 'test'),
|
||||
TestParams
|
||||
)
|
||||
|
||||
def test_save_admin(self):
|
||||
parameters.save_admin("PARAM1", "45", app="test")
|
||||
@@ -105,10 +108,12 @@ class ParameterTestCase(TestCase):
|
||||
parameters.get_admin("TOTO", "test")
|
||||
|
||||
def test_get_user(self):
|
||||
self.assertEqual(parameters.get_user(self.user, "PARAM1", "test"), "titi")
|
||||
self.assertEqual(
|
||||
parameters.get_user(self.user, "PARAM1", "test"), "titi")
|
||||
with self.assertRaises(parameters.NotDefined):
|
||||
parameters.get_user(self.user, "TOTO", "test")
|
||||
|
||||
def test_save_user(self):
|
||||
parameters.save_user(self.user, "PARAM1", "pouet", "test")
|
||||
self.assertEqual(parameters.get_user(self.user, "PARAM1", "test"), "pouet")
|
||||
self.assertEqual(
|
||||
parameters.get_user(self.user, "PARAM1", "test"), "pouet")
|
||||
|
||||
@@ -158,9 +158,9 @@ def topredirection(request):
|
||||
infos = exts_pool.get_extension_infos(topredir)
|
||||
path = infos["url"] if infos["url"] else infos["name"]
|
||||
else:
|
||||
path = reverse("modoboa.core.views.user.index")
|
||||
path = reverse("core:user_index")
|
||||
else:
|
||||
path = reverse("domains")
|
||||
path = reverse("admin:domain_list")
|
||||
return HttpResponseRedirect(path)
|
||||
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
set_static_url("{{ STATIC_URL }}");
|
||||
$(document).ready(function() {
|
||||
top_notifications = new TopNotifications({
|
||||
url: "{% url 'check_top_notifications' %}",
|
||||
url: "{% url 'core:top_notifications_check' %}",
|
||||
interval: {{ notifications_check_interval }}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class=" divider"></div>
|
||||
<form method="post" action="{% url 'modoboa.core.views.auth.dologin' %}" class="login-form form-horizontal">
|
||||
<form method="post" action="{% url 'core:login' %}" class="login-form form-horizontal">
|
||||
{% csrf_token %}
|
||||
{% render_field form.username %}
|
||||
{% render_field form.password %}
|
||||
|
||||
+4
-4
@@ -1,4 +1,4 @@
|
||||
from django.conf.urls import patterns, include
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.conf import settings
|
||||
from modoboa.core.extensions import exts_pool
|
||||
from modoboa.lib import parameters, events
|
||||
@@ -8,10 +8,10 @@ load_core_settings()
|
||||
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
(r'^$', 'modoboa.lib.webutils.topredirection'),
|
||||
url(r'^$', 'modoboa.lib.webutils.topredirection', name="topredirection"),
|
||||
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog',
|
||||
{'packages': ('modoboa', ), }),
|
||||
('', include('modoboa.core.urls')),
|
||||
('', include('modoboa.core.urls', namespace="core")),
|
||||
)
|
||||
|
||||
urlpatterns += patterns(
|
||||
@@ -29,7 +29,7 @@ parameters.apply_to_django_settings()
|
||||
if 'modoboa.demo' in settings.INSTALLED_APPS:
|
||||
urlpatterns += patterns(
|
||||
'',
|
||||
(r'^demo/', include('modoboa.demo.urls'))
|
||||
(r'^demo/', include('modoboa.demo.urls', namespace="demo"))
|
||||
)
|
||||
|
||||
if settings.DEBUG:
|
||||
|
||||
@@ -21,7 +21,8 @@ class DeployTest(unittest.TestCase):
|
||||
def tearDown(self):
|
||||
path = os.path.join(self.workdir, self.projname)
|
||||
code, output = exec_cmd(
|
||||
"python manage.py test core lib admin limits postfix_relay_domains radicale",
|
||||
"python manage.py test core lib admin limits postfix_relay_domains"
|
||||
"radicale postfix_autoreply",
|
||||
capture_output=False,
|
||||
cwd=path
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user