Reputation: 827
I'm trying to be able to restrict views to certain groups as well as display certain blocks of html to said groups. I also want to know how to reuse this code across all my apps in my project.
Right now this code gives me NameError: name 'request' is not defined
views.py
from django import template
register = template.Library()
@register.filter('in_group')
def in_group(user, group_name):
return user.groups.filter(name=group_name).exists()
@login_required
@user_passes_test(in_group(request.user, 'Company Staff'))
def some_view(request):
return render(request=request, template_name='main/some-template.html')
I also have this for checking in templates if a user is in a group
main/templatetags/filters.py
from django import template
register = template.Library()
@register.filter(name='group')
def group(u, group_names):
group_names = group_names.split(',')
return u.groups.filter(name__in=group_names).exists()
Upvotes: 0
Views: 161
Reputation: 673
well you could write your own Custom decorator to set permission as per the user in group
decorator.py
def allowed_users(allowed_roles=[]): #passing role list
def decorator(view_func):
def wrapper_func(request, *args, **kwargs):
group = None
#checking if user is part of a group
if request.user.groups.exists():
group = request.user.groups.all()[0].name #set group value
#checking if the group is in allowed role
if group in allowed_roles:
return view_func(request, *args, **kwargs)
else:
return redirect('/')
return wrapper_func
return decorator
you can import this decorator and use it in the view
from app_name.decorators import allowed_users
@allowed_users(allowed_roles=['group_name']) # if the user is teacher than only the use can view the page
def some_view(request):
return render(request=request, template_name='main/some-template.html')
this way you can make certain user in group to view certain page.
Upvotes: 1