From e1df8e97259d840b144f5f765a790df1ccbcba67 Mon Sep 17 00:00:00 2001 From: Edward Date: Wed, 6 Jun 2018 11:45:05 -0300 Subject: [PATCH 1/9] Fixes #1969 (#1970) --- sapl/templates/protocoloadm/comprovante.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html index 031b096c4..9bff567e1 100644 --- a/sapl/templates/protocoloadm/comprovante.html +++ b/sapl/templates/protocoloadm/comprovante.html @@ -61,13 +61,13 @@ Data / Horário {{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }} - {% if protocolo.tipo_processo == 0 %} + {% if protocolo.tipo_processo == 1 %} Ementa {{ protocolo.assunto_ementa }} - Interessado + Autor {{ protocolo.interessado }} {% endif %} @@ -85,5 +85,9 @@ Número Páginas {{ protocolo.numero_paginas }} + + Comprovante emitido por + {{ request.user.username }} + {% endblock detail_content %} From 6e1345d4fa1598b6ec30ef1747fbec0b047c017e Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 6 Jun 2018 11:49:47 -0300 Subject: [PATCH 2/9] HOT-FIX: Adiciona autor ao fix de #1969 --- sapl/templates/protocoloadm/comprovante.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html index 9bff567e1..1de22d402 100644 --- a/sapl/templates/protocoloadm/comprovante.html +++ b/sapl/templates/protocoloadm/comprovante.html @@ -68,7 +68,7 @@ Autor - {{ protocolo.interessado }} + {{ protocolo.autor }} {% endif %} From 780df53f33255c3d7ae72c938dadf290c43b08db Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Wed, 6 Jun 2018 14:48:49 -0300 Subject: [PATCH 3/9] Fix #1939 (#1971) --- sapl/parlamentares/forms.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index a7e042037..36ce94c3a 100644 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -261,6 +261,8 @@ class FiliacaoForm(ModelForm): fields = ['partido', 'data', 'data_desfiliacao'] + widgets = {'data': forms.DateInput(attrs={'autocomplete': 'off'}), + 'data_desfiliacao': forms.DateInput(attrs={'autocomplete': 'off'})} def clean(self): super(FiliacaoForm, self).clean() From 47beff90811c022992c44dd604d00adfb0b33417 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 6 Jun 2018 15:53:33 -0300 Subject: [PATCH 4/9] Release: 3.1.82 --- docker-compose.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 68ab20687..8bc3df3e3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.81 + image: interlegis/sapl:3.1.82 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/setup.py b/setup.py index 9e5c5315d..0ce5a9de3 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.81', + version='3.1.82', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 97c1c7f76e8fb76008ba7320a06e7c46989c947f Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Thu, 7 Jun 2018 14:37:07 -0300 Subject: [PATCH 5/9] fix #1976 (#1977) * fix #1976 * Fix #1975 --- sapl/materia/forms.py | 21 +++++++++- sapl/templates/materia/layouts.yaml | 2 +- .../materia/materialegislativa_form.html | 38 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index e5ff928d7..bbfdd3536 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -162,6 +162,11 @@ class MateriaSimplificadaForm(ModelForm): class MateriaLegislativaForm(ModelForm): + tipo_autor = ModelChoiceField(label=_('Tipo Autor'), + required=False, + queryset=TipoAutor.objects.all(), + empty_label=_('------'), ) + autor = forms.ModelChoiceField(required=False, empty_label='------', queryset=Autor.objects.all() @@ -172,6 +177,15 @@ class MateriaLegislativaForm(ModelForm): exclude = ['texto_articulado', 'autores', 'proposicao', 'anexadas', 'data_ultima_atualizacao'] + def __init__(self, *args, **kwargs): + super(MateriaLegislativaForm, self).__init__(*args, **kwargs) + + if self.instance and self.instance.pk: + self.fields['tipo_autor'] = forms.CharField(required=False, + widget=forms.TextInput(attrs={'disabled': 'disabled'})) + self.fields['autor'] = forms.CharField(required=False, + widget=forms.TextInput(attrs={'disabled': 'disabled'})) + def clean(self): super(MateriaLegislativaForm, self).clean() @@ -219,12 +233,17 @@ class MateriaLegislativaForm(ModelForm): return cleaned_data def save(self, commit=False): + if not self.instance.pk: + primeiro_autor = True + else: + primeiro_autor = False + materia = super(MateriaLegislativaForm, self).save(commit) materia.save() if self.cleaned_data['autor']: autoria = Autoria() - autoria.primeiro_autor = True + autoria.primeiro_autor = primeiro_autor autoria.materia = materia autoria.autor = self.cleaned_data['autor'] autoria.save() diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index 74c11e6c8..d31817b94 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -23,7 +23,7 @@ MateriaLegislativa: {% trans 'Identificação Básica' %}: - tipo ano numero - data_apresentacao numero_protocolo tipo_apresentacao - - autor + - tipo_autor autor - texto_original {% trans 'Outras Informações' %}: - apelido dias_prazo polemica diff --git a/sapl/templates/materia/materialegislativa_form.html b/sapl/templates/materia/materialegislativa_form.html index 335350406..bb435be91 100644 --- a/sapl/templates/materia/materialegislativa_form.html +++ b/sapl/templates/materia/materialegislativa_form.html @@ -22,6 +22,44 @@ } } $("#id_tipo, #id_ano").change(recuperar_numero_ano); + + function compare(a, b) { + if (a.text < b.text) + return -1; + if (a.text > b.text) + return 1; + return 0; + } + + $(document).ready(function() { + $("#id_tipo_autor").change(function() { + var tipo_selecionado = $("#id_tipo_autor").val(); + var autor_selecionado = $("#id_autor").val(); + $("#id_autor option").remove() + if (tipo_selecionado !== undefined && tipo_selecionado !== null) { + var json_data = { + tipo : tipo_selecionado, + data_relativa : $("#id_data_apresentacao").val() + } + $.getJSON("/api/autor/possiveis", json_data, function(data){ + if (data) { + var results = data.sort(compare); + if (results.length > 1) { + $("#id_autor").append(""); + } + $.each(results, function(idx, obj) { + $("#id_autor") + .append($("") + .attr("value", obj.value) + .text(obj.text)); + }); + $("#id_autor").val(autor_selecionado); + } + }); + } + }); + $("#id_tipo_autor").trigger('change'); + }); {% endblock %} From 5bf1d336ff4cd7be5fec632a7d214db3326884e3 Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Thu, 7 Jun 2018 14:37:19 -0300 Subject: [PATCH 6/9] Fix #1958 (#1972) --- sapl/norma/forms.py | 7 +++++-- sapl/sessao/forms.py | 8 +++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index affe07b87..81f487c79 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -83,16 +83,19 @@ class NormaJuridicaForm(ModelForm): label='Matéria', required=False, queryset=TipoMateriaLegislativa.objects.all(), - empty_label='Selecione' + empty_label='Selecione', + widget=forms.Select(attrs={'autocomplete': 'off'}) ) numero_materia = forms.CharField( label='Número Matéria', - required=False + required=False, + widget=forms.TextInput(attrs={'autocomplete': 'off'}) ) ano_materia = forms.ChoiceField( label='Ano Matéria', required=False, choices=ANO_CHOICES, + widget=forms.Select(attrs={'autocomplete': 'off'}) ) class Meta: diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index cd46fab84..fced15b7a 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -179,15 +179,17 @@ class ExpedienteMateriaForm(ModelForm): required=True, queryset=TipoMateriaLegislativa.objects.all(), empty_label='Selecione', - ) + widget=forms.Select(attrs={'autocomplete': 'off'})) numero_materia = forms.CharField( - label='Número Matéria', required=True) + label='Número Matéria', required=True, + widget=forms.TextInput(attrs={'autocomplete': 'off'})) ano_materia = forms.CharField( label='Ano Matéria', initial=int(data_atual.year), - required=True) + required=True, + widget=forms.TextInput(attrs={'autocomplete': 'off'})) data_ordem = forms.CharField( label='Data Sessão', From b8e3484ff53e9f7a47a170f5a4d7252b9415fbb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Sconetto?= Date: Thu, 7 Jun 2018 14:37:32 -0300 Subject: [PATCH 7/9] Fix #1939 #1958 (#1978) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix #1958 * Fix #1939 #1958 Corrige erro de inicialização em formulários Co-authored-by: edwardoliveira --- sapl/audiencia/views.py | 20 +++++++---------- sapl/materia/views.py | 46 +++++++++++++++++++++----------------- sapl/norma/views.py | 22 +++++++++--------- sapl/protocoloadm/views.py | 11 ++++----- sapl/sessao/views.py | 41 ++++++++++++++++++--------------- 5 files changed, 75 insertions(+), 65 deletions(-) diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py index c0e353139..2c16b0919 100644 --- a/sapl/audiencia/views.py +++ b/sapl/audiencia/views.py @@ -1,15 +1,10 @@ -from django.shortcuts import render from django.http import HttpResponse -from django.core.urlresolvers import reverse -from django.db.models import F from django.views.decorators.clickjacking import xframe_options_exempt -from django.views.generic import ListView -from sapl.comissoes.forms import ParticipacaoCreateForm, ParticipacaoEditForm -from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud -from sapl.materia.models import MateriaLegislativa +from django.views.generic import UpdateView +from sapl.crud.base import RP_DETAIL, RP_LIST, Crud from .forms import AudienciaForm -from .models import (AudienciaPublica, TipoAudienciaPublica) +from .models import AudienciaPublica def index(request): return HttpResponse("Audiência Pública") @@ -36,10 +31,11 @@ class AudienciaCrud(Crud): form_class = AudienciaForm def get_initial(self): - self.initial['tipo_materia'] = self.object.materia.tipo.id - self.initial['numero_materia'] = self.object.materia.numero - self.initial['ano_materia'] = self.object.materia.ano - return self.initial + initial = super(UpdateView, self).get_initial() + initial['tipo_materia'] = self.object.materia.tipo.id + initial['numero_materia'] = self.object.materia.numero + initial['ano_materia'] = self.object.materia.ano + return initial class DeleteView(Crud.DeleteView): pass diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 74f2bd6b6..807db3d9c 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -17,7 +17,7 @@ from django.shortcuts import get_object_or_404, redirect from django.template import RequestContext, loader from django.utils import formats, timezone from django.utils.translation import ugettext_lazy as _ -from django.views.generic import CreateView, ListView, TemplateView, UpdateView +from django.views.generic import FormView, ListView, TemplateView, CreateView, UpdateView from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView @@ -1013,18 +1013,19 @@ class TramitacaoCrud(MasterDetailCrud): 'pk': self.kwargs['pk']}) def get_initial(self): + initial = super(CreateView, self).get_initial() local = MateriaLegislativa.objects.get( pk=self.kwargs['pk']).tramitacao_set.order_by( '-data_tramitacao', '-id').first() if local: - self.initial['unidade_tramitacao_local' + initial['unidade_tramitacao_local' ] = local.unidade_tramitacao_destino.pk else: - self.initial['unidade_tramitacao_local'] = '' - self.initial['data_tramitacao'] = timezone.now().date() - return self.initial + initial['unidade_tramitacao_local'] = '' + initial['data_tramitacao'] = timezone.now().date() + return initial def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) @@ -1154,9 +1155,10 @@ class DocumentoAcessorioCrud(MasterDetailCrud): super(MasterDetailCrud.CreateView, self).__init__(**kwargs) def get_initial(self): - self.initial['data'] = timezone.now().date() + initial = super(CreateView, self).get_initial() + initial['data'] = timezone.now().date() - return self.initial + return initial def get_context_data(self, **kwargs): context = super( @@ -1283,10 +1285,11 @@ class LegislacaoCitadaCrud(MasterDetailCrud): form_class = LegislacaoCitadaForm def get_initial(self): - self.initial['tipo'] = self.object.norma.tipo.id - self.initial['numero'] = self.object.norma.numero - self.initial['ano'] = self.object.norma.ano - return self.initial + initial = super(UpdateView, self).get_initial() + initial['tipo'] = self.object.norma.tipo.id + initial['numero'] = self.object.norma.numero + initial['ano'] = self.object.norma.ano + return initial class DetailView(MasterDetailCrud.DetailView): @@ -1319,10 +1322,11 @@ class AnexadaCrud(MasterDetailCrud): form_class = AnexadaForm def get_initial(self): - self.initial['tipo'] = self.object.materia_anexada.tipo.id - self.initial['numero'] = self.object.materia_anexada.numero - self.initial['ano'] = self.object.materia_anexada.ano - return self.initial + initial = super(UpdateView, self).get_initial() + initial['tipo'] = self.object.materia_anexada.tipo.id + initial['numero'] = self.object.materia_anexada.numero + initial['ano'] = self.object.materia_anexada.ano + return initial class DetailView(MasterDetailCrud.DetailView): @@ -1344,16 +1348,18 @@ class MateriaAssuntoCrud(MasterDetailCrud): form_class = MateriaAssuntoForm def get_initial(self): - self.initial['materia'] = self.kwargs['pk'] - return self.initial + initial = super(CreateView, self).get_initial() + initial['materia'] = self.kwargs['pk'] + return initial class UpdateView(MasterDetailCrud.UpdateView): form_class = MateriaAssuntoForm def get_initial(self): - self.initial['materia'] = self.get_object().materia - self.initial['assunto'] = self.get_object().assunto - return self.initial + initial = super(UpdateView, self).get_initial() + initial['materia'] = self.get_object().materia + initial['assunto'] = self.get_object().assunto + return initial class MateriaLegislativaCrud(Crud): diff --git a/sapl/norma/views.py b/sapl/norma/views.py index fd5396353..650442676 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -7,7 +7,7 @@ from django.http import HttpResponse, JsonResponse from django.template import RequestContext, loader from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from django.views.generic import CreateView, ListView, TemplateView, UpdateView +from django.views.generic import TemplateView, UpdateView from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView @@ -51,11 +51,12 @@ class NormaRelacionadaCrud(MasterDetailCrud): form_class = NormaRelacionadaForm def get_initial(self): - self.initial['tipo'] = self.object.norma_relacionada.tipo.id - self.initial['numero'] = self.object.norma_relacionada.numero - self.initial['ano'] = self.object.norma_relacionada.ano - self.initial['ementa'] = self.object.norma_relacionada.ementa - return self.initial + initial = super(UpdateView, self).get_initial() + initial['tipo'] = self.object.norma_relacionada.tipo.id + initial['numero'] = self.object.norma_relacionada.numero + initial['ano'] = self.object.norma_relacionada.ano + initial['ementa'] = self.object.norma_relacionada.ementa + return initial class DetailView(MasterDetailCrud.DetailView): @@ -171,12 +172,13 @@ class NormaCrud(Crud): layout_key = 'NormaJuridicaCreate' def get_initial(self): + initial = super(UpdateView, self).get_initial() norma = NormaJuridica.objects.get(id=self.kwargs['pk']) if norma.materia: - self.initial['tipo_materia'] = norma.materia.tipo - self.initial['ano_materia'] = norma.materia.ano - self.initial['numero_materia'] = norma.materia.numero - return self.initial.copy() + initial['tipo_materia'] = norma.materia.tipo + initial['ano_materia'] = norma.materia.ano + initial['numero_materia'] = norma.materia.numero + return initial def recuperar_norma(request): diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py index 7dd7206c7..c1a2b185a 100644 --- a/sapl/protocoloadm/views.py +++ b/sapl/protocoloadm/views.py @@ -11,7 +11,7 @@ from django.http.response import HttpResponseRedirect from django.shortcuts import redirect from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from django.views.generic import CreateView, ListView +from django.views.generic import ListView, CreateView from django.views.generic.base import RedirectView, TemplateView from django.views.generic.edit import FormView from django_filters.views import FilterView @@ -610,18 +610,19 @@ class TramitacaoAdmCrud(MasterDetailCrud): form_class = TramitacaoAdmForm def get_initial(self): + initial = super(CreateView, self).get_initial() local = DocumentoAdministrativo.objects.get( pk=self.kwargs['pk']).tramitacaoadministrativo_set.order_by( '-data_tramitacao', '-id').first() if local: - self.initial['unidade_tramitacao_local' + initial['unidade_tramitacao_local' ] = local.unidade_tramitacao_destino.pk else: - self.initial['unidade_tramitacao_local'] = '' - self.initial['data_tramitacao'] = timezone.now().date() - return self.initial + initial['unidade_tramitacao_local'] = '' + initial['data_tramitacao'] = timezone.now().date() + return initial def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 8700177c0..2f5a2c73f 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -16,7 +16,7 @@ from django.utils.decorators import method_decorator from django.utils.html import strip_tags from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt -from django.views.generic import FormView, ListView, TemplateView +from django.views.generic import FormView, ListView, TemplateView, CreateView, UpdateView from django.views.generic.base import RedirectView from django.views.generic.detail import DetailView from django.views.generic.edit import FormMixin @@ -418,14 +418,15 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): form_class = OrdemDiaForm def get_initial(self): - self.initial['data_ordem'] = SessaoPlenaria.objects.get( + initial = super(CreateView, self).get_inital() + initial['data_ordem'] = SessaoPlenaria.objects.get( pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = OrdemDia.objects.filter( sessao_plenaria=self.kwargs['pk']).aggregate( Max('numero_ordem'))['numero_ordem__max'] - self.initial['numero_ordem'] = ( + initial['numero_ordem'] = ( max_numero_ordem if max_numero_ordem else 0) + 1 - return self.initial + return initial def get_success_url(self): return reverse('sapl.sessao:ordemdia_list', @@ -435,10 +436,11 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): form_class = OrdemDiaForm def get_initial(self): - self.initial['tipo_materia'] = self.object.materia.tipo.id - self.initial['numero_materia'] = self.object.materia.numero - self.initial['ano_materia'] = self.object.materia.ano - return self.initial + initial = super(UpdateView, self).get_initial() + initial['tipo_materia'] = self.object.materia.tipo.id + initial['numero_materia'] = self.object.materia.numero + initial['ano_materia'] = self.object.materia.ano + return initial class DetailView(MasterDetailCrud.DetailView): @@ -492,14 +494,15 @@ class ExpedienteMateriaCrud(MasterDetailCrud): form_class = ExpedienteMateriaForm def get_initial(self): - self.initial['data_ordem'] = SessaoPlenaria.objects.get( + initial = super(CreateView, self).get_initial() + initial['data_ordem'] = SessaoPlenaria.objects.get( pk=self.kwargs['pk']).data_inicio.strftime('%d/%m/%Y') max_numero_ordem = ExpedienteMateria.objects.filter( sessao_plenaria=self.kwargs['pk']).aggregate( Max('numero_ordem'))['numero_ordem__max'] - self.initial['numero_ordem'] = ( + initial['numero_ordem'] = ( max_numero_ordem if max_numero_ordem else 0) + 1 - return self.initial + return initial def get_success_url(self): return reverse('sapl.sessao:expedientemateria_list', @@ -509,10 +512,11 @@ class ExpedienteMateriaCrud(MasterDetailCrud): form_class = ExpedienteMateriaForm def get_initial(self): - self.initial['tipo_materia'] = self.object.materia.tipo.id - self.initial['numero_materia'] = self.object.materia.numero - self.initial['ano_materia'] = self.object.materia.ano - return self.initial + initial = super(UpdateView, self).get_initial() + initial['tipo_materia'] = self.object.materia.tipo.id + initial['numero_materia'] = self.object.materia.numero + initial['ano_materia'] = self.object.materia.ano + return initial class DetailView(MasterDetailCrud.DetailView): @@ -1146,9 +1150,10 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): return reverse('sapl.base:sistema') def get_initial(self): + initial = super(ResumoOrdenacaoView, self).get_initial() ordenacao = ResumoOrdenacao.objects.first() if ordenacao: - return {'primeiro': ordenacao.primeiro, + initial.update({'primeiro': ordenacao.primeiro, 'segundo': ordenacao.segundo, 'terceiro': ordenacao.terceiro, 'quarto': ordenacao.quarto, @@ -1157,8 +1162,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): 'setimo': ordenacao.setimo, 'oitavo': ordenacao.oitavo, 'nono': ordenacao.nono, - 'decimo': ordenacao.decimo} - return self.initial.copy() + 'decimo': ordenacao.decimo}) + return initial def form_valid(self, form): ordenacao = ResumoOrdenacao.objects.get_or_create()[0] From 8694a92a9d2482a818a4a48f4dbb2df1a452d189 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 7 Jun 2018 14:44:51 -0300 Subject: [PATCH 8/9] Release: 3.1.83 --- docker-compose.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8bc3df3e3..4439e1cf3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.82 + image: interlegis/sapl:3.1.83 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/setup.py b/setup.py index 0ce5a9de3..0fa8e63ec 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.82', + version='3.1.83', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 034c08491fbadedd30f34972c2c219bbeae574b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Sconetto?= Date: Thu, 7 Jun 2018 15:46:14 -0300 Subject: [PATCH 9/9] Fix #1964 (#1979) --- sapl/norma/forms.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 81f487c79..2574edb20 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -125,7 +125,11 @@ class NormaJuridicaForm(ModelForm): if not self.is_valid(): return cleaned_data - + norma = NormaJuridica.objects.filter(ano=cleaned_data['ano'], + numero=cleaned_data['numero'], + tipo=cleaned_data['tipo']).exists() + if norma: + raise ValidationError("Já existe uma norma de mesmo Tipo, Ano e Número no sistema") if (cleaned_data['tipo_materia'] and cleaned_data['numero_materia'] and cleaned_data['ano_materia']):