from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAdminUser, IsAuthenticated
from rest_framework.response import Response
from xworkflows import InvalidTransitionError
from sme_sigpae_api.cardapio.suspensao_alimentacao_cei.api.serializers import (
SuspensaoAlimentacaoDaCEISerializer,
)
from sme_sigpae_api.cardapio.suspensao_alimentacao_cei.api.serializers_create import (
SuspensaoAlimentacaodeCEICreateSerializer,
)
from sme_sigpae_api.cardapio.suspensao_alimentacao_cei.models import (
SuspensaoAlimentacaoDaCEI,
)
from sme_sigpae_api.dados_comuns import constants
from sme_sigpae_api.dados_comuns.mixins.serializer_context import (
DataSolicitacaoContextMixin,
)
from sme_sigpae_api.dados_comuns.permissions import (
PermissaoParaRecuperarObjeto,
UsuarioEscolaTercTotal,
)
from sme_sigpae_api.relatorios.relatorios import relatorio_suspensao_de_alimentacao_cei
[docs]
class SuspensaoAlimentacaoDaCEIViewSet(
DataSolicitacaoContextMixin, viewsets.ModelViewSet
):
lookup_field = "uuid"
queryset = SuspensaoAlimentacaoDaCEI.objects.all()
permission_classes = (IsAuthenticated,)
serializer_class = SuspensaoAlimentacaoDaCEISerializer
[docs]
def get_permissions(self):
if self.action in ["list"]:
self.permission_classes = (IsAdminUser,)
elif self.action in ["retrieve", "update"]:
self.permission_classes = (IsAuthenticated, PermissaoParaRecuperarObjeto)
elif self.action in ["create", "destroy"]:
self.permission_classes = (UsuarioEscolaTercTotal,)
return super(SuspensaoAlimentacaoDaCEIViewSet, self).get_permissions()
[docs]
def get_serializer_class(self):
if self.action in ["create", "update", "partial_update"]:
return SuspensaoAlimentacaodeCEICreateSerializer
return SuspensaoAlimentacaoDaCEISerializer
[docs]
@action(detail=False, methods=["GET"], permission_classes=(UsuarioEscolaTercTotal,))
def meus_rascunhos(self, request):
usuario = request.user
suspensoes = SuspensaoAlimentacaoDaCEI.get_rascunhos_do_usuario(usuario)
page = self.paginate_queryset(suspensoes)
serializer = SuspensaoAlimentacaoDaCEISerializer(page, many=True)
return self.get_paginated_response(serializer.data)
[docs]
@action(
detail=True,
permission_classes=(UsuarioEscolaTercTotal,),
methods=["patch"],
url_path=constants.CANCELA_SUSPENSAO_CEI,
)
def cancela_suspensao_cei(self, request, uuid=None):
suspensao_de_alimentacao = self.get_object()
try:
justificativa = request.data.get("justificativa", "")
suspensao_de_alimentacao.escola_cancela(
user=request.user, justificativa=justificativa
)
serializer = self.get_serializer(suspensao_de_alimentacao)
return Response(serializer.data)
except InvalidTransitionError as e:
return Response(
dict(detail=f"Erro de transição de estado: {e}"),
status=status.HTTP_400_BAD_REQUEST,
)
[docs]
def destroy(self, request, *args, **kwargs):
suspensao_de_alimentacao = self.get_object()
if suspensao_de_alimentacao.pode_excluir:
return super().destroy(request, *args, **kwargs)
else:
return Response(
dict(detail="Você só pode excluir quando o status for RASCUNHO."),
status=status.HTTP_403_FORBIDDEN,
)
[docs]
@action(
detail=True,
methods=["patch"],
url_path=constants.MARCAR_CONFERIDA,
permission_classes=(IsAuthenticated,),
)
def terceirizada_marca_inclusao_como_conferida(self, request, uuid=None):
suspensao_alimentacao_cei: SuspensaoAlimentacaoDaCEI = self.get_object()
try:
suspensao_alimentacao_cei.terceirizada_conferiu_gestao = True
suspensao_alimentacao_cei.save()
serializer = self.get_serializer(suspensao_alimentacao_cei)
return Response(serializer.data)
except Exception as e:
return Response(
dict(detail=f"Erro ao marcar solicitação como conferida: {e}"),
status=status.HTTP_400_BAD_REQUEST,
)
[docs]
@action(
detail=True,
url_path=constants.RELATORIO,
methods=["get"],
permission_classes=(IsAuthenticated,),
)
def relatorio(self, request, uuid=None):
return relatorio_suspensao_de_alimentacao_cei(
request, solicitacao=self.get_object()
)