100 lines
4.2 KiB
Python
100 lines
4.2 KiB
Python
# permissions.py
|
|
from rest_framework import permissions
|
|
from api.cuser.models import CustomUser
|
|
|
|
class IsSameOrganization(permissions.BasePermission):
|
|
"""
|
|
Permiso personalizado que solo permite acceder a usuarios de la misma organización
|
|
o a administradores/staff.
|
|
"""
|
|
def has_permission(self, request, view):
|
|
# Permite listar/crear solo si el usuario está autenticado
|
|
return request.user.is_authenticated
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
# Permite operaciones sobre un objeto específico solo si:
|
|
# - El objeto pertenece a la misma organización (acceso por usuario relacionado)
|
|
return (getattr(obj, 'dirigido', None) and obj.dirigido.organizacion == request.user.organizacion)
|
|
|
|
class IsSameOrganizationAndAdmin(permissions.BasePermission):
|
|
"""
|
|
Permiso personalizado que solo permite acceder a usuarios de la misma organización
|
|
o a administradores/staff.
|
|
"""
|
|
def has_permission(self, request, view):
|
|
# Permite listar/crear solo si el usuario está autenticado
|
|
return request.user.is_authenticated
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
# Permite operaciones solo si el usuario es admin, Agente Aduanal o user y la organización coincide
|
|
allowed_groups = ['admin', 'Agente Aduanal', 'user']
|
|
user_in_group = request.user.groups.filter(name__in=allowed_groups).exists()
|
|
if not user_in_group:
|
|
return False
|
|
if hasattr(obj, 'organizacion'):
|
|
return obj.organizacion == request.user.organizacion
|
|
return False
|
|
|
|
class IsSameOrganizationDeveloper(permissions.BasePermission):
|
|
"""
|
|
Permiso personalizado que solo permite acceder a usuarios de la misma organización
|
|
o a administradores/staff.
|
|
"""
|
|
def has_permission(self, request, view):
|
|
# Permite listar/crear solo si el usuario está autenticado
|
|
return request.user.is_authenticated
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
# Permite operaciones solo si el usuario es developer, Agente Aduanal o user y la organización coincide
|
|
allowed_groups = ['developer', 'Agente Aduanal', 'user']
|
|
user_in_group = request.user.groups.filter(name__in=allowed_groups).exists()
|
|
if not user_in_group:
|
|
return False
|
|
if hasattr(obj, 'organizacion'):
|
|
return obj.organizacion == request.user.organizacion
|
|
return False
|
|
|
|
class IsOwnerOrOrgAdmin(permissions.BasePermission):
|
|
def has_object_permission(self, request, view, obj):
|
|
return (
|
|
obj == request.user or
|
|
request.user.is_staff or
|
|
request.user.groups.filter(name='admin').exists()
|
|
)
|
|
|
|
class IsSuperUser(permissions.BasePermission):
|
|
def has_object_permission(self, request, view, obj):
|
|
return request.user.is_superuser
|
|
|
|
class HasStoragePermission(permissions.BasePermission):
|
|
"""
|
|
Permiso personalizado que permite el acceso a los usuarios que tienen permisos de almacenamiento.
|
|
"""
|
|
def has_permission(self, request, view):
|
|
# Permite el acceso si el usuario tiene el permiso 'can_access_storage'
|
|
return request.user.has_perm('api.cuser.can_access_storage')
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
# Permite operaciones sobre un objeto específico si el usuario tiene el permiso
|
|
return request.user.has_perm('api.cuser.can_access_storage')
|
|
|
|
class IsSameOrganizationAndInAllowedGroups(permissions.BasePermission):
|
|
"""
|
|
Permite update/delete solo si el usuario está en TODOS los grupos permitidos
|
|
y pertenece a la misma organización que el registro, o es superuser.
|
|
"""
|
|
allowed_groups = ['admin', 'Agente Aduanal', 'user']
|
|
|
|
def has_object_permission(self, request, view, obj):
|
|
user = request.user
|
|
if not user.is_authenticated:
|
|
return False
|
|
if user.is_superuser:
|
|
return True
|
|
if not hasattr(user, 'organizacion') or not user.organizacion:
|
|
return False
|
|
# Debe tener los tres grupos asignados
|
|
for group in self.allowed_groups:
|
|
if not user.groups.filter(name=group).exists():
|
|
return False
|
|
return obj.organizacion == user.organizacion |