GTA.sprx
GTA.sprx

Reputation: 827

Show html / restricting views to groups

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

Answers (1)

ngawang13
ngawang13

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

Related Questions