From 3b50db4ff770137e6504c38aba10a8862a227466 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 11 Jan 2018 20:49:38 -0200 Subject: [PATCH] Protocola com sequencia de TipoMateriaLegislativa --- sapl/materia/forms.py | 39 +++++++++++++++--- ...omaterialegislativa_sequencia_numeracao.py | 20 +++++++++ .../migrations/0025_auto_20180221_1649.py | 21 ++++++++++ sapl/materia/models.py | 9 +++- sapl/materia/views.py | 41 ++++++++++++++----- sapl/protocoloadm/views.py | 16 +++++++- sapl/templates/materia/layouts.yaml | 2 +- 7 files changed, 129 insertions(+), 19 deletions(-) create mode 100644 sapl/materia/migrations/0024_tipomaterialegislativa_sequencia_numeracao.py create mode 100644 sapl/materia/migrations/0025_auto_20180221_1649.py diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 6cf8734f6..5c6ffdf96 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -34,6 +34,7 @@ from sapl.materia.models import (AssuntoMateria, MateriaAssunto, TipoDocumento, TipoProposicao) from sapl.norma.models import (LegislacaoCitada, NormaJuridica, TipoNormaJuridica) +from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, @@ -1554,15 +1555,41 @@ class ConfirmarProposicaoForm(ProposicaoForm): if self.instance.tipo.content_type.model_class( ) == TipoMateriaLegislativa: - numero__max = MateriaLegislativa.objects.filter( - tipo=proposicao.tipo.tipo_conteudo_related, - ano=timezone.now().year).aggregate(Max('numero')) - numero__max = numero__max['numero__max'] + + numeracao = None + try: + numeracao = sapl.base.models.AppConfig.objects.last( + ).sequencia_numeracao + except AttributeError: + pass + + tipo = proposicao.tipo.tipo_conteudo_related + if tipo.sequencia_numeracao: + numeracao = tipo.sequencia_numeracao + + if numeracao == 'A': + numero = MateriaLegislativa.objects.filter( + ano=timezone.now().year).aggregate(Max('numero')) + elif numeracao == 'L': + legislatura = Legislatura.objects.first() + data_inicio = legislatura.data_inicio + data_fim = legislatura.data_fim + numero = MateriaLegislativa.objects.filter( + data_apresentacao__gte=data_inicio, + data_apresentacao__lte=data_fim).aggregate( + Max('numero')) + elif numeracao == 'U': + numero = MateriaLegislativa.objects.all().aggregate(Max('numero')) + + if numeracao is None: + numero['numero__max'] = 0 + + max_numero = numero['numero__max'] + 1 if numero['numero__max'] else 1 # dados básicos materia = MateriaLegislativa() - materia.numero = (numero__max + 1) if numero__max else 1 - materia.tipo = proposicao.tipo.tipo_conteudo_related + materia.numero = max_numero + materia.tipo = tipo materia.ementa = proposicao.descricao materia.ano = timezone.now().year materia.data_apresentacao = timezone.now() diff --git a/sapl/materia/migrations/0024_tipomaterialegislativa_sequencia_numeracao.py b/sapl/materia/migrations/0024_tipomaterialegislativa_sequencia_numeracao.py new file mode 100644 index 000000000..71e7cbf0d --- /dev/null +++ b/sapl/materia/migrations/0024_tipomaterialegislativa_sequencia_numeracao.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-02-21 19:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0023_proposicao_hash_code'), + ] + + operations = [ + migrations.AddField( + model_name='tipomaterialegislativa', + name='sequencia_numeracao', + field=models.CharField(blank=True, choices=[('A', 'Sequencial por ano'), ('L', 'Sequencial por legislatura'), ('U', 'Sequencial único')], max_length=1, null=True, verbose_name='Sequência de numeração'), + ), + ] diff --git a/sapl/materia/migrations/0025_auto_20180221_1649.py b/sapl/materia/migrations/0025_auto_20180221_1649.py new file mode 100644 index 000000000..705f2541c --- /dev/null +++ b/sapl/materia/migrations/0025_auto_20180221_1649.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.13 on 2018-02-21 19:49 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0024_tipomaterialegislativa_sequencia_numeracao'), + ] + + operations = [ + migrations.AlterField( + model_name='tipomaterialegislativa', + name='sequencia_numeracao', + field=models.CharField(blank=True, choices=[('A', 'Sequencial por ano'), ('L', 'Sequencial por legislatura'), ('U', 'Sequencial único')], default='', max_length=1, verbose_name='Sequência de numeração'), + preserve_default=False, + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index d82954262..66fd94900 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -9,7 +9,8 @@ from django.db.models.functions import Concat from django.utils import formats, timezone from django.utils.translation import ugettext_lazy as _ from model_utils import Choices -from sapl.base.models import Autor + +from sapl.base.models import Autor, SEQUENCIA_NUMERACAO from sapl.comissoes.models import Comissao from sapl.compilacao.models import (PerfilEstruturalTextoArticulado, TextoArticulado) @@ -87,6 +88,12 @@ class TipoMateriaLegislativa(models.Model): ('sigla', '__icontains') )) + sequencia_numeracao = models.CharField( + max_length=1, + blank=True, + verbose_name=_('Sequência de numeração'), + choices=SEQUENCIA_NUMERACAO) + class Meta: verbose_name = _('Tipo de Matéria Legislativa') verbose_name_plural = _('Tipos de Matérias Legislativas') diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b08c62450..bf8243939 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -11,6 +11,7 @@ from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse +from django.db.models import Max from django.forms.forms import Form from django.forms.utils import ErrorDict from django.http import HttpResponse, JsonResponse @@ -40,6 +41,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, OrgaoForm, ProposicaoForm, TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm) from sapl.norma.models import LegislacaoCitada +from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, @@ -281,17 +283,36 @@ def recuperar_materia(request): tipo = TipoMateriaLegislativa.objects.get(pk=request.GET['tipo']) ano = request.GET.get('ano', '') - param = {'tipo': tipo} - param['data_apresentacao__year'] = ano if ano else timezone.now().year + numeracao = None + try: + numeracao = sapl.base.models.AppConfig.objects.last( + ).sequencia_numeracao + except AttributeError: + pass - materia = MateriaLegislativa.objects.filter(**param).order_by( - 'tipo', 'ano', 'numero').values_list('numero', 'ano').last() - if materia: - response = JsonResponse({'numero': materia[0] + 1, - 'ano': materia[1]}) - else: - response = JsonResponse( - {'numero': 1, 'ano': ano if ano else timezone.now().year}) + if tipo.sequencia_numeracao: + numeracao = tipo.sequencia_numeracao + + if numeracao == 'A': + numero = MateriaLegislativa.objects.filter( + ano=timezone.now().year).aggregate(Max('numero')) + elif numeracao == 'L': + legislatura = Legislatura.objects.first() + data_inicio = legislatura.data_inicio + data_fim = legislatura.data_fim + numero = MateriaLegislativa.objects.filter( + data_apresentacao__gte=data_inicio, + data_apresentacao__lte=data_fim).aggregate( + Max('numero')) + elif numeracao == 'U': + numero = MateriaLegislativa.objects.all().aggregate(Max('numero')) + + if numeracao is None: + numero['numero__max'] = 0 + + max_numero = numero['numero__max'] + 1 if numero['numero__max'] else 1 + + response = JsonResponse({'numero': max_numero, 'ano': ano}) return response diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 084d90e63..a10aa30f8 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -292,7 +292,7 @@ class ProtocoloDocumentoView(PermissionRequiredMixin, numero = Protocolo.objects.filter( ano=timezone.now().year).aggregate(Max('numero')) elif numeracao == 'L': - legislatura = Legislatura.objects.last() + legislatura = Legislatura.objects.first() data_inicio = legislatura.data_inicio data_fim = legislatura.data_fim numero = Protocolo.objects.filter( @@ -414,6 +414,7 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): 'pk': protocolo.pk}) def form_valid(self, form): + try: numeracao = sapl.base.models.AppConfig.objects.last( ).sequencia_numeracao @@ -423,9 +424,22 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView): messages.add_message(self.request, messages.ERROR, msg) return self.render_to_response(self.get_context_data()) + # Se TipoMateriaLegislativa tem sequencia própria, + # então sobreescreve a sequência global + tipo = form.cleaned_data['tipo_materia'] + if tipo.sequencia_numeracao: + numeracao = tipo.sequencia_numeracao + if numeracao == 'A': numero = Protocolo.objects.filter( ano=timezone.now().year).aggregate(Max('numero')) + elif numeracao == 'L': + legislatura = Legislatura.objects.first() + data_inicio = legislatura.data_inicio + data_fim = legislatura.data_fim + numero = Protocolo.objects.filter( + data__gte=data_inicio, data__lte=data_fim).aggregate( + Max('numero')) elif numeracao == 'U': numero = Protocolo.objects.all().aggregate(Max('numero')) diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index 3dc086026..888a5e461 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -5,7 +5,7 @@ Origem: TipoMateriaLegislativa: {% trans 'Tipo Matéria Legislativa' %}: - - sigla:4 descricao + - sigla:4 descricao sequencia_numeracao RegimeTramitacao: {% trans 'Tipo de Documento' %}: