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

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

156 lines
5.1 KiB
Python

# coding: utf-8
import datetime
from django.utils.translation import ugettext as _, ugettext_noop
from django.contrib.auth.models import User, Group
from modoboa.lib.webutils import _render, getctx, _render_to_string
from forms import *
from tables import SuperAdminsTable, DomainAdminsTable
class Permissions(object):
@staticmethod
def is_authorized(user):
return True
def get_add_form(self, request):
raise NotImplementedError
def add(self, request):
raise NotImplementedError
def delete(self, request, selection):
raise NotImplementedError
def get(self, request):
raise NotImplementedError
class SuperAdminsPerms(Permissions):
title = ugettext_noop("Add super administrator")
role = "super_admins"
@staticmethod
def is_authorized(user):
return user.is_superuser
def get_add_form(self, request):
form = SuperAdminForm(request.user)
return _render(request, 'admin/add_permission.html', {
"form" : form,
"title" : _(self.title),
"role": self.role
})
def add(self, request):
form = SuperAdminForm(request.user, request.POST)
if form.is_valid():
user = User.objects.get(pk=request.POST["user"])
user.is_superuser = True
user.date_joined = datetime.datetime.now()
user.groups.clear()
user.save()
return True, None
content = _render_to_string(request, "admin/add_permission.html", {
"form" : form,
"title" : _(self.title),
"role" : self.role
})
return False, getctx("ko", content=content)
def delete(self, selection):
for s in selection:
user = User.objects.get(pk=int(s))
if user.username == "admin":
#messages.error(request, _("admin is intouchable!!"), fail_silently=True)
continue
user.is_superuser = False
user.save()
def get(self, request):
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),
"date_joined" : admin.date_joined,
"enabled" : admin.is_active}]
return SuperAdminsTable(request, admins_list).render()
class DomainAdminsPerms(Permissions):
title = ugettext_noop("Add domain administrator")
role = "domain_admins"
@staticmethod
def is_authorized(user):
return user.has_perm("admin.view_domains")
def get_add_form(self, request):
form = DomainAdminForm()
return _render(request, 'admin/add_domain_admin.html', {
"form" : form,
"title" : _(self.title),
"role" : self.role
})
def add(self, request):
form = DomainAdminForm(request.POST)
if request.POST.has_key("user") and request.POST["user"] != "":
mboxid = request.POST['user']
mb = Mailbox.objects.get(pk=mboxid)
form.fields["user"].choices = [(mboxid, mb),]
if form.is_valid():
mb.user.is_superuser = False
mb.user.date_joined = datetime.datetime.now()
mb.user.groups.add(Group.objects.get(name="DomainAdmins"))
mb.user.save()
return True, None
content = _render_to_string(request, "admin/add_domain_admin.html", {
"form" : form,
"title" : _(self.title),
"role" : self.role
})
return False, getctx("ko", content=content)
def delete(self, selection):
for s in selection:
mbox = Mailbox.objects.get(pk=int(s))
grp = Group.objects.get(name="DomainAdmins")
mbox.user.groups.remove(grp)
mbox.user.save()
def get(self, request):
domadmins = Mailbox.objects.filter(user__groups__name="DomainAdmins")
domadmins_list = []
for admin in domadmins:
domadmins_list += [admin.tohash()]
return DomainAdminsTable(request, domadmins_list).render()
def get_perms_class(user, role):
"""Retrieves the class associated to a given role
The provided user must have the required permission to retrieve
this class.
If "role" is one of those provided by the admin component, its
class is directly returned. Otherwise, a "PermsGetClass" event is
raised to check if one of the active plugins provide the desired
class.
:param user: a User object
:param role: the role to look for
"""
parts = role.split("_")
cname = ""
for p in parts:
cname += p.capitalize()
cname += "Perms"
if globals().has_key(cname):
if globals()[cname].is_authorized(user):
return globals()[cname]
return None
res = events.raiseQueryEvent("PermsGetClass", role=role)
if not len(res):
return None
return res[0]