29 lines
877 B
Python
29 lines
877 B
Python
from ninja import NinjaAPI
|
|
from functools import wraps
|
|
from typing import Callable, List, Any
|
|
from django.http import HttpRequest
|
|
from django.contrib.auth.decorators import login_required, user_passes_test
|
|
from .models import User, RoleChoices
|
|
|
|
api = NinjaAPI()
|
|
|
|
|
|
def _require(roles: List[RoleChoices]) -> Callable:
|
|
def check_role(user: User) -> bool:
|
|
return user.is_authenticated and hasattr(user, "role") and user.role in roles
|
|
|
|
def decorator(func: Callable) -> Callable:
|
|
@wraps(func)
|
|
@login_required
|
|
@user_passes_test(check_role, login_url=None)
|
|
def wrapper(request: HttpRequest, *args: Any, **kwargs: Any) -> Any:
|
|
return func(request, *args, **kwargs)
|
|
|
|
return wrapper
|
|
|
|
return decorator
|
|
|
|
|
|
admin_required = _require([RoleChoices.ADMIN, RoleChoices.SUPER])
|
|
super_required = _require([RoleChoices.SUPER])
|