From bed41c435a6cea82ee1a5160b353b5b49b723a31 Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Tue, 27 Jan 2026 16:38:02 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20impl=20numera=C3=A7=C3=A3o=20autom?= =?UTF-8?q?=C3=A1tica=20em=20cadastros=20via=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/api/serializers.py | 1 + sapl/api/views_materia.py | 26 ++++++++++++++++++++++++++ sapl/materia/models.py | 5 ++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py index b8bb06b4d..15416180f 100644 --- a/sapl/api/serializers.py +++ b/sapl/api/serializers.py @@ -11,6 +11,7 @@ from rest_framework import serializers from rest_framework.fields import SerializerMethodField from sapl.base.models import Autor, CasaLegislativa, Metadata +from sapl.materia.models import MateriaLegislativa from sapl.parlamentares.models import Parlamentar, Mandato, Legislatura from sapl.sessao.models import OrdemDia, SessaoPlenaria diff --git a/sapl/api/views_materia.py b/sapl/api/views_materia.py index 1810aea2e..5badd1cd4 100644 --- a/sapl/api/views_materia.py +++ b/sapl/api/views_materia.py @@ -1,7 +1,9 @@ +from copy import deepcopy from django.apps.registry import apps from django.db.models import Q from rest_framework.decorators import action +from rest_framework.status import HTTP_201_CREATED from rest_framework.response import Response from drfautoapi.drfautoapi import ApiViewSetConstrutor, \ @@ -90,6 +92,30 @@ class _MateriaLegislativaViewSet: class Meta: ordering = ['-ano', 'tipo', 'numero'] + def create(self, request, *args, **kwargs): + data = deepcopy(request.data) + tipo = data.get('tipo', None) + numero = data.get('numero', None) + ano = data.get('ano', None) + + if tipo: + numero, ano = MateriaLegislativa.get_proximo_numero( + tipo=tipo, + ano=ano, + numero_preferido=numero + ) + data['numero'] = numero + data['ano'] = ano + + serializer = self.get_serializer(data=data) + + serializer.is_valid(raise_exception=True) + self.perform_create(serializer) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=HTTP_201_CREATED, headers=headers) + + + @action(detail=True, methods=['GET']) def ultima_tramitacao(self, request, *args, **kwargs): diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 6c4c31cbf..8c8d2db64 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -411,6 +411,9 @@ class MateriaLegislativa(models.Model): except AttributeError: pass + if not isinstance(tipo, TipoMateriaLegislativa): + tipo = TipoMateriaLegislativa.objects.get(pk=tipo) + # O tipo pode sobrescrever a configuração global if tipo.sequencia_numeracao: numeracao = tipo.sequencia_numeracao @@ -443,7 +446,7 @@ class MateriaLegislativa(models.Model): tipo=tipo, ano=ano, numero=numero_preferido).exists(): - return int(numero_preferido) + return int(numero_preferido), ano # Retorna o próximo número sequencial max_numero = numero['numero__max']