diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 82bba2372..4c1b2957e 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -1,3 +1,4 @@ +import re import django_filters import logging @@ -180,6 +181,7 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet): model = DocumentoAdministrativo fields = ['tipo', 'numero', + 'complemento', 'protocolo__numero', 'numero_externo', 'data', @@ -200,17 +202,21 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet): ('o', 4), ]) row2 = to_row( - [('numero', 2), - ('ano', 2), - ('protocolo__numero', 2), - ('numero_externo', 2), - ('data', 4)]) + [('numero', 5), + ('complemento',2), + ('ano', 5)]) row3 = to_row( + [('protocolo__numero', 4), + ('numero_externo', 4), + ('data', 4) + ]) + + row4 = to_row( [('interessado', 6), ('assunto', 6)]) - row4 = to_row( + row5 = to_row( [ ('tramitacao', 2), ('tramitacaoadministrativo__status', 4), @@ -239,7 +245,7 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet): Fieldset(_('Pesquisar Documento'), row1, row2, row3, row4, - buttons,) + row5, buttons,) ) @@ -1080,6 +1086,7 @@ class DocumentoAdministrativoForm(FileFieldCheckMixin, ModelForm): model = DocumentoAdministrativo fields = ['tipo', 'numero', + 'complemento', 'ano', 'data', 'numero_protocolo', @@ -1115,10 +1122,18 @@ class DocumentoAdministrativoForm(FileFieldCheckMixin, ModelForm): numero_protocolo = self.data['numero_protocolo'] ano_protocolo = self.data['ano_protocolo'] + complemento = re.sub('\s+', '', self.data['complemento']).upper() numero_documento = int(self.cleaned_data['numero']) tipo_documento = int(self.data['tipo']) ano_documento = int(self.data['ano']) + + equal_docs = DocumentoAdministrativo.objects.filter(numero=numero_documento, + ano=ano_documento, + complemento=complemento) + if equal_docs.exists() and equal_docs.first().pk != self.instance.pk: + raise ValidationError("Um documento administrativo com esse numero, complemento e ano já existe.") + # não permite atualizar para numero/ano/tipo existente if self.instance.pk: mudanca_doc = numero_documento != self.instance.numero \ @@ -1128,7 +1143,9 @@ class DocumentoAdministrativoForm(FileFieldCheckMixin, ModelForm): if not self.instance.pk or mudanca_doc: doc_exists = DocumentoAdministrativo.objects.filter(numero=numero_documento, tipo=tipo_documento, - ano=ano_documento).exists() + ano=ano_documento, + complemento=complemento).exists() + if doc_exists: self.logger.error("DocumentoAdministrativo (numero={}, tipo={} e ano={}) já existe." .format(numero_documento, tipo_documento, ano_documento)) @@ -1194,7 +1211,7 @@ class DocumentoAdministrativoForm(FileFieldCheckMixin, ModelForm): def __init__(self, *args, **kwargs): row1 = to_row( - [('tipo', 6), ('numero', 3), ('ano', 3)]) + [('tipo', 3), ('numero', 3),('complemento', 3), ('ano', 3)]) row2 = to_row( [('data', 4), ('numero_protocolo', 4), ('ano_protocolo', 4)]) diff --git a/sapl/protocoloadm/migrations/0031_documentoadministrativo_caractere_identificador.py b/sapl/protocoloadm/migrations/0031_documentoadministrativo_caractere_identificador.py new file mode 100644 index 000000000..abc1e28a6 --- /dev/null +++ b/sapl/protocoloadm/migrations/0031_documentoadministrativo_caractere_identificador.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.26 on 2020-01-15 14:41 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('protocoloadm', '0030_auto_20200114_1121'), + ] + + operations = [ + migrations.AddField( + model_name='documentoadministrativo', + name='complemento', + field=models.CharField(blank=True, max_length=10, verbose_name='Complemento'), + ), + ] diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py index b9582a204..e73a79719 100644 --- a/sapl/protocoloadm/models.py +++ b/sapl/protocoloadm/models.py @@ -134,6 +134,10 @@ class DocumentoAdministrativo(models.Model): TipoDocumentoAdministrativo, on_delete=models.PROTECT, verbose_name=_('Tipo Documento')) numero = models.PositiveIntegerField(verbose_name=_('Número')) + + complemento = models.CharField(max_length=10, blank=True, + verbose_name=_('Complemento')) + ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'), choices=RANGE_ANOS) protocolo = models.ForeignKey( diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py index a1166f81b..631c56243 100644 --- a/sapl/protocoloadm/tests/test_protocoloadm.py +++ b/sapl/protocoloadm/tests/test_protocoloadm.py @@ -398,6 +398,7 @@ def test_documento_administrativo_protocolo_inexistente(): 'tipo': str(tipo.pk), 'assunto': 'teste', 'numero': '1', + 'complemento':'', 'data': '2017-10-10', 'numero_protocolo': '11', 'ano_protocolo': '2017', diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index af3736824..6855ee9f5 100755 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -1,5 +1,6 @@ from datetime import datetime import logging +import re from random import choice from string import ascii_letters, digits @@ -365,6 +366,10 @@ class DocumentoAdministrativoCrud(Crud): def cancel_url(self): return self.search_url + def form_valid(self, form): + form.instance.complemento = re.sub('\s+', '', form.instance.complemento).upper() + return super().form_valid(form) + class UpdateView(Crud.UpdateView): form_class = DocumentoAdministrativoForm layout_key = None @@ -376,7 +381,7 @@ class DocumentoAdministrativoCrud(Crud): self.object = form.save() dict_objeto_novo = self.object.__dict__ - + atributos = [ 'tipo_id', 'ano', 'numero', 'data', 'protocolo_id', 'assunto', 'interessado', 'tramitacao', 'restrito', 'texto_integral','numero_externo', @@ -393,6 +398,8 @@ class DocumentoAdministrativoCrud(Crud): self.object.save() break + + form.instance.complemento = re.sub('\s+', '', form.instance.complemento).upper() return super().form_valid(form) diff --git a/sapl/templates/protocoloadm/documentoadministrativo_filter.html b/sapl/templates/protocoloadm/documentoadministrativo_filter.html index 49234e5a6..e2442dc73 100644 --- a/sapl/templates/protocoloadm/documentoadministrativo_filter.html +++ b/sapl/templates/protocoloadm/documentoadministrativo_filter.html @@ -37,7 +37,7 @@ {% if request.user.is_anonymous and not d.restrito or not request.user.is_anonymous%}