django-utils

personal collection of django utilities
git clone https://git.ce9e.org/django-utils.git

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)