Source code for shuup.admin.modules.permission_groups.views.edit
# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. 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.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_permissions_from_group,
get_permissions_from_urls,
set_permissions_for_group,
)
from shuup.admin.utils.views import CreateOrUpdateView
from shuup.utils.django_compat import force_text
[docs]class PermissionGroupForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PermissionGroupForm, self).__init__(*args, **kwargs)
self.fields["name"].help_text = _("The Permission Group name.")
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
initial_permissions = list(get_permissions_from_group(self.instance.pk)) if self.instance.pk else []
self.admin_modules = self._get_module_choices()
for admin_module in self.admin_modules:
all_permissions_granted = True
partial_permissions_granted = False
admin_module.required_permissions_fields = []
admin_module.per_view_permissions_fields = []
help_texts = admin_module.get_permissions_help_texts()
for required_permission in admin_module.get_required_permissions():
field_id = "perm:{}".format(required_permission)
self.fields[field_id] = forms.BooleanField(
required=False,
label=required_permission,
initial=(required_permission in initial_permissions),
help_text=help_texts.get(required_permission),
)
admin_module.required_permissions_fields.append(field_id)
if required_permission in initial_permissions:
partial_permissions_granted = True
else:
all_permissions_granted = False
extra_permissions = list(get_permissions_from_urls(admin_module.get_urls())) + list(
admin_module.get_extra_permissions()
)
for permission in extra_permissions:
field_id = "perm:{}".format(permission)
self.fields[field_id] = forms.BooleanField(
required=False,
label=permission,
initial=(permission in initial_permissions),
help_text=help_texts.get(permission),
)
admin_module.per_view_permissions_fields.append(field_id)
if permission in initial_permissions:
partial_permissions_granted = True
else:
all_permissions_granted = False
admin_module.all_permissions_granted = all_permissions_granted
admin_module.partial_permissions_granted = False if all_permissions_granted else partial_permissions_granted
def _get_module_choices(self):
modules = [module for module in get_modules() if module.name != "_Base_"]
modules.sort(key=lambda module: module.name)
return modules
def _get_initial_members(self):
if self.instance.pk:
return self.instance.user_set.all()
else:
return []
[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()
for field, value in cleaned_data.items():
if field.startswith("perm:") and value:
permissions.add(field.split("perm:")[-1])
cleaned_data["permissions"] = permissions
return cleaned_data
[docs] def save(self):
obj = super(PermissionGroupForm, self).save()
obj.user_set.set(set(self.cleaned_data["members"]))
set_permissions_for_group(obj.pk, self.cleaned_data["permissions"])
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