shafafiyat/common/decorators.py

67 lines
2 KiB
Python

from functools import wraps
from django.http import JsonResponse, HttpResponse
from django.shortcuts import redirect
from common.consts import UserRoles
def require_ajax(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
if not request.headers.get('X-Requested-With') == 'XMLHttpRequest':
return JsonResponse({'error': 'Only AJAX requests are allowed.'}, status=400)
return view_func(request, *args, **kwargs)
return _wrapped_view
def allowed_roles(allowed_roles: list[UserRoles]):
"""
@param allowed_roles must not be empty
"""
def decorator(views_func):
def wrapper_func(request, *args, **kwargs):
roles = [role.slug for role in request.user.profile.roles.all()]
allowed_role_names = [role.value for role in allowed_roles]
if any(item in roles for item in allowed_role_names):
return views_func(request, *args, **kwargs)
else:
return HttpResponse('you are not allow', status=401)
return wrapper_func
return decorator
def profile_complete_needed(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
if not request.user.profile or not request.user.profile.is_completed:
return redirect("accounts:profile")
return view_func(request, *args, **kwargs)
return _wrapped_view
def superuser_required(views_func):
def wrapper_func(request, *args, **kwargs):
user = request.user
if user.is_superuser:
return views_func(request, *args, **kwargs)
else:
return redirect('dashboard:vodDashboard')
return wrapper_func
def staffuser_required(views_func):
def wrapper_func(request, *args, **kwargs):
user = request.user
if user.is_staff:
return views_func(request, *args, **kwargs)
else:
return redirect('dashboard:vodDashboard')
return wrapper_func