feature/rbac permisos y roles implementados
This commit is contained in:
@@ -1,142 +1,179 @@
|
||||
import logging
|
||||
|
||||
from core.permissions import get_org_context, user_has_role, is_internal_service_request
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _is_internal_service(request):
|
||||
return is_internal_service_request(request)
|
||||
|
||||
|
||||
class FiltroPorOrganizacionMixin:
|
||||
model = None
|
||||
campo_usuario = 'user'
|
||||
campo_organizacion = 'organizacion'
|
||||
campo_rfc = 'rfc__id'
|
||||
campo_contribuyente = 'pedimento__contribuyente' # solo si aplica
|
||||
campo_contribuyente = 'pedimento__contribuyente'
|
||||
|
||||
def get_queryset_filtrado(self):
|
||||
user = self.request.user
|
||||
|
||||
if not user.is_authenticated or not hasattr(user, self.campo_organizacion):
|
||||
if not user.is_authenticated:
|
||||
return self.model.objects.none()
|
||||
|
||||
if user.is_superuser:
|
||||
if _is_internal_service(self.request):
|
||||
return self.model.objects.all()
|
||||
|
||||
if (user.groups.filter(name='admin').exists() or user.groups.filter(name='developer').exists()) and user.is_authenticated and user.groups.filter(name='Agente Aduanal').exists():
|
||||
model_fields = [f.name for f in self.model._meta.get_fields()]
|
||||
if self.campo_organizacion in model_fields:
|
||||
filtro = {f"{self.campo_organizacion}": getattr(user, self.campo_organizacion)}
|
||||
else:
|
||||
return self.model.objects.none()
|
||||
org = get_org_context(user)
|
||||
if not org:
|
||||
return self.model.objects.none()
|
||||
|
||||
filtro = {self.campo_organizacion: org}
|
||||
|
||||
# Superuser y usuarios con rol operativo ven todo lo de su org activa
|
||||
if user.is_superuser:
|
||||
return self.model.objects.filter(**filtro)
|
||||
|
||||
if user.groups.filter(name='Importador').exists() and getattr(user, 'is_importador', False):
|
||||
filtro = {
|
||||
f"{self.campo_contribuyente}__{self.campo_rfc}": getattr(user, self.campo_rfc),
|
||||
}
|
||||
if (
|
||||
user_has_role(user, 'admin') or
|
||||
user_has_role(user, 'developer') or
|
||||
user_has_role(user, 'Agente Aduanal') or
|
||||
user_has_role(user, 'user')
|
||||
):
|
||||
return self.model.objects.filter(**filtro)
|
||||
|
||||
# Importador: acceso filtrado por org + RFC como contribuyente
|
||||
if user.is_importador:
|
||||
filtro[f"{self.campo_contribuyente}__in"] = user.rfc.all()
|
||||
return self.model.objects.filter(**filtro)
|
||||
|
||||
return self.model.objects.none()
|
||||
|
||||
# en core/mixins/organizacion.py o similar
|
||||
|
||||
|
||||
class OrganizacionFiltradaMixin:
|
||||
model = None # Puedes sobreescribir esto en la vista
|
||||
model = None
|
||||
campo_organizacion = 'organizacion'
|
||||
campo_contribuyente = 'contribuyente' # solo si aplica
|
||||
campo_contribuyente = 'contribuyente'
|
||||
|
||||
def get_queryset_filtrado_por_organizacion(self):
|
||||
model = self.model or self.queryset.model
|
||||
user = self.request.user
|
||||
|
||||
if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'):
|
||||
if not user.is_authenticated:
|
||||
return model.objects.none()
|
||||
|
||||
if self.request.user.is_superuser:
|
||||
if _is_internal_service(self.request):
|
||||
return model.objects.all()
|
||||
|
||||
org = self.request.user.organizacion
|
||||
org = get_org_context(user)
|
||||
if not org:
|
||||
return model.objects.none()
|
||||
|
||||
filtros_base = {
|
||||
f"{self.campo_organizacion}": org,
|
||||
f"{self.campo_organizacion}__is_active": True,
|
||||
f"{self.campo_organizacion}__is_verified": True,
|
||||
self.campo_organizacion: org,
|
||||
f'{self.campo_organizacion}__is_active': True,
|
||||
f'{self.campo_organizacion}__is_verified': True,
|
||||
}
|
||||
|
||||
grupos = self.request.user.groups.values_list('name', flat=True)
|
||||
|
||||
if self.request.user.is_authenticated and 'Agente Aduanal' in grupos and (('admin' in grupos or 'developer' in grupos) and 'user' in grupos) :
|
||||
if 'Agente Aduanal' in grupos:
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
# if hasattr(model, self.campo_contribuyente):
|
||||
if self.request.user.is_authenticated and 'Importador' in grupos:
|
||||
filtros_base[f"{self.campo_contribuyente}__in"] = self.request.user.rfc.all()
|
||||
if user.is_superuser:
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if (
|
||||
user_has_role(user, 'admin') or
|
||||
user_has_role(user, 'developer') or
|
||||
user_has_role(user, 'Agente Aduanal') or
|
||||
user_has_role(user, 'user')
|
||||
):
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if user.is_importador:
|
||||
filtros_base[f'{self.campo_contribuyente}__in'] = user.rfc.all()
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
# Si no entra en los roles válidos
|
||||
return model.objects.none()
|
||||
|
||||
|
||||
class DocumentosFiltradosMixin:
|
||||
model = None
|
||||
campo_organizacion = 'organizacion'
|
||||
campo_contribuyente = 'pedimento' # solo si aplica
|
||||
campo_contribuyente = 'pedimento'
|
||||
|
||||
def get_queryset_filtrado_por_organizacion(self):
|
||||
model = self.model or self.queryset.model
|
||||
user = self.request.user
|
||||
|
||||
if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'):
|
||||
if not user.is_authenticated:
|
||||
return model.objects.none()
|
||||
|
||||
if self.request.user.is_superuser:
|
||||
if _is_internal_service(self.request):
|
||||
return model.objects.all()
|
||||
|
||||
org = self.request.user.organizacion
|
||||
org = get_org_context(user)
|
||||
if not org:
|
||||
return model.objects.none()
|
||||
|
||||
filtros_base = {
|
||||
f"{self.campo_organizacion}": org.id,
|
||||
f"{self.campo_organizacion}__is_active": True,
|
||||
f"{self.campo_organizacion}__is_verified": True,
|
||||
f'{self.campo_organizacion}': org.id,
|
||||
f'{self.campo_organizacion}__is_active': True,
|
||||
f'{self.campo_organizacion}__is_verified': True,
|
||||
}
|
||||
|
||||
grupos = self.request.user.groups.values_list('name', flat=True)
|
||||
if user.is_superuser:
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if self.request.user.is_authenticated and 'Agente Aduanal' in grupos and ('admin' in grupos or 'developer' in grupos or 'user' in grupos):
|
||||
if 'Agente Aduanal' in grupos:
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if hasattr(model, self.campo_contribuyente):
|
||||
if self.request.user.is_authenticated and 'Importador' in grupos and getattr(self.request.user, 'is_importador', False):
|
||||
filtros_base[f"{self.campo_contribuyente}__contribuyente__in"] = self.request.user.rfc.all()
|
||||
return model.objects.filter(**filtros_base)
|
||||
if (
|
||||
user_has_role(user, 'admin') or
|
||||
user_has_role(user, 'developer') or
|
||||
user_has_role(user, 'Agente Aduanal') or
|
||||
user_has_role(user, 'user')
|
||||
):
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if user.is_importador:
|
||||
filtros_base[f'{self.campo_contribuyente}__contribuyente__in'] = user.rfc.all()
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
# Si no entra en los roles válidos
|
||||
return model.objects.none()
|
||||
|
||||
|
||||
class ProcesosPorOrganizacionMixin:
|
||||
model = None # Puedes sobreescribir esto en la vista
|
||||
model = None
|
||||
campo_organizacion = 'organizacion'
|
||||
campo_pedimento = 'pedimento' # solo si aplica
|
||||
campo_pedimento = 'pedimento'
|
||||
|
||||
def get_queryset_filtrado_por_organizacion(self):
|
||||
model = self.model or self.queryset.model
|
||||
user = self.request.user
|
||||
|
||||
if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'):
|
||||
if not user.is_authenticated:
|
||||
return model.objects.none()
|
||||
|
||||
if self.request.user.is_superuser:
|
||||
if _is_internal_service(self.request):
|
||||
return model.objects.all()
|
||||
|
||||
org = self.request.user.organizacion
|
||||
org = get_org_context(user)
|
||||
if not org:
|
||||
return model.objects.none()
|
||||
|
||||
filtros_base = {
|
||||
f"{self.campo_organizacion}": org,
|
||||
f"{self.campo_organizacion}__is_active": True,
|
||||
f"{self.campo_organizacion}__is_verified": True,
|
||||
self.campo_organizacion: org,
|
||||
f'{self.campo_organizacion}__is_active': True,
|
||||
f'{self.campo_organizacion}__is_verified': True,
|
||||
}
|
||||
|
||||
grupos = self.request.user.groups.values_list('name', flat=True)
|
||||
if user.is_superuser:
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if (
|
||||
user_has_role(user, 'admin') or
|
||||
user_has_role(user, 'developer') or
|
||||
user_has_role(user, 'Agente Aduanal') or
|
||||
user_has_role(user, 'user')
|
||||
):
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if self.request.user.is_authenticated and 'Agente Aduanal' in grupos and ('admin' in grupos or 'developer' in grupos or 'user' in grupos) :
|
||||
if 'Agente Aduanal' in grupos:
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
if hasattr(model, self.campo_pedimento):
|
||||
if self.request.user.is_authenticated and 'Importador' in grupos and getattr(self.request.user, 'is_importador', False):
|
||||
filtros_base[f"{self.campo_pedimento}__contribuyente__in"] = self.request.user.rfc.all()
|
||||
return model.objects.filter(**filtros_base)
|
||||
if user.is_importador:
|
||||
filtros_base[f'{self.campo_pedimento}__contribuyente__in'] = user.rfc.all()
|
||||
return model.objects.filter(**filtros_base)
|
||||
|
||||
# Si no entra en los roles válidos
|
||||
return model.objects.none()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user