Source code for shuup.admin.modules.permission_groups.views.edit

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2017, Shoop Commerce Ltd. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
from __future__ import unicode_literals

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group as PermissionGroup
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _

from shuup.admin.forms.fields import Select2MultipleField
from shuup.admin.module_registry import get_modules
from shuup.admin.utils.permissions import get_permission_object_from_string
from shuup.admin.utils.views import CreateOrUpdateView


[docs]class PermissionGroupForm(forms.ModelForm):
[docs] class Meta: model = PermissionGroup exclude = ("permissions",)
def __init__(self, *args, **kwargs): super(PermissionGroupForm, self).__init__(*args, **kwargs) initial_permissions = self._get_initial_permissions() self.fields["name"].help_text = _("The permission group name.") self.fields["modules"] = forms.MultipleChoiceField( choices=sorted(self._get_module_choices()), initial=self._get_enabled_modules(initial_permissions), required=False, label=_("Module Permissions"), help_text=_( "Select the modules that should be accessible by this permission group. " "Modules with the same permissions as selected modules will be added automatically." ) ) initial_members = self._get_initial_members() members_field = Select2MultipleField( model=get_user_model(), initial=[member.pk for member in initial_members], required=False, label=_("Members"), help_text=_( "Set the users that belong to this permission group." ) ) members_field.widget.choices = [(member.pk, force_text(member)) for member in initial_members] self.fields["members"] = members_field def _get_module_choices(self): return set((force_text(m.name), force_text(m.name)) for m in get_modules() if m.name != "_Base_") def _get_initial_members(self): if self.instance.pk: return self.instance.user_set.all() else: return [] def _get_initial_permissions(self): permissions = set() if self.instance.pk: for perm in self.instance.permissions.all(): name, module, _ = perm.natural_key() permissions.add("%s.%s" % (module, name)) return permissions def _get_enabled_modules(self, permissions): if not self.instance.pk: return [] permissions = set(permissions) modules = [] for module in get_modules(): # Ignore modules that haven't configured a name if module.name != "_Base_" and set(module.get_required_permissions()).issubset(permissions): modules.append(force_text(module.name)) return modules def _get_required_permissions(self, modules): permissions = set() for module in [m for m in get_modules() if m.name in modules]: permissions.update(set(module.get_required_permissions())) return permissions
[docs] def clean_members(self): members = self.cleaned_data.get("members", []) return get_user_model().objects.filter(pk__in=members).all()
[docs] def clean(self): cleaned_data = super(PermissionGroupForm, self).clean() permissions = set() modules = cleaned_data.pop("modules", []) required_permissions = self._get_required_permissions(modules) for permission in required_permissions: permissions.add(get_permission_object_from_string(permission)) cleaned_data["required_permissions"] = permissions return cleaned_data
[docs] def save(self): obj = super(PermissionGroupForm, self).save() obj.permissions = set(self.cleaned_data["required_permissions"]) obj.user_set = set(self.cleaned_data["members"]) return obj
[docs]class PermissionGroupEditView(CreateOrUpdateView): model = PermissionGroup form_class = PermissionGroupForm template_name = "shuup/admin/permission_groups/edit.jinja" context_object_name = "permission_group" add_form_errors_as_messages = True