- commit
- 3eef57488bf5de9ac1009ec5e92b3f0883fcddae
- parent
- e0f8427cb80d71ccc2af62374b717734407e5819
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2018-10-26 12:13
add context groups
Diffstat
| A | utils/context_groups.py | 94 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 files changed, 94 insertions, 0 deletions
diff --git a/utils/context_groups.py b/utils/context_groups.py
@@ -0,0 +1,94 @@
-1 1 from django import template
-1 2 from django.db import models
-1 3 from django.contrib.auth.models import User
-1 4 from django.contrib.auth.models import Permission
-1 5 from django.contrib.auth import mixins as auth_mixins
-1 6
-1 7 register = template.Library()
-1 8
-1 9
-1 10 class Context(models.Model):
-1 11 pass
-1 12
-1 13
-1 14 class ContextGroup(models.Model):
-1 15 name = models.CharField(max_length=80)
-1 16 context = models.ForeignKey(Context, on_delete=models.CASCADE)
-1 17 users = models.ManyToManyField(User, blank=True)
-1 18 permissions = models.ManyToManyField(Permission, blank=True)
-1 19
-1 20 def __str__(self):
-1 21 return self.name
-1 22
-1 23 def get_permissions(self):
-1 24 perms = self.permissions.values_list(
-1 25 'content_type__app_label',
-1 26 'codename'
-1 27 )
-1 28 return ['{}.{}'.format(ct, name) for ct, name in perms]
-1 29
-1 30 def has_perm(self, perm):
-1 31 return perm in self.get_permissions()
-1 32
-1 33
-1 34 class BasicObjectBackend:
-1 35 # See https://code.djangoproject.com/ticket/20218
-1 36
-1 37 def authenticate(self, username, password):
-1 38 return None
-1 39
-1 40 def get_user_permissions(self, user, obj=None):
-1 41 if obj is None:
-1 42 return set()
-1 43 return user.get_user_permissions()
-1 44
-1 45 def get_group_permissions(self, user, obj=None):
-1 46 if obj is None:
-1 47 return set()
-1 48 return user.get_group_permissions()
-1 49
-1 50 def get_all_permissions(self, user, obj=None):
-1 51 if obj is None:
-1 52 return set()
-1 53 return user.get_all_permissions()
-1 54
-1 55 def has_perm(self, user, perm, obj=None):
-1 56 if obj is None:
-1 57 return False
-1 58 return user.has_perm(perm)
-1 59
-1 60
-1 61 class ContextPermissionBackend:
-1 62 def authenticate(self, username, password):
-1 63 return None
-1 64
-1 65 def get_group_permissions(self, user, obj=None):
-1 66 perms = set()
-1 67 if user.is_active and isinstance(obj, Context):
-1 68 groups = ContextGroup.objects.filter(context=obj, users=user)
-1 69 for group in groups:
-1 70 perms.update(group.get_permissions())
-1 71 return perms
-1 72
-1 73 def get_all_permissions(self, user, obj=None):
-1 74 return self.get_group_permissions(user, obj)
-1 75
-1 76 def has_perm(self, user, perm, obj=None):
-1 77 if user.is_active and isinstance(obj, Context):
-1 78 groups = ContextGroup.objects.filter(context=obj, users=user)
-1 79 return any(group.has_perm(perm) for group in groups)
-1 80
-1 81
-1 82 class PermissionRequiredMixin(auth_mixins.PermissionRequiredMixin):
-1 83 def get_permission_object(self):
-1 84 return None
-1 85
-1 86 def has_permission(self):
-1 87 perms = self.get_permission_required()
-1 88 permission_object = self.get_permission_object()
-1 89 return self.request.user.has_perms(perms, obj=permission_object)
-1 90
-1 91
-1 92 @register.simple_tag
-1 93 def has_perm(perm, user, obj=None):
-1 94 return user.has_perm(perm, obj)