diff --git a/permissions/__init__.py b/permissions/__init__.py index e69de29..e2f35f6 100644 --- a/permissions/__init__.py +++ b/permissions/__init__.py @@ -0,0 +1 @@ +default_app_config = 'permissions.apps.PermissionsConfig' diff --git a/permissions/apps.py b/permissions/apps.py new file mode 100644 index 0000000..2d251db --- /dev/null +++ b/permissions/apps.py @@ -0,0 +1,10 @@ +from django.apps import AppConfig + + +class PermissionsConfig(AppConfig): + + name = 'permissions' + verbose_name = 'Permissions' + + def ready(self): + import permissions.signals diff --git a/permissions/models.py b/permissions/models.py index 240c6e3..be11fcb 100644 --- a/permissions/models.py +++ b/permissions/models.py @@ -1,6 +1,7 @@ from django.db import models from django.db.models import Q from django.utils.encoding import python_2_unicode_compatible +from django import VERSION from tracker.models import Project from accounts.models import * @@ -68,7 +69,6 @@ class PermissionModel(models.Model): @property def type(self): return self.get_grantee_type_display() -# return dict(self.GRANTEE_TYPE)[self.grantee_type] @property def name(self): @@ -142,3 +142,7 @@ class ProjectPermission(PermissionModel): def __str__(self): return self.grantee.__str__() + "'s permissions on " \ + self.project.name + " project" + + +if VERSION < (1, 7): + import tracker.signals diff --git a/permissions/signals.py b/permissions/signals.py new file mode 100644 index 0000000..1d11576 --- /dev/null +++ b/permissions/signals.py @@ -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()