Skip to main content

Permissions

Added in 1.0.1

Chassis checks Django permissions. It does not replace them. The default mode is group-only: a staff user must have the permission through a group. Active superusers bypass the check.

Request check

from django_chassis.permissions import has_request_user_permission

if has_request_user_permission(request, 'catalog.view_book'):
...

Rules:

  • is_active and is_staff are required.
  • Superusers pass in the default mode.
  • Everyone else is checked against user.get_group_permissions().

Chassis uses the standard Django Admin user contract directly and does not replace or wrap request.user. A custom AUTH_USER_MODEL must therefore expose is_authenticated, is_active, is_staff, is_superuser, has_perm(), and get_group_permissions().

CHASSIS_PERMISSION_CHECK

# settings.py
CHASSIS_PERMISSION_CHECK = 'group_only' # default
# CHASSIS_PERMISSION_CHECK = 'user_has_perm'
ValueBehaviour
group_onlyGroup permissions only; superuser bypass
user_has_permStandard user.has_perm()

An unsupported value raises ImproperlyConfigured.

PermissionOption

Declare extra permissions on the site. They are registered at construction and created after migrate by PermissionInitializationService.

from django.utils.translation import gettext_lazy as _

from django_chassis.options import PermissionOption

export_books = PermissionOption(app_label='catalog', model='book', codename='export_book', name=_('Can export book'))


class CustomAdminSite(ChassisAdminSiteMixin, AdminSite):
chassis_permission_options = (export_books,)
ParameterType
app_labelDjango app label
modelModel name
codenamePermission codename
nameLocalized human name

PermissionAdminPage.permission must be a view_* permission. See Custom pages.

Actions and options

Row, list, object, table, import, and export options accept a permission string: a standard view / add / change / delete codename, or a custom codename on the model. System checks validate those references.

Name normalization

PermissionNameNormalizationService can normalize default Django permission names. The declared language is currently Russian. This is an operational detail of permission setup, not something ModelAdmins call directly.

See also