import json
from datetime import datetime
from django_filters import rest_framework as filters
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from src.dieta_especial.protocolo_padrao.api.serializers import (
ProtocoloPadraoDietaEspecialSerializer,
ProtocoloPadraoDietaEspecialSimplesSerializer,
)
from src.dieta_especial.protocolo_padrao.api.serializers_create import (
ProtocoloPadraoDietaEspecialSerializerCreate,
)
from ....terceirizada.models import Contrato, Edital
from ...solicitacao_dieta_especial.models import SolicitacaoDietaEspecial
from ..models import ProtocoloPadraoDietaEspecial
from .pagination import ProtocoloPadraoPagination
[docs]
class ProtocoloPadraoDietaEspecialViewSet(ModelViewSet):
lookup_field = "uuid"
permission_classes = (IsAuthenticated,)
queryset = ProtocoloPadraoDietaEspecial.objects.filter(ativo=True).order_by(
"nome_protocolo"
)
serializer_class = ProtocoloPadraoDietaEspecialSerializer
pagination_class = ProtocoloPadraoPagination
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = ("nome_protocolo", "status")
[docs]
def get_serializer_class(self):
if self.action in ["create", "update"]:
return ProtocoloPadraoDietaEspecialSerializerCreate
return ProtocoloPadraoDietaEspecialSerializer
[docs]
def get_queryset(self):
queryset = ProtocoloPadraoDietaEspecial.objects.filter(ativo=True)
if "editais[]" in self.request.query_params:
queryset = queryset.filter(
editais__uuid__in=self.request.query_params.getlist("editais[]")
).distinct()
return queryset.order_by("nome_protocolo")
[docs]
@action(detail=False, methods=["GET"], url_path="lista-status")
def lista_status(self, request):
list_status = ProtocoloPadraoDietaEspecial.STATUS_NOMES.keys()
return Response({"results": list_status})
[docs]
@action(detail=False, methods=["GET"], url_path="nomes")
def nomes(self, request):
nomes = self.queryset.values_list("nome_protocolo", flat=True).distinct()
return Response({"results": nomes})
[docs]
@action(detail=False, methods=["GET"], url_path="lista-protocolos-liberados")
def lista_protocolos_liberados(self, request):
dieta_uuid = request.query_params.get("dieta_especial_uuid", None)
solicitacao = SolicitacaoDietaEspecial.objects.get(uuid=dieta_uuid)
escola = solicitacao.escola
if escola.eh_parceira:
editais_uuid = Edital.objects.filter(numero__iexact="PARCEIRA").values_list(
"uuid", flat=True
)
else:
editais_uuid = Contrato.objects.filter(lotes__in=[escola.lote]).values_list(
"edital__uuid", flat=True
)
protocolos_liberados = (
self.get_queryset()
.filter(
status=ProtocoloPadraoDietaEspecial.STATUS_LIBERADO,
editais__uuid__in=editais_uuid,
)
.distinct()
)
response = {
"results": ProtocoloPadraoDietaEspecialSimplesSerializer(
protocolos_liberados, many=True
).data
}
return Response(response)
[docs]
@action(
detail=False, methods=["GET"], url_path="lista-protocolos-liberados-por-edital"
)
def lista_protocolos_liberados_por_edital(self, request):
edital_uuid = request.query_params.get("edital_uuid", None)
protocolos_liberados = self.get_queryset().filter(
status=ProtocoloPadraoDietaEspecial.STATUS_LIBERADO,
editais__uuid__in=[edital_uuid],
)
response = {
"results": ProtocoloPadraoDietaEspecialSimplesSerializer(
protocolos_liberados, many=True
).data
}
return Response(response)
[docs]
def criar_historico_editais(self, protocolo, validated_data):
historico = {}
changes = []
outras_informacoes = validated_data.get("outras_informacoes")
editais_antes = protocolo.editais.all()
editais_depois = Edital.objects.filter(
uuid__in=validated_data.get("editais_destino", [])
)
soma_todos_editais = editais_antes | editais_depois
diferenca = soma_todos_editais.distinct().difference(editais_antes)
if diferenca and diferenca.count() > 0:
changes.append(
{
"field": "editais",
"from": [
edital.numero for edital in editais_antes.order_by("numero")
],
"to": [
edital.numero
for edital in soma_todos_editais.distinct().order_by("numero")
],
}
)
if (protocolo.outras_informacoes != outras_informacoes) and (
outras_informacoes != ""
):
changes.append(
{
"field": "outras informacoes",
"from": protocolo.outras_informacoes,
"to": outras_informacoes,
}
)
if changes and len(changes) > 0:
historico["updated_at"] = datetime.today().strftime("%Y-%m-%d %H:%M:%S")
historico["user"] = {
"uuid": str(self.request.user.uuid),
"email": self.request.user.email,
"nome": self.request.user.nome,
"username": self.request.user.username,
}
historico["action"] = "UPDATE_VINCULOS"
historico["changes"] = changes
return historico
[docs]
@action(detail=False, methods=["PUT"], url_path="atualizar-editais")
def atualizar_editais(self, request):
protocolos_padrao = request.data.get("protocolos_padrao", None)
editais_destino = request.data.get("editais_destino", None)
outras_informacoes = request.data.get("outras_informacoes", "")
validated_data = {
"editais_destino": editais_destino,
"outras_informacoes": outras_informacoes,
}
if protocolos_padrao and editais_destino:
editais = Edital.objects.filter(uuid__in=editais_destino)
protocolos = self.get_queryset().filter(uuid__in=protocolos_padrao)
for protocolo in protocolos:
historico = self.criar_historico_editais(protocolo, validated_data)
if len(historico) > 0:
hist = (
json.loads(protocolo.historico) if protocolo.historico else []
)
hist.append(historico)
protocolo.historico = json.dumps(hist)
protocolo.outras_informacoes = outras_informacoes
protocolo.editais.add(*editais)
protocolo.save()
return Response(
{"results": "Protacolos relacionados com sucesso."},
status=status.HTTP_200_OK,
)
if not protocolos_padrao:
return Response(
{"results": "É necessário selecionar um Protocolo Padrão."},
status=status.HTTP_400_BAD_REQUEST,
)
if not editais_destino:
return Response(
{"results": "É necessário selecionar um Edital."},
status=status.HTTP_400_BAD_REQUEST,
)