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_contribuyente = 'pedimento__contribuyente' def get_queryset_filtrado(self): user = self.request.user if not user.is_authenticated: return self.model.objects.none() if _is_internal_service(self.request): return self.model.objects.all() 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_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() class OrganizacionFiltradaMixin: model = None campo_organizacion = 'organizacion' campo_contribuyente = 'contribuyente' def get_queryset_filtrado_por_organizacion(self): model = self.model or self.queryset.model user = self.request.user if not user.is_authenticated: return model.objects.none() if _is_internal_service(self.request): return model.objects.all() org = get_org_context(user) if not org: return model.objects.none() filtros_base = { self.campo_organizacion: org, f'{self.campo_organizacion}__is_active': True, f'{self.campo_organizacion}__is_verified': 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 user.is_importador: filtros_base[f'{self.campo_contribuyente}__in'] = user.rfc.all() return model.objects.filter(**filtros_base) return model.objects.none() class DocumentosFiltradosMixin: model = None campo_organizacion = 'organizacion' campo_contribuyente = 'pedimento' def get_queryset_filtrado_por_organizacion(self): model = self.model or self.queryset.model user = self.request.user if not user.is_authenticated: return model.objects.none() if _is_internal_service(self.request): return model.objects.all() 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, } 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}__contribuyente__in'] = user.rfc.all() return model.objects.filter(**filtros_base) return model.objects.none() class ProcesosPorOrganizacionMixin: model = None campo_organizacion = 'organizacion' campo_pedimento = 'pedimento' def get_queryset_filtrado_por_organizacion(self): model = self.model or self.queryset.model user = self.request.user if not user.is_authenticated: return model.objects.none() if _is_internal_service(self.request): return model.objects.all() org = get_org_context(user) if not org: return model.objects.none() filtros_base = { self.campo_organizacion: org, f'{self.campo_organizacion}__is_active': True, f'{self.campo_organizacion}__is_verified': 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 user.is_importador: filtros_base[f'{self.campo_pedimento}__contribuyente__in'] = user.rfc.all() return model.objects.filter(**filtros_base) return model.objects.none()