sgmp/solicitacoes/management/commands/reverter_acao.py

69 lines
2.2 KiB
Python

"""
Desfaz um passo do fluxo da solicitação (da situação atual para trás).
Delega a lógica a ``solicitacoes.services.reverter_ultima_acao``.
Uso:
python manage.py reverter_acao <uuid> --dry-run
python manage.py reverter_acao <uuid>
"""
import uuid
from django.core.management.base import BaseCommand, CommandError
from solicitacoes.models import Solicitacao
from solicitacoes.services import ValidacaoError, reverter_ultima_acao
class Command(BaseCommand):
help = (
"Desfaz a última ação gravada na solicitação (Diretoria → pareceres → Head → envio ao Head)."
)
def add_arguments(self, parser):
parser.add_argument("solicitacao_id", type=str, help="UUID da solicitação")
parser.add_argument(
"--dry-run",
action="store_true",
help="Mostra o que seria feito sem gravar no banco.",
)
def handle(self, *args, **options):
raw = options["solicitacao_id"].strip()
try:
sid = uuid.UUID(raw)
except ValueError as e:
raise CommandError(f"UUID inválido: {raw}") from e
dry = options["dry_run"]
try:
s = Solicitacao.objects.get(pk=sid)
except Solicitacao.DoesNotExist as e:
raise CommandError(f"Solicitação não encontrada: {sid}") from e
self.stdout.write(f"Solicitação: {s.id}")
self.stdout.write(f" status atual: {s.status}")
self.stdout.write(f" finalizada_em: {s.finalizada_em}")
self.stdout.write(
f" pareceres: {list(s.pareceres.values_list('etapa', flat=True))}"
)
self.stdout.write(
f" aprovações: {list(s.aprovacoes.values_list('etapa', 'decisao'))}"
)
try:
result = reverter_ultima_acao(s, dry_run=dry)
except ValidacaoError as e:
raise CommandError(str(e)) from e
self.stdout.write(self.style.WARNING(f"{result['detalhe']}"))
self.stdout.write(f" (ação: {result['acao']}; novo status: {result.get('novo_status', '')})")
if dry:
self.stdout.write(self.style.NOTICE("Dry-run: nenhuma alteração gravada."))
else:
self.stdout.write(self.style.SUCCESS("OK: reversão aplicada."))