Mudanza de repo
This commit is contained in:
100
core/permissions.py
Normal file
100
core/permissions.py
Normal file
@@ -0,0 +1,100 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user