Source code for sme_sigpae_api.cardapio.inversao_dia_cardapio.api.viewsets

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.inversao_dia_cardapio.api.serializers import (
    InversaoCardapioSerializer,
)
from sme_sigpae_api.cardapio.inversao_dia_cardapio.api.serializers_create import (
    InversaoCardapioSerializerCreate,
)
from sme_sigpae_api.cardapio.inversao_dia_cardapio.models import InversaoCardapio
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,
    UsuarioCODAEGestaoAlimentacao,
    UsuarioDiretoriaRegional,
    UsuarioEmpresaGenerico,
    UsuarioEscolaTercTotal,
)
from sme_sigpae_api.relatorios.relatorios import relatorio_inversao_dia_de_cardapio


[docs] class InversaoCardapioViewSet(DataSolicitacaoContextMixin, viewsets.ModelViewSet): lookup_field = "uuid" serializer_class = InversaoCardapioSerializer permission_classes = (IsAuthenticated,) queryset = InversaoCardapio.objects.all()
[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(InversaoCardapioViewSet, self).get_permissions()
[docs] def get_serializer_class(self): if self.action in ["create", "update", "partial_update"]: return InversaoCardapioSerializerCreate return InversaoCardapioSerializer
[docs] @action( detail=False, url_path=f"{constants.PEDIDOS_DRE}/{constants.FILTRO_PADRAO_PEDIDOS}", permission_classes=(UsuarioDiretoriaRegional,), ) def solicitacoes_diretoria_regional( self, request, filtro_aplicado=constants.SEM_FILTRO ): usuario = request.user diretoria_regional = usuario.vinculo_atual.instituicao inversoes_cardapio = diretoria_regional.inversoes_cardapio_das_minhas_escolas( filtro_aplicado ) if request.query_params.get("lote"): lote_uuid = request.query_params.get("lote") inversoes_cardapio = inversoes_cardapio.filter(rastro_lote__uuid=lote_uuid) serializer = self.get_serializer(inversoes_cardapio, many=True) return Response({"results": serializer.data})
[docs] @action( detail=False, url_path=f"{constants.PEDIDOS_CODAE}/{constants.FILTRO_PADRAO_PEDIDOS}", permission_classes=(UsuarioCODAEGestaoAlimentacao,), ) def solicitacoes_codae(self, request, filtro_aplicado=constants.SEM_FILTRO): # TODO: colocar regras de codae CODAE aqui... usuario = request.user codae = usuario.vinculo_atual.instituicao inversoes_cardapio = codae.inversoes_cardapio_das_minhas_escolas( filtro_aplicado ) if request.query_params.get("diretoria_regional"): dre_uuid = request.query_params.get("diretoria_regional") inversoes_cardapio = inversoes_cardapio.filter(rastro_dre__uuid=dre_uuid) if request.query_params.get("lote"): lote_uuid = request.query_params.get("lote") inversoes_cardapio = inversoes_cardapio.filter(rastro_lote__uuid=lote_uuid) serializer = self.get_serializer(inversoes_cardapio, many=True) return Response({"results": serializer.data})
[docs] @action( detail=False, url_path=f"{constants.PEDIDOS_TERCEIRIZADA}/{constants.FILTRO_PADRAO_PEDIDOS}", permission_classes=(UsuarioEmpresaGenerico,), ) def solicitacoes_terceirizada(self, request, filtro_aplicado=constants.SEM_FILTRO): # TODO: colocar regras de Terceirizada aqui... usuario = request.user terceirizada = usuario.vinculo_atual.instituicao inversoes_cardapio = terceirizada.inversoes_cardapio_das_minhas_escolas( filtro_aplicado ) page = self.paginate_queryset(inversoes_cardapio) serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data)
[docs] @action( detail=False, url_path=constants.SOLICITACOES_DO_USUARIO, permission_classes=(UsuarioEscolaTercTotal,), ) def minhas_solicitacoes(self, request): usuario = request.user inversoes_rascunho = InversaoCardapio.get_solicitacoes_rascunho(usuario) page = self.paginate_queryset(inversoes_rascunho) serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data)
# # IMPLEMENTAÇÃO DO FLUXO (PARTINDO DA ESCOLA) #
[docs] @action( detail=True, permission_classes=(UsuarioEscolaTercTotal,), methods=["patch"], url_path=constants.ESCOLA_INICIO_PEDIDO, ) def inicio_de_solicitacao(self, request, uuid=None): inversao_cardapio = self.get_object() try: inversao_cardapio.inicia_fluxo( user=request.user, ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioDiretoriaRegional,), methods=["patch"], url_path=constants.DRE_VALIDA_PEDIDO, ) def diretoria_regional_valida_solicitacao(self, request, uuid=None): inversao_cardapio = self.get_object() try: inversao_cardapio.dre_valida( user=request.user, ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioDiretoriaRegional,), methods=["patch"], url_path=constants.DRE_NAO_VALIDA_PEDIDO, ) def diretoria_regional_nao_valida_solicitacao(self, request, uuid=None): inversao_cardapio = self.get_object() justificativa = request.data.get("justificativa", "") try: inversao_cardapio.dre_nao_valida( user=request.user, justificativa=justificativa ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioCODAEGestaoAlimentacao,), methods=["patch"], url_path=constants.CODAE_AUTORIZA_PEDIDO, ) def codae_autoriza_solicitacao(self, request, uuid=None): inversao_cardapio = self.get_object() justificativa = request.data.get("justificativa", "") try: user = request.user if ( inversao_cardapio.status == inversao_cardapio.workflow_class.DRE_VALIDADO ): inversao_cardapio.codae_autoriza(user=user, justificativa=justificativa) else: inversao_cardapio.codae_autoriza_questionamento( user=user, justificativa=justificativa ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioCODAEGestaoAlimentacao,), methods=["patch"], url_path=constants.CODAE_QUESTIONA_PEDIDO, ) def codae_questiona(self, request, uuid=None): inversao_cardapio = self.get_object() justificativa = request.data.get("observacao_questionamento_codae", "") try: inversao_cardapio.codae_questiona( user=request.user, justificativa=justificativa ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioCODAEGestaoAlimentacao,), methods=["patch"], url_path=constants.CODAE_NEGA_PEDIDO, ) def codae_nega_solicitacao(self, request, uuid=None): inversao_cardapio = self.get_object() justificativa = request.data.get("justificativa", "") try: user = request.user if ( inversao_cardapio.status == inversao_cardapio.workflow_class.DRE_VALIDADO ): inversao_cardapio.codae_nega(user=user, justificativa=justificativa) else: inversao_cardapio.codae_nega_questionamento( user=user, justificativa=justificativa ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioEmpresaGenerico,), methods=["patch"], url_path=constants.TERCEIRIZADA_RESPONDE_QUESTIONAMENTO, ) def terceirizada_responde_questionamento(self, request, uuid=None): inversao_cardapio = self.get_object() justificativa = request.data.get("justificativa", "") resposta_sim_nao = request.data.get("resposta_sim_nao", False) try: inversao_cardapio.terceirizada_responde_questionamento( user=request.user, justificativa=justificativa, resposta_sim_nao=resposta_sim_nao, ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioEmpresaGenerico,), methods=["patch"], url_path=constants.TERCEIRIZADA_TOMOU_CIENCIA, ) def terceirizada_toma_ciencia(self, request, uuid=None): inversao_cardapio = self.get_object() try: inversao_cardapio.terceirizada_toma_ciencia( user=request.user, ) serializer = self.get_serializer(inversao_cardapio) 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] @action( detail=True, permission_classes=(UsuarioEscolaTercTotal,), methods=["patch"], url_path=constants.ESCOLA_CANCELA, ) def escola_cancela_solicitacao(self, request, uuid=None): inversao_cardapio = self.get_object() justificativa = request.data.get("justificativa", "") try: inversao_cardapio.cancelar_pedido( user=request.user, justificativa=justificativa ) serializer = self.get_serializer(inversao_cardapio) 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): inversao_cardapio = self.get_object() if inversao_cardapio.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, url_path=constants.RELATORIO, methods=["get"], permission_classes=(IsAuthenticated,), ) def relatorio(self, request, uuid=None): return relatorio_inversao_dia_de_cardapio( request, solicitacao=self.get_object() )
[docs] @action( detail=True, methods=["patch"], url_path=constants.MARCAR_CONFERIDA, permission_classes=(IsAuthenticated,), ) def terceirizada_marca_inclusao_como_conferida(self, request, uuid=None): inversao_cardapio: InversaoCardapio = self.get_object() try: inversao_cardapio.terceirizada_conferiu_gestao = True inversao_cardapio.save() serializer = self.get_serializer(inversao_cardapio) 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, )