How to grant permission according to table value using Django and Python

I need help. I need to grant permission on the value of the table to some functions. First I explain my model below.

class Permission(models.Model):
    """docstring for Permission"""

    user = models.ForeignKey(User)
    control_reactor = models.IntegerField(default=0)
    find_reactor = models.IntegerField(default=0)
    view_reactor = models.IntegerField(default=0)

I expect the table below.

id   control_reactor      view_reactor       find_reactor   user_id

1       1                    1                   1             2

2       0                     1                  0             1

Here, suppose whose user_id = 2registered on the site. and you need to set the resolution for below views.py.

views.py:

def home(request):
    """ This function for home screen . """

    return render(request, 'plant/home.html', {'count': 1})


def view_reactor(request):
    """ This function for to get serch screen. """

    return render(request, 'plant/view_reactor.html',
                        {'count': 1})

Here I need to use the decorator function i.e-@permission_required and @login_required. Suppose that you are user_id=2logged in, then he will check all permissions in the database, for example control_reactor=1,view_reactor=1,find_reactor=1, and everything will check the function home, and for the function view_reactorhe will check view_reactor=1or not. and the same process for user_id=1. Please help me.

+4
1

?

from functools import wraps

def custom_permission_check(func):
    @wraps(func) # so that you can use help() method.
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        func_name = func.__name__ # get function name
        request = args[0] # get request from args
        permission_criteria = {
            'home':['control_reactor', 'view_reactor', 'find_reactor'],
            'control_reactor':['control_reactor'],
        }
        qs = Permission.objects.filter(user=request.user)
        for per in permission_criteria[func_name]:
            qs.filter(**{per: 1}) # use variable for field
        if not qs.exists(): # when it doesn't pass
            render(request, 'somepage.html', {}) # permission denied page
        return result
    return wrapper

@custom_permission_check
def control_reactor(request):
    return render( ... )

@ custom_permission_check
def home(request):
    return render( ... )
0

Source: https://habr.com/ru/post/1683643/


All Articles