wip: radicale extension.

Permissions.
This commit is contained in:
Antoine Nguyen
2014-06-06 17:50:21 +02:00
parent ef9319beb4
commit 76b6d65900
4 changed files with 54 additions and 12 deletions
+11 -1
View File
@@ -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.
+9
View File
@@ -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):
"""
+17 -10
View File
@@ -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)
+17 -1
View File
@@ -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)
)