from rest_framework import viewsets from rest_framework.response import Response from rest_framework.filters import OrderingFilter from rest_framework.status import HTTP_400_BAD_REQUEST from django_filters.rest_framework import DjangoFilterBackend from django.db.models import Max from django.db import transaction from api import models, serializers import logging class OperadorViewSet(viewsets.ModelViewSet): # queryset = models.Operador.objects.all() serializer_class = serializers.OperadorSerializer filter_backends = [DjangoFilterBackend, OrderingFilter] filterset_fields = ['id_region', 'nombre_operador', 'vigente', 'id_operador', 'roloperador__id_rol'] ordering_fields = '__all__' def get_queryset(self): login = self.request.jwt_info['login'] usuario = models.Usuario.objects.filter(login=login).first() if usuario.superuser: return models.Operador.objects.all() else: return models.Operador.objects.filter(roloperador__id_rol=usuario.id_rol.id_rol) def create(self, request, *args, **kwargs): # Comprueba si 'id_operador' está presente en la petición y no está vacío id_operador = request.data.get('id_operador') if not id_operador: # Si 'id_operador' no está presente o está vacío, retorna un error 400 return Response( "No se puede crear el operador: 'id_operador' no proporcionado.", status=HTTP_400_BAD_REQUEST ) newRecord= False; if not models.Operador.objects.filter(id_operador=id_operador).exists(): newRecord = True try: with transaction.atomic(): #Se Define Operador, pero no se graba operador = models.Operador( id_operador = id_operador, nombre_operador = request.data.get('nombre_operador'), vigente = request.data.get('vigente'), ) if newRecord: # se crea el rol para el operador max_id = models.Rol.objects.aggregate(Max('id_rol'))['id_rol__max'] rol = models.Rol( id_rol = max_id + 1, nombre_rol = f'Rol {operador.nombre_operador}' ) rol.save() operador.id_rol = rol #Grabamos Operador, ya que si corresponde se le asigno el id del nuevo Rol operador.save() if newRecord : aplicacion = models.Aplicacion.objects.get(id_aplicacion=1) rolApp = models.RolAplicacion( id_rol=rol, id_aplicacion =aplicacion ) rolApp.save() aplicacion = models.Aplicacion.objects.get(id_aplicacion=2) rolApp = models.RolAplicacion( id_rol=rol, id_aplicacion = aplicacion ) rolApp.save() rol_operador = models.RolOperador( id_rol = rol, id_operador = operador ) rol_operador.save() newRecord =False return Response({ 'id_operador': operador.id_operador, 'nombre_operador': operador.nombre_operador, 'vigente': operador.vigente, }) except Exception as ex: transaction.rollback() return Response(str(ex), status=HTTP_400_BAD_REQUEST) def destroy(self, request, pk=None): try: with transaction.atomic(): models.RolOperador.objects.filter(id_operador=pk).delete() return super().destroy(request, pk) except Exception as ex: return Response(str(ex), status=HTTP_400_BAD_REQUEST)