Skip to content

Instantly share code, notes, and snippets.

@christianwgd
Created September 12, 2022 07:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christianwgd/afdc79feb9d3ff964d581700cb56f483 to your computer and use it in GitHub Desktop.
Save christianwgd/afdc79feb9d3ff964d581700cb56f483 to your computer and use it in GitHub Desktop.
Django GroupRequiredMixin to check if user is in one or more groups
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