From 76b6d65900750b4fc55be148e61e0c136f8f29e2 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 6 Jun 2014 17:50:21 +0200 Subject: [PATCH] wip: radicale extension. Permissions. --- modoboa/extensions/radicale/__init__.py | 12 ++++++++++- modoboa/extensions/radicale/forms.py | 9 +++++++++ modoboa/extensions/radicale/views.py | 27 ++++++++++++++++--------- modoboa/lib/permissions.py | 18 ++++++++++++++++- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/modoboa/extensions/radicale/__init__.py b/modoboa/extensions/radicale/__init__.py index 0dbb36e46..99f30c228 100644 --- a/modoboa/extensions/radicale/__init__.py +++ b/modoboa/extensions/radicale/__init__.py @@ -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. diff --git a/modoboa/extensions/radicale/forms.py b/modoboa/extensions/radicale/forms.py index 27a30aea4..ca551238d 100644 --- a/modoboa/extensions/radicale/forms.py +++ b/modoboa/extensions/radicale/forms.py @@ -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): """ diff --git a/modoboa/extensions/radicale/views.py b/modoboa/extensions/radicale/views.py index b9bbd63ad..863b446a5 100644 --- a/modoboa/extensions/radicale/views.py +++ b/modoboa/extensions/radicale/views.py @@ -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) diff --git a/modoboa/lib/permissions.py b/modoboa/lib/permissions.py index 8834a5cfe..82a405fd1 100644 --- a/modoboa/lib/permissions.py +++ b/modoboa/lib/permissions.py @@ -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) + )