69 lines
2.2 KiB
Python
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."))
|
|
|