diff --git a/docker-compose.yml b/docker-compose.yml index 4439e1cf3..f3ca2cef8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.83 + image: interlegis/sapl:3.1.87 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/gunicorn_start.sh b/gunicorn_start.sh index 6b5c98676..6247a0b27 100755 --- a/gunicorn_start.sh +++ b/gunicorn_start.sh @@ -16,8 +16,9 @@ DJANGODIR=/var/interlegis/sapl/ # Django project directory (* SOCKFILE=/var/interlegis/sapl/run/gunicorn.sock # we will communicate using this unix socket (*) USER=`whoami` # the user to run as (*) GROUP=`whoami` # the group to run as (*) -NUM_WORKERS=9 # how many worker processes should Gunicorn spawn (*) +NUM_WORKERS=4 # how many worker processes should Gunicorn spawn (*) # NUM_WORKERS = 2 * CPUS + 1 +MAX_REQUESTS=100 # number of requests before restarting worker DJANGO_SETTINGS_MODULE=sapl.settings # which settings file should Django use (*) DJANGO_WSGI_MODULE=sapl.wsgi # WSGI module name (*) @@ -41,6 +42,7 @@ test -d $RUNDIR || mkdir -p $RUNDIR exec gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $NUM_WORKERS \ + --max-requests $MAX_REQUESTS \ --user $USER \ --access-logfile - \ --error-logfile - \ diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 5410ee3fe..8114a0137 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -528,7 +528,8 @@ class RelatorioAtasFilterSet(django_filters.FilterSet): @property def qs(self): parent = super(RelatorioAtasFilterSet, self).qs - return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero') + return parent.distinct().prefetch_related('tipo').exclude( + upload_ata='').order_by('-legislatura', 'tipo', 'numero') def __init__(self, *args, **kwargs): super(RelatorioAtasFilterSet, self).__init__( @@ -729,6 +730,11 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput()) + @property + def qs(self): + parent = super(RelatorioMateriasPorAutorFilterSet, self).qs + return parent.distinct().order_by('-ano', '-numero') + class Meta: model = MateriaLegislativa fields = ['tipo', 'data_apresentacao'] diff --git a/sapl/base/views.py b/sapl/base/views.py index f0e7d2e1b..238252245 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -247,7 +247,6 @@ class RelatorioAtasView(FilterView): if not self.filterset.form.is_valid(): return context - context['object_list'] = context['object_list'].exclude(upload_ata='') qr = self.request.GET.copy() context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index bbfdd3536..d14fad28c 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -182,9 +182,9 @@ class MateriaLegislativaForm(ModelForm): if self.instance and self.instance.pk: self.fields['tipo_autor'] = forms.CharField(required=False, - widget=forms.TextInput(attrs={'disabled': 'disabled'})) + widget=forms.HiddenInput()) self.fields['autor'] = forms.CharField(required=False, - widget=forms.TextInput(attrs={'disabled': 'disabled'})) + widget=forms.HiddenInput()) def clean(self): super(MateriaLegislativaForm, self).clean() diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 2574edb20..5e0eb99ff 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -125,11 +125,13 @@ 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 not self.instance: + 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']): diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index fced15b7a..06dd40830 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -465,7 +465,6 @@ class OradorExpedienteForm(ModelForm): def __init__(self, *args, **kwargs): super(OradorExpedienteForm, self).__init__(*args, **kwargs) - legislatura_vigente = SessaoPlenaria.objects.get(pk=kwargs['initial']['id_sessao']).legislatura if legislatura_vigente: @@ -482,11 +481,13 @@ class OradorExpedienteForm(ModelForm): return self.cleaned_data sessao_id = self.initial['id_sessao'] + numero = self.initial.get('numero') # Retorna None se inexistente ordem = OradorExpediente.objects.filter( sessao_plenaria_id=sessao_id, numero_ordem=cleaned_data['numero_ordem'] ).exists() - if ordem: + + if ordem and (cleaned_data['numero_ordem'] != numero): raise ValidationError(_( 'Já existe orador nesta posição da ordem de pronunciamento')) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 9ebbbdc57..e2df1d7cc 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -332,6 +332,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): resultado_descricao, resultado_observacao)) else: + if obj.tipo_votacao == 2: if is_expediente: url = reverse( @@ -354,12 +355,8 @@ def customize_link_materia(context, pk, has_permission, is_expediente): (url, resultado_descricao, resultado_observacao)) - else: - resultado = ('%s
%s' % - (resultado_descricao, - resultado_observacao)) - if obj.tipo_votacao == 1: + elif obj.tipo_votacao == 1: if is_expediente: url = reverse( 'sapl.sessao:votacao_simbolica_transparencia', @@ -378,9 +375,9 @@ def customize_link_materia(context, pk, has_permission, is_expediente): '?&materia=ordem' resultado = ('%s
%s
' % - (url, - resultado_descricao, - resultado_observacao)) + (url, + resultado_descricao, + resultado_observacao)) else: resultado = ('%s
%s' % (resultado_descricao, @@ -388,7 +385,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): context['rows'][i][3] = (resultado, None) return context - + def get_presencas_generic(model, sessao, legislatura): presencas = model.objects.filter( sessao_plenaria=sessao) @@ -421,15 +418,14 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): form_class = OrdemDiaForm def get_initial(self): - initial = super(CreateView, self).get_inital() - initial['data_ordem'] = SessaoPlenaria.objects.get( + self.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'] - initial['numero_ordem'] = ( + self.initial['numero_ordem'] = ( max_numero_ordem if max_numero_ordem else 0) + 1 - return initial + return self.initial def get_success_url(self): return reverse('sapl.sessao:ordemdia_list', @@ -551,6 +547,14 @@ class OradorExpedienteCrud(OradorCrud): kwargs={'pk': self.kwargs['pk']}) + class UpdateView(MasterDetailCrud.UpdateView): + form_class = OradorExpedienteForm + + def get_initial(self): + return {'id_sessao': self.object.sessao_plenaria.id, + 'numero': self.object.numero_ordem} + + class OradorCrud(OradorCrud): model = Orador diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 621689ffe..3ba84b141 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -57,7 +57,7 @@
- +

@@ -290,9 +290,15 @@ $('#oradores_list').append( '
A listagem de oradores só aparecerá quando o painel estiver aberto.
') oradores.append(''); + + votacao.append(''); + $("#votacao").append('
A votação só aparecerá quando o painel estiver aberto
'); + votacao.append('
'); + + } - if (data['materia_legislativa_texto']){ + if (data['materia_legislativa_texto'] && data["status_painel"] == true){ var votacao = $("#votacao") @@ -366,16 +372,21 @@ } if (data['materia_legislativa_texto']){ - $("#materia_legislativa_texto").text(data["materia_legislativa_texto"]); + if (data["status_painel"] == true){ + $("#materia_legislativa_texto").text(data["materia_legislativa_texto"]); + } + else{ + $("#materia_legislativa_texto").text('A Matéria em votação só aparecerá quando o painel estiver aberto'); + } } else{ $("#materia_legislativa_texto").text('Não há nehuma matéria votada ou para votação'); } - if (data['observacao_materia']){ + if (data['observacao_materia'] && data["status_painel"] == true){ var texto = data['observacao_materia']; if(texto.length > 151) { - $("#observacao_materia").text(texto.substr(0, 145).concat('(...)')); + $("#observacao_materia").text(texto.substr(0, 145).concat('(...)')); } else{ $("#observacao_materia").text(texto); diff --git a/setup.py b/setup.py index 0fa8e63ec..e25cde8b6 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.83', + version='3.1.87', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',