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 @@