mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
wip: radicale extension.
Permissions.
This commit is contained in:
@@ -3,8 +3,11 @@ Radicale management frontend.
|
||||
|
||||
"""
|
||||
import sys
|
||||
from django.contrib.auth.models import Permission, Group
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.utils.translation import ugettext_lazy
|
||||
from modoboa.lib import events, parameters
|
||||
from modoboa.lib.permissions import add_permissions_to_group
|
||||
from modoboa.core.extensions import ModoExtension, exts_pool
|
||||
|
||||
|
||||
@@ -21,7 +24,14 @@ class Radicale(ModoExtension):
|
||||
def init(self):
|
||||
"""Plugin initialization.
|
||||
"""
|
||||
pass
|
||||
add_permissions_to_group(
|
||||
"DomainAdmins", [("radicale", "add_usercalendar"),
|
||||
("radicale", "change_usercalendar"),
|
||||
("radicale", "delete_usercalendar"),
|
||||
("radicale", "add_sharedcalendar"),
|
||||
("radicale", "change_sharedcalendar"),
|
||||
("radicale", "delete_sharedcalendar")]
|
||||
)
|
||||
|
||||
def load(self):
|
||||
"""Plugin loading.
|
||||
|
||||
@@ -6,6 +6,7 @@ from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _, ugettext_lazy
|
||||
from modoboa.lib.webutils import render_to_json_response
|
||||
from modoboa.lib.formutils import WizardForm, TabForms, DynamicForm
|
||||
from modoboa.extensions.admin.models import Domain
|
||||
from modoboa.extensions.radicale.models import UserCalendar, SharedCalendar
|
||||
|
||||
|
||||
@@ -25,6 +26,14 @@ class SharedCalendarForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = SharedCalendar
|
||||
|
||||
def __init__(self, user, *args, **kwargs):
|
||||
"""Custom constructor.
|
||||
|
||||
We need the current user to filter the domain list.
|
||||
"""
|
||||
super(SharedCalendarForm, self).__init__(*args, **kwargs)
|
||||
self.fields["domain"].queryset = Domain.objects.get_for_admin(user)
|
||||
|
||||
|
||||
class RightsForm(forms.Form, DynamicForm):
|
||||
"""
|
||||
|
||||
@@ -57,7 +57,7 @@ def new_user_calendar(request):
|
||||
|
||||
@login_required
|
||||
def user_calendar(request, pk):
|
||||
"""
|
||||
"""Edit or remove a calendar.
|
||||
"""
|
||||
try:
|
||||
ucal = UserCalendar.objects.get(pk=pk)
|
||||
@@ -77,14 +77,14 @@ def new_shared_calendar(request):
|
||||
"""Shared calendar creation view.
|
||||
"""
|
||||
if request.method == "POST":
|
||||
form = SharedCalendarForm(request.POST)
|
||||
form = SharedCalendarForm(request.user, request.POST)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return render_to_json_response(_("Calendar created"))
|
||||
return render_to_json_response(
|
||||
{"form_errors": form.errors}, status=400
|
||||
)
|
||||
form = SharedCalendarForm()
|
||||
form = SharedCalendarForm(request.user)
|
||||
return render(request, "common/generic_modal_form.html", {
|
||||
"form": form,
|
||||
"formid": "sharedcal_form",
|
||||
@@ -96,13 +96,12 @@ def new_shared_calendar(request):
|
||||
|
||||
|
||||
@login_required
|
||||
@permission_required("radicale.add_sharedcalendar")
|
||||
@user_passes_test(
|
||||
lambda u: u.has_perm("radicale.change_sharedcalendar")
|
||||
or u.has_perm("radicale.delete_sharedcalendar")
|
||||
)
|
||||
def shared_calendar(request, pk):
|
||||
"""
|
||||
"""Edit or remove a shared calendar.
|
||||
"""
|
||||
try:
|
||||
scal = SharedCalendar.objects.get(pk=pk)
|
||||
@@ -114,14 +113,14 @@ def shared_calendar(request, pk):
|
||||
scal.delete()
|
||||
return render_to_json_response(_("Calendar removed"))
|
||||
if request.method == "POST":
|
||||
form = SharedCalendarForm(request.POST, instance=scal)
|
||||
form = SharedCalendarForm(request.user, request.POST, instance=scal)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return render_to_json_response(_("Calendar updated"))
|
||||
return render_to_json_response(
|
||||
{"form_errors": form.errors}, status=400
|
||||
)
|
||||
form = SharedCalendarForm(instance=scal)
|
||||
form = SharedCalendarForm(request.user, instance=scal)
|
||||
return render(request, "common/generic_modal_form.html", {
|
||||
"form": form,
|
||||
"formid": "sharedcal_form",
|
||||
@@ -136,9 +135,17 @@ def shared_calendar(request, pk):
|
||||
def username_list(request):
|
||||
"""Get the list of username the current user can see.
|
||||
"""
|
||||
from modoboa.extensions.admin.models import Mailbox
|
||||
from modoboa.extensions.admin.models import Domain, Mailbox
|
||||
|
||||
result = []
|
||||
for mb in Mailbox.objects.prefetch_related("user").all():
|
||||
result.append(mb.user.username)
|
||||
qset = Mailbox.objects.select_related("user")
|
||||
if request.user.has_perm("admin.add_mailbox"):
|
||||
qset = qset.filter(
|
||||
domain__in=Domain.objects.get_for_admin(request.user)
|
||||
)
|
||||
else:
|
||||
user_domain = request.user.mailbox_set.all()[0].domain
|
||||
qset = qset.filter(domain=user_domain)
|
||||
for mbox in qset:
|
||||
result.append(mbox.user.username)
|
||||
return render_to_json_response(result)
|
||||
|
||||
@@ -139,7 +139,23 @@ def get_object_owner(obj):
|
||||
"""
|
||||
ct = ContentType.objects.get_for_model(obj)
|
||||
try:
|
||||
entry = ObjectAccess.objects.get(content_type=ct, object_id=obj.id, is_owner=True)
|
||||
entry = ObjectAccess.objects.get(
|
||||
content_type=ct, object_id=obj.id, is_owner=True
|
||||
)
|
||||
except ObjectAccess.DoesNotExist:
|
||||
return None
|
||||
return entry.user
|
||||
|
||||
|
||||
def add_permissions_to_group(groupname, permissions):
|
||||
"""Add the specified permissions to a django group.
|
||||
"""
|
||||
from django.contrib.auth.models import Group, Permission
|
||||
|
||||
grp = Group.objects.get(name=groupname)
|
||||
for appname, permname in permissions:
|
||||
ct = ContentType.objects.get_by_natural_key(
|
||||
appname, permname.split("_")[1])
|
||||
grp.permissions.add(
|
||||
Permission.objects.get(content_type=ct, codename=permname)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user