mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-21 06:18:45 +02:00
see #92
Work in progress. I've moved permissions management to the new dedicated page. Adding permissions is working but deleting ones. I must also filter the list of users available when creating a super admin because the default admin appears inside :p
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
from django import forms
|
||||
from modoboa.admin.models import Domain, Mailbox, Alias
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.contrib.auth.models import User
|
||||
from modoboa.admin.templatetags.admin_extras import gender
|
||||
from modoboa.lib import tables
|
||||
|
||||
class DomainForm(forms.ModelForm):
|
||||
class Meta:
|
||||
@@ -63,3 +65,30 @@ class PermissionForm(forms.Form):
|
||||
choices=(("SuperAdmins", _("Super administrator")),
|
||||
("DomainAdmins", _("Domain administrator"))),
|
||||
help_text=_("Select the role you want this user to have"))
|
||||
|
||||
class SuperAdminForm(forms.Form):
|
||||
user = forms.ModelChoiceField(queryset=User.objects.all(),
|
||||
label=_("User"), required=True,
|
||||
help_text=_("Select a user in the list"))
|
||||
|
||||
class DomainAdminForm(forms.Form):
|
||||
domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"),
|
||||
required=True,
|
||||
help_text=_("Select a domain in the list"))
|
||||
user = forms.ChoiceField(label=_("User"), required=True,
|
||||
help_text=_("Select a user in the list"))
|
||||
|
||||
class SuperAdminsTable(tables.Table):
|
||||
idkey = "id"
|
||||
selection = tables.SelectionColumn("selection", width="4%", first=True)
|
||||
_1_user_name = tables.Column("user_name", label=_("User name"))
|
||||
_2_full_name = tables.Column("full_name", label=_("Full name"))
|
||||
_3_enabled = tables.Column("enabled", label=_("Enabled_m"), width="10%")
|
||||
|
||||
class DomainAdminsTable(tables.Table):
|
||||
idkey = "id"
|
||||
selection = tables.SelectionColumn("selection", width="4%", first=True)
|
||||
_1_domain = tables.Column("domain", label=_("Domain"))
|
||||
_2_full_name = tables.Column("full_name", label=_("Full name"))
|
||||
_3_enabled = tables.Column("enabled", label=_("Enabled_m"), width="10%")
|
||||
|
||||
|
||||
@@ -99,6 +99,14 @@ class Mailbox(models.Model):
|
||||
% (parameters.get_admin("STORAGE_PATH"),
|
||||
self.domain.name, self.address))
|
||||
|
||||
def tohash(self):
|
||||
return {
|
||||
"id" : self.id,
|
||||
"domain" : self.domain.name,
|
||||
"full_name" : self.name,
|
||||
"enabled" : self.user.is_active
|
||||
}
|
||||
|
||||
class Alias(models.Model):
|
||||
address = models.CharField(_('address'), max_length=100,
|
||||
help_text=_("The alias address (without the domain part)"))
|
||||
|
||||
@@ -31,7 +31,7 @@ def admin_menu(user):
|
||||
if user.has_perm("auth.view_permissions"):
|
||||
entries[0]["menu"] += [
|
||||
{"name" : "permissions",
|
||||
"url" : "",
|
||||
"url" : reverse(admin.views.permissions),
|
||||
"label" : _("Permissions"),
|
||||
"img" : static_url("pics/permissions.png")}
|
||||
]
|
||||
@@ -40,7 +40,7 @@ def admin_menu(user):
|
||||
{"name" : "settings",
|
||||
"img" : static_url("pics/settings.png"),
|
||||
"label" : _("Settings"),
|
||||
"url" : reverse(admin.views.settings)}
|
||||
"url" : reverse(admin.views.viewparameters)}
|
||||
]
|
||||
|
||||
if not len(entries[0]["menu"]):
|
||||
@@ -48,7 +48,6 @@ def admin_menu(user):
|
||||
return render_to_string("common/menulist.html",
|
||||
{"entries" : entries, "user" : user})
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def domain_menu(domain_id, selection, user):
|
||||
entries = [
|
||||
@@ -86,16 +85,6 @@ def domain_menu(domain_id, selection, user):
|
||||
@register.simple_tag
|
||||
def settings_menu(selection, user):
|
||||
entries = [
|
||||
{"name" : "permissions",
|
||||
"url" : reverse(admin.views.settings),
|
||||
"label" : _("Permissions"),
|
||||
"img" : static_url("pics/permissions.png")},
|
||||
{"name" : "addperm",
|
||||
"url" : reverse(admin.views.addpermission),
|
||||
"img" : static_url("pics/add.png"),
|
||||
"label" : _("Add permission"),
|
||||
"class" : "boxed",
|
||||
"rel" : "{handler:'iframe',size:{x:320,y:210}}"},
|
||||
{"name" : "parameters",
|
||||
"url" : reverse(admin.views.viewparameters),
|
||||
"img" : static_url("pics/domains.png"),
|
||||
@@ -129,6 +118,19 @@ def domains_menu(selection, user):
|
||||
{"entries" : entries, "selection" : selection,
|
||||
"user" : user})
|
||||
|
||||
@register.simple_tag
|
||||
def permissions_menu(user):
|
||||
entries = [
|
||||
{"name" : "addperm",
|
||||
"label" : _("Add permission"),
|
||||
"img" : static_url("pics/add.png")},
|
||||
{"name" : "delperms",
|
||||
"label" : _("Remove permissions"),
|
||||
"img" : static_url("pics/remove.png")},
|
||||
]
|
||||
return render_to_string('common/menu.html',
|
||||
{"entries" : entries, "user" : user})
|
||||
|
||||
@register.simple_tag
|
||||
def loadadminextmenu(user):
|
||||
menu = events.raiseQueryEvent("AdminMenuDisplay", target="admin_menu_box",
|
||||
|
||||
+4
-2
@@ -16,11 +16,13 @@ urlpatterns = patterns('modoboa.admin.views',
|
||||
url(r'^domains/(?P<dom_id>\d+)/aliases/$', "aliases", name="full-aliases"),
|
||||
url(r'^domains/(?P<dom_id>\d+)/aliases/(?P<mbox_id>\d+)/$', "aliases", name="mbox-aliases"),
|
||||
(r'^domains/(?P<dom_id>\d+)/delalias/(?P<alias_id>\d+)/$', 'delalias'),
|
||||
(r'^settings/$', 'settings'),
|
||||
(r'^settings/addperm/$', 'addpermission'),
|
||||
(r'^settings/$', 'viewparameters'),
|
||||
(r'^settings/delperm/(?P<mbox_id>\d+)/(?P<group>\w+)/$', 'deletepermission'),
|
||||
(r'^settings/parameters/$', 'viewparameters'),
|
||||
(r'^settings/parameters/save/$', 'saveparameters'),
|
||||
(r'^settings/extensions/$', 'viewextensions'),
|
||||
(r'^settings/extensions/save/$', 'saveextensions'),
|
||||
(r'^permissions/$', 'permissions'),
|
||||
(r'^permissions/superadmin/add/$', 'add_superadmin'),
|
||||
(r'^permissions/domainadmin/add/$', 'add_domain_admin'),
|
||||
)
|
||||
|
||||
+72
-29
@@ -14,11 +14,10 @@ from django.contrib.auth.models import User, Group
|
||||
from django.contrib import messages
|
||||
|
||||
from modoboa import admin, userprefs
|
||||
from modoboa.admin.models import *
|
||||
from forms import MailboxForm, DomainForm, AliasForm, PermissionForm
|
||||
from models import *
|
||||
from forms import *
|
||||
from modoboa.lib.authbackends import crypt_password
|
||||
from modoboa.lib import _render, _ctx_ok, _ctx_ko, getctx
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib import _render, _ctx_ok, _ctx_ko, getctx, events, parameters
|
||||
from modoboa.lib.models import Parameter
|
||||
import string
|
||||
import copy
|
||||
@@ -88,7 +87,7 @@ def newdomain(request):
|
||||
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
|
||||
|
||||
form = DomainForm()
|
||||
return render_to_response('admin/newdomain.html', {
|
||||
return _render(request, 'admin/newdomain.html', {
|
||||
"form" : form
|
||||
})
|
||||
|
||||
@@ -356,43 +355,87 @@ def delalias(request, dom_id, alias_id):
|
||||
args=[dom_id]))
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser)
|
||||
def settings(request):
|
||||
admins = User.objects.filter(is_superuser=True)
|
||||
@permission_required("auth.view_permissions")
|
||||
def permissions(request):
|
||||
permtables = []
|
||||
if request.user.is_superuser:
|
||||
admins = User.objects.filter(is_superuser=True)
|
||||
admins_list = []
|
||||
for admin in admins:
|
||||
admins_list += [{"id" : admin.id, "user_name" : admin.username,
|
||||
"full_name" : "%s %s" % (admin.first_name, admin.last_name),
|
||||
"enabled" : admin.is_active}]
|
||||
permtables += [
|
||||
{"title" : _("Super administrators"),
|
||||
"content" : SuperAdminsTable(admins_list).render(request),
|
||||
"addurl" : reverse(add_superadmin)}
|
||||
]
|
||||
|
||||
permtables += events.raiseQueryEvent("PermsGetTables", user=request.user)
|
||||
|
||||
domadmins = Mailbox.objects.filter(user__groups__name="DomainAdmins")
|
||||
domadmins_list = []
|
||||
for admin in domadmins:
|
||||
domadmins_list += [admin.tohash()]
|
||||
permtables += [
|
||||
{"title" : _("Domain administrators"),
|
||||
"content" : DomainAdminsTable(domadmins_list).render(request),
|
||||
"addurl" : reverse(add_domain_admin)}
|
||||
]
|
||||
|
||||
return _render(request, 'admin/permissions.html', {
|
||||
"admins" : admins, "domadmins" : domadmins
|
||||
"permtables" : permtables
|
||||
})
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser)
|
||||
def addpermission(request):
|
||||
def add_superadmin(request):
|
||||
if request.method == "POST":
|
||||
form = PermissionForm(request.POST)
|
||||
if request.POST.has_key('user'):
|
||||
mboxid = request.POST['user']
|
||||
form.fields["user"].choices = \
|
||||
[(mboxid, Mailbox.objects.get(pk=mboxid)),]
|
||||
form = SuperAdminForm(request.POST)
|
||||
if form.is_valid():
|
||||
mb = Mailbox.objects.get(pk=request.POST["user"])
|
||||
if request.POST["role"] == "SuperAdmins":
|
||||
mb.user.is_superuser = True
|
||||
mb.user.groups.clear()
|
||||
else:
|
||||
mb.user.is_superuser = False
|
||||
mb.user.groups.add(Group.objects.get(name=request.POST["role"]))
|
||||
mb.user.save()
|
||||
ctx = _ctx_ok(reverse(admin.views.settings))
|
||||
user = User.objects.get(pk=request.POST["user"])
|
||||
user.is_superuser = True
|
||||
user.groups.clear()
|
||||
user.save()
|
||||
ctx = _ctx_ok(reverse(admin.views.permissions))
|
||||
return HttpResponse(simplejson.dumps(ctx),
|
||||
mimetype="application/json")
|
||||
ctx = _ctx_ko("admin/addpermission.html", {
|
||||
ctx = _ctx_ko("admin/add_superadmin.html", {
|
||||
"form" : form
|
||||
})
|
||||
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
|
||||
|
||||
form = PermissionForm()
|
||||
return _render(request, 'admin/addpermission.html', {
|
||||
"form" : form
|
||||
|
||||
form = SuperAdminForm()
|
||||
return _render(request, 'admin/add_permission.html', {
|
||||
"form" : form, "title" : _("Add super administrator"),
|
||||
"action" : reverse(add_superadmin)
|
||||
})
|
||||
|
||||
@login_required
|
||||
@permission_required("domains.create")
|
||||
def add_domain_admin(request):
|
||||
if request.method == "POST":
|
||||
form = DomainAdminForm(request.POST)
|
||||
mboxid = request.POST['user']
|
||||
form.fields["user"].choices = \
|
||||
[(mboxid, Mailbox.objects.get(pk=mboxid)),]
|
||||
if form.is_valid():
|
||||
mb = Mailbox.objects.get(pk=request.POST["user"])
|
||||
mb.user.is_superuser = False
|
||||
mb.user.groups.add(Group.objects.get(name="DomainAdmins"))
|
||||
mb.user.save()
|
||||
ctx = _ctx_ok(reverse(admin.views.permissions))
|
||||
return HttpResponse(simplejson.dumps(ctx),
|
||||
mimetype="application/json")
|
||||
ctx = _ctx_ko("admin/add_domain_admin.html", {
|
||||
"form" : form
|
||||
})
|
||||
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
|
||||
|
||||
form = DomainAdminForm()
|
||||
return _render(request, 'admin/add_domain_admin.html', {
|
||||
"form" : form, "title" : _("Add domain administrator"),
|
||||
"action" : reverse(add_domain_admin)
|
||||
})
|
||||
|
||||
@login_required
|
||||
|
||||
Reference in New Issue
Block a user