fix: delete perm on user/group/team deletion

This is done manually using signal because we do not use a foreign key
so we do not have automatically cascade deletion.
This commit is contained in:
Élie Bouttier 2014-08-30 16:27:13 -07:00
parent b4be56bb47
commit b9b892417b
4 changed files with 66 additions and 1 deletions

View file

@ -0,0 +1 @@
default_app_config = 'permissions.apps.PermissionsConfig'

10
permissions/apps.py Normal file
View file

@ -0,0 +1,10 @@
from django.apps import AppConfig
class PermissionsConfig(AppConfig):
name = 'permissions'
verbose_name = 'Permissions'
def ready(self):
import permissions.signals

View file

@ -1,6 +1,7 @@
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django import VERSION
from tracker.models import Project from tracker.models import Project
from accounts.models import * from accounts.models import *
@ -68,7 +69,6 @@ class PermissionModel(models.Model):
@property @property
def type(self): def type(self):
return self.get_grantee_type_display() return self.get_grantee_type_display()
# return dict(self.GRANTEE_TYPE)[self.grantee_type]
@property @property
def name(self): def name(self):
@ -142,3 +142,7 @@ class ProjectPermission(PermissionModel):
def __str__(self): def __str__(self):
return self.grantee.__str__() + "'s permissions on " \ return self.grantee.__str__() + "'s permissions on " \
+ self.project.name + " project" + self.project.name + " project"
if VERSION < (1, 7):
import tracker.signals

50
permissions/signals.py Normal file
View file

@ -0,0 +1,50 @@
from django.db.models.signals import pre_delete
from django.dispatch import receiver
from accounts.models import *
from permissions.models import *
"""
As permissions objects do not use a foreign key but instead an integer field
on the foreign object id, we can rely on database cascade deletion to delete
outaded permissions and we have to do it our-self.
"""
@receiver(pre_delete, sender=User, dispatch_uid="clean_user_perms")
def clean_user_perms(sender, instance, **kwargs):
# Clean global permissions
perms = GlobalPermission.objects.filter(grantee_id=instance.id,
grantee_type=GlobalPermission.GRANTEE_USER)
perms.delete()
# Clean project permissions
perms = ProjectPermission.objects.filter(grantee_id=instance.id,
grantee_type=GlobalPermission.GRANTEE_USER)
perms.delete()
@receiver(pre_delete, sender=Group, dispatch_uid="clean_group_perms")
def clean_group_perms(sender, instance, **kwargs):
# Clean global permissions
perms = GlobalPermission.objects.filter(grantee_id=instance.id,
grantee_type=GlobalPermission.GRANTEE_GROUP)
perms.delete()
# Clean project permissions
perms = ProjectPermission.objects.filter(grantee_id=instance.id,
grantee_type=GlobalPermission.GRANTEE_GROUP)
perms.delete()
@receiver(pre_delete, sender=Team, dispatch_uid="clean_team_perms")
def clean_team_perms(sender, instance, **kwargs):
print(instance)
print(instance.id)
# Clean global permissions
perms = GlobalPermission.objects.filter(grantee_id=instance.id,
grantee_type=GlobalPermission.GRANTEE_TEAM)
print(perms)
perms.delete()
# Clean project permissions
perms = ProjectPermission.objects.filter(grantee_id=instance.id,
grantee_type=GlobalPermission.GRANTEE_TEAM)
perms.delete()