From 3d10917ed8ca92aeaa14b1365313a19d0d013a7d Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 4 Dec 2020 18:13:33 +0100 Subject: [PATCH] django_rbac: replace Operation.name by a registry (#49142) There is no need to store the operation label in the database. --- src/authentic2/a2_rbac/models.py | 12 ++++---- .../migrations/0006_remove_operation_name.py | 17 +++++++++++ src/django_rbac/models.py | 29 ++++++++++++------- src/django_rbac/utils.py | 4 +-- tests/test_commands.py | 2 +- 5 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 src/django_rbac/migrations/0006_remove_operation_name.py diff --git a/src/authentic2/a2_rbac/models.py b/src/authentic2/a2_rbac/models.py index 4d0c9d74..9d7578b6 100644 --- a/src/authentic2/a2_rbac/models.py +++ b/src/authentic2/a2_rbac/models.py @@ -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') diff --git a/src/django_rbac/migrations/0006_remove_operation_name.py b/src/django_rbac/migrations/0006_remove_operation_name.py new file mode 100644 index 00000000..19386159 --- /dev/null +++ b/src/django_rbac/migrations/0006_remove_operation_name.py @@ -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', + ), + ] diff --git a/src/django_rbac/models.py b/src/django_rbac/models.py index bcd92f02..dcb7e9c5 100644 --- a/src/django_rbac/models.py +++ b/src/django_rbac/models.py @@ -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') diff --git a/src/django_rbac/utils.py b/src/django_rbac/utils.py index 08f0dc00..5128d06e 100644 --- a/src/django_rbac/utils.py +++ b/src/django_rbac/utils.py @@ -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 diff --git a/tests/test_commands.py b/tests/test_commands.py index d7f0d8cd..bc0df7d8 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -330,7 +330,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())) -- 2.29.2