mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
157 lines
5.1 KiB
Python
157 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 modoboa.lib import events
|
|
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]
|