From 1d269ef4f9714cee9c7fc8238f1e1d9de22293cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 23 May 2017 16:48:33 +0200 Subject: [PATCH] Update migration to keep perms. If content type for old kfet.GlobalPermissions exists: - custom permissions related to this content type are updated to new content types, - then we can safely remove this content type. --- kfet/migrations/0055_auto_20170523_1347.py | 34 --------- kfet/migrations/0055_move_permissions.py | 81 ++++++++++++++++++++++ kfet/models.py | 3 - 3 files changed, 81 insertions(+), 37 deletions(-) delete mode 100644 kfet/migrations/0055_auto_20170523_1347.py create mode 100644 kfet/migrations/0055_move_permissions.py diff --git a/kfet/migrations/0055_auto_20170523_1347.py b/kfet/migrations/0055_auto_20170523_1347.py deleted file mode 100644 index 10a72f44..00000000 --- a/kfet/migrations/0055_auto_20170523_1347.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('kfet', '0054_delete_settings'), - ] - - operations = [ - migrations.AlterModelOptions( - name='account', - options={'permissions': (('is_team', 'Is part of the team'), ('manage_perms', 'Gérer les permissions K-Fêt'), ('manage_addcosts', 'Gérer les majorations'), ('edit_balance_account', "Modifier la balance d'un compte"), ('change_account_password', "Modifier le mot de passe d'une personne de l'équipe"), ('special_add_account', 'Créer un compte avec une balance initiale'))}, - ), - migrations.AlterModelOptions( - name='accountnegative', - options={'permissions': (('view_negs', 'Voir la liste des négatifs'),)}, - ), - migrations.AlterModelOptions( - name='globalpermissions', - options={'managed': False}, - ), - migrations.AlterModelOptions( - name='inventory', - options={'permissions': (('order_to_inventory', "Générer un inventaire à partir d'une commande"),), 'ordering': ['-at']}, - ), - migrations.AlterModelOptions( - name='operation', - options={'permissions': (('perform_deposit', 'Effectuer une charge'), ('perform_negative_operations', 'Enregistrer des commandes en négatif'), ('override_frozen_protection', "Forcer le gel d'un compte"), ('cancel_old_operations', 'Annuler des commandes non récentes'), ('perform_commented_operations', 'Enregistrer des commandes avec commentaires'))}, - ), - ] diff --git a/kfet/migrations/0055_move_permissions.py b/kfet/migrations/0055_move_permissions.py new file mode 100644 index 00000000..a418124c --- /dev/null +++ b/kfet/migrations/0055_move_permissions.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +def forwards_perms(apps, schema_editor): + """Safely delete content type for old kfet.GlobalPermissions model. + + Any permissions (except defaults) linked to this content type are updated + to link at its new content type. + Then, delete the content type. This will delete the three defaults + permissions which are assumed unused. + + """ + ContentType = apps.get_model('contenttypes', 'contenttype') + try: + ctype_global = ContentType.objects.get( + app_label="kfet", model="globalpermissions", + ) + except ContentType.DoesNotExist: + # We are not migrating from existing data, nothing to do. + return + + perms = { + 'account': ( + 'is_team', 'manage_perms', 'manage_addcosts', + 'edit_balance_account', 'change_account_password', + 'special_add_account', + ), + 'accountnegative': ('view_negs',), + 'inventory': ('order_to_inventory',), + 'operation': ( + 'perform_deposit', 'perform_negative_operations', + 'override_frozen_protection', 'cancel_old_operations', + 'perform_commented_operations', + ), + } + + Permission = apps.get_model('auth', 'permission') + global_perms = Permission.objects.filter(content_type=ctype_global) + + for modelname, codenames in perms.items(): + model = apps.get_model('kfet', modelname) + ctype = ContentType.objects.get_for_model(model) + ( + global_perms + .filter(codename__in=codenames) + .update(content_type=ctype) + ) + + ctype_global.delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('kfet', '0054_delete_settings'), + ('contenttypes', '__latest__'), + ('auth', '__latest__'), + ] + + operations = [ + migrations.AlterModelOptions( + name='account', + options={'permissions': (('is_team', 'Is part of the team'), ('manage_perms', 'Gérer les permissions K-Fêt'), ('manage_addcosts', 'Gérer les majorations'), ('edit_balance_account', "Modifier la balance d'un compte"), ('change_account_password', "Modifier le mot de passe d'une personne de l'équipe"), ('special_add_account', 'Créer un compte avec une balance initiale'))}, + ), + migrations.AlterModelOptions( + name='accountnegative', + options={'permissions': (('view_negs', 'Voir la liste des négatifs'),)}, + ), + migrations.AlterModelOptions( + name='inventory', + options={'ordering': ['-at'], 'permissions': (('order_to_inventory', "Générer un inventaire à partir d'une commande"),)}, + ), + migrations.AlterModelOptions( + name='operation', + options={'permissions': (('perform_deposit', 'Effectuer une charge'), ('perform_negative_operations', 'Enregistrer des commandes en négatif'), ('override_frozen_protection', "Forcer le gel d'un compte"), ('cancel_old_operations', 'Annuler des commandes non récentes'), ('perform_commented_operations', 'Enregistrer des commandes avec commentaires'))}, + ), + migrations.RunPython(forwards_perms), + ] diff --git a/kfet/models.py b/kfet/models.py index e27551b9..d218dd2d 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -689,9 +689,6 @@ class Operation(models.Model): article=self.article, amount=self.amount) -class GlobalPermissions(models.Model): - class Meta: - managed = False class GenericTeamToken(models.Model): token = models.CharField(max_length = 50, unique = True)