django_rbac: replace Operation.name by a registry (#49142)

There is no need to store the operation label in the database.
This commit is contained in:
Benjamin Dauvergne 2020-12-04 18:13:33 +01:00
parent 32de734b5a
commit 12fd246aeb
5 changed files with 43 additions and 21 deletions

View File

@ -422,10 +422,10 @@ GenericRelation(Permission,
object_id_field='target_id').contribute_to_class(ContentType, 'admin_perms')
CHANGE_PASSWORD_OP = Operation(name=_('Change password'), slug='change_password')
RESET_PASSWORD_OP = Operation(name=_('Password reset'), slug='reset_password')
ACTIVATE_OP = Operation(name=_('Activation'), slug='activate')
CHANGE_EMAIL_OP = Operation(name=pgettext_lazy('operation', 'Change email'), slug='change_email')
MANAGE_MEMBERS_OP = Operation(name=_('Manage role members'), slug='manage_members')
MANAGE_AUTHORIZATIONS_OP = Operation(
CHANGE_PASSWORD_OP = Operation.register(name=_('Change password'), slug='change_password')
RESET_PASSWORD_OP = Operation.register(name=_('Password reset'), slug='reset_password')
ACTIVATE_OP = Operation.register(name=_('Activation'), slug='activate')
CHANGE_EMAIL_OP = Operation.register(name=pgettext_lazy('operation', 'Change email'), slug='change_email')
MANAGE_MEMBERS_OP = Operation.register(name=_('Manage role members'), slug='manage_members')
MANAGE_AUTHORIZATIONS_OP = Operation.register(
name=_('Manage service consents'), slug='manage_authorizations')

View File

@ -0,0 +1,17 @@
# Generated by Django 2.2.17 on 2020-12-04 17:04
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('django_rbac', '0005_auto_20171209_1106'),
]
operations = [
migrations.RemoveField(
model_name='operation',
name='name',
),
]

View File

@ -102,9 +102,6 @@ class OrganizationalUnit(OrganizationalUnitAbstractBase):
class Operation(models.Model):
name = models.CharField(
max_length=128,
verbose_name=_('name'))
slug = models.CharField(
max_length=32,
verbose_name=_('slug'),
@ -114,10 +111,20 @@ class Operation(models.Model):
return [self.slug]
def __str__(self):
return six.text_type(_(self.name))
return str(self._registry.get(self.slug, self.slug))
def export_json(self):
return {'slug': self.slug, 'name': self.name}
return {'slug': self.slug}
@property
def name(self):
return str(self)
@classmethod
def register(cls, name, slug):
cls._registry[slug] = name
return cls(slug=slug)
_registry = {}
objects = managers.OperationManager()
@ -408,9 +415,9 @@ class PermissionMixin(models.Model):
return backends.DjangoRBACBackend().ous_with_perm(self, perm, queryset=queryset)
ADMIN_OP = Operation(name=_('Management'), slug='admin')
CHANGE_OP = Operation(name=_('Change'), slug='change')
DELETE_OP = Operation(name=_('Delete'), slug='delete')
ADD_OP = Operation(name=_('Add'), slug='add')
VIEW_OP = Operation(name=_('View'), slug='view')
SEARCH_OP = Operation(name=_('Search'), slug='search')
ADMIN_OP = Operation.register(name=_('Management'), slug='admin')
CHANGE_OP = Operation.register(name=_('Change'), slug='change')
DELETE_OP = Operation.register(name=_('Delete'), slug='delete')
ADD_OP = Operation.register(name=_('Add'), slug='add')
VIEW_OP = Operation.register(name=_('View'), slug='view')
SEARCH_OP = Operation.register(name=_('Search'), slug='search')

View File

@ -78,7 +78,5 @@ def get_permission_model():
def get_operation(operation_tpl):
from . import models
operation, created = models.Operation.objects.get_or_create(
slug=six.text_type(operation_tpl.slug),
defaults={'name': six.text_type(operation_tpl.name)})
operation, created = models.Operation.objects.get_or_create(slug=operation_tpl.slug)
return operation

View File

@ -345,7 +345,7 @@ def test_check_and_repair_managers_of_roles(db, capsys):
def test_check_and_delete_unused_permissions(db, capsys, simple_user):
Permission = get_permission_model()
role1 = get_role_model().objects.create(name='Role1', slug='role1')
op1 = Operation.objects.create(name='Operation 1', slug='operation-1')
op1 = Operation.objects.create(slug='operation-1')
used_perm = Permission.objects.create(
operation=op1, target_id=role1.id,
target_ct=ContentType.objects.get_for_model(get_role_model()))