ilab_gestion_backend/project/api/views/operador.py

80 lines
3.0 KiB
Python
Executable File

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
)
try:
with transaction.atomic():
operador = models.Operador(
id_operador = id_operador,
nombre_operador = request.data.get('nombre_operador'),
vigente = request.data.get('vigente'),
)
operador.save()
# 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()
rol_operador = models.RolOperador(
id_rol = rol,
id_operador = operador
)
rol_operador.save()
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)