From 6299c6f0fea7b8b5a83380f98540fd8af757091d Mon Sep 17 00:00:00 2001 From: Luis Date: Tue, 3 Feb 2026 12:01:22 -0700 Subject: [PATCH 1/2] fix: Filtrar procesos por organizacion dependiando del usuario, solo se debe mostrar todos cuando sea superusuario, en caso contrario solo lo que pertenezca al usuario. --- api/tasks/views.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/api/tasks/views.py b/api/tasks/views.py index 25a3afd..847e5c7 100644 --- a/api/tasks/views.py +++ b/api/tasks/views.py @@ -4,6 +4,7 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework.pagination import PageNumberPagination from api.logger.mixins import LoggingMixin +from mixins.filtrado_organizacion import OrganizacionFiltradaMixin, ProcesosPorOrganizacionMixin from .models import Task from .serializers import TaskSerializer from .filters import TaskFilter @@ -22,7 +23,7 @@ class TaskPagination(PageNumberPagination): page_size_query_param = 'page_size' max_page_size = 100 -class TaskViewSet(LoggingMixin,viewsets.ModelViewSet): +class TaskViewSet(LoggingMixin,viewsets.ModelViewSet,OrganizacionFiltradaMixin): permission_classes = [IsAuthenticated & (IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)] queryset = Task.objects.select_related('pedimento', 'servicio').all() serializer_class = TaskSerializer @@ -32,4 +33,20 @@ class TaskViewSet(LoggingMixin,viewsets.ModelViewSet): ordering_fields = ['timestamp'] ordering = ['-timestamp'] # ordenamiento por defecto, más reciente primero - my_tags = ['tasks'] \ No newline at end of file + my_tags = ['tasks'] + + def get_queryset(self): + + """ + Filtra las tareas según la organización del usuario. + Superusuarios pueden ver todas las tareas. + """ + queryset = self.get_queryset_filtrado_por_organizacion() # Tambien filtra por importador + # user = self.request.user + # if user.is_superuser: + # return self.queryset + # # return self.queryset.filter(organizacion_id=user.organizacion.id) + # else: + # return self.queryset.filter(organizacion_id=user.organizacion.id) + return queryset + \ No newline at end of file From fa518972baf6015bf60ab49693153a35dbdf9a00 Mon Sep 17 00:00:00 2001 From: Luis Date: Tue, 3 Feb 2026 16:38:07 -0700 Subject: [PATCH 2/2] fix: se agregan nuevos ajustes al filtro y ejecucion de procesos en base al filtro seleccionado. --- api/customs/views.py | 13 +++++++++++-- api/tasks/filters.py | 3 ++- api/tasks/views.py | 1 - 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/api/customs/views.py b/api/customs/views.py index 8e38446..d60fa5b 100644 --- a/api/customs/views.py +++ b/api/customs/views.py @@ -1783,14 +1783,23 @@ class EjecutarComandoView(APIView): View para ejecutar el comando de microservicios desde una petición HTTP. """ def post(self, request): - # organizacion_id = request.data.get('organizacion_id', None) + + # Obtener organizacion_id del request (si se envía) + organizacion_id_request = request.data.get('organizacionid', None) procesamiento = request.data.get('procesamiento', None) todos = request.data.get('todos', False) if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'): raise ValueError("Usuario no autenticado o sin organización") - organizacion_id = self.request.user.organizacion.id + if organizacion_id_request is None: + return Response( + {"error": 'No se proporcionó la organización a ejecutar el proceso.'}, + status=status.HTTP_400_BAD_REQUEST + ) + + # organizacion_id = self.request.user.organizacion.id + organizacion_id = organizacion_id_request nombre_organizacion = self.request.user.organizacion.nombre if procesamiento is None and todos == False: diff --git a/api/tasks/filters.py b/api/tasks/filters.py index de12c79..2e4d288 100644 --- a/api/tasks/filters.py +++ b/api/tasks/filters.py @@ -8,7 +8,8 @@ class TaskFilter(filters.FilterSet): timestamp_gte = filters.DateTimeFilter(field_name='timestamp', lookup_expr='gte') timestamp_lte = filters.DateTimeFilter(field_name='timestamp', lookup_expr='lte') status = filters.CharFilter(field_name='status') + organizacion = filters.UUIDFilter(field_name='organizacion__id') # Cambiado a relación directa class Meta: model = Task - fields = ['servicio', 'pedimento_app', 'pedimento', 'timestamp_gte', 'timestamp_lte', 'status'] \ No newline at end of file + fields = ['servicio', 'pedimento_app', 'pedimento', 'timestamp_gte', 'timestamp_lte', 'status', 'organizacion'] \ No newline at end of file diff --git a/api/tasks/views.py b/api/tasks/views.py index 847e5c7..917205b 100644 --- a/api/tasks/views.py +++ b/api/tasks/views.py @@ -42,7 +42,6 @@ class TaskViewSet(LoggingMixin,viewsets.ModelViewSet,OrganizacionFiltradaMixin): Superusuarios pueden ver todas las tareas. """ queryset = self.get_queryset_filtrado_por_organizacion() # Tambien filtra por importador - # user = self.request.user # if user.is_superuser: # return self.queryset # # return self.queryset.filter(organizacion_id=user.organizacion.id)