Created
September 12, 2022 07:14
-
-
Save christianwgd/afdc79feb9d3ff964d581700cb56f483 to your computer and use it in GitHub Desktop.
Django GroupRequiredMixin to check if user is in one or more groups
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class GroupRequiredMixin(AccessMixin): | |
group_required = None | |
def get_group_required(self): | |
"""Get which group's membership is required""" | |
if any([ | |
self.group_required is None, | |
not isinstance(self.group_required, (list, tuple, str)) | |
]): | |
raise ImproperlyConfigured( | |
f'{self.__class__.__name__} requires the `group_required` attribute ' | |
"to be set and be a string, list, or tuple." | |
) | |
if not isinstance(self.group_required, (list, tuple)): | |
self.group_required = (self.group_required,) | |
return self.group_required | |
def check_membership(self, request, groups): | |
"""Check for user's membership in required groups. Superusers are | |
automatically members""" | |
if self.request.user.is_superuser: | |
return True | |
user_groups = self.request.user.groups.values_list("name", flat=True) | |
return set(groups).intersection(set(user_groups)) | |
def dispatch(self, request, *args, **kwargs): | |
"""Call the appropriate handler if the user is a group member""" | |
in_group = False | |
if request.user.is_authenticated: | |
in_group = self.check_membership(request. self.get_group_required()) | |
if not in_group: | |
return self.handle_no_permission() | |
return super().dispatch(request, *args, **kwargs) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment