diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index 931db7cfd..9afbe3201 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -1392,7 +1392,7 @@ class TextEditView(CompMixin, TemplateView):
return r
def nota_alteracao(self, dispositivo, lista_ta_publicado):
- if dispositivo.ta_publicado_id:
+ if dispositivo.ta_publicado_id and dispositivo.dispositivo_atualizador:
d = dispositivo.dispositivo_atualizador.dispositivo_pai
if d.auto_inserido:
diff --git a/sapl/endpoint_restriction_middleware.py b/sapl/endpoint_restriction_middleware.py
new file mode 100644
index 000000000..b815b4a2e
--- /dev/null
+++ b/sapl/endpoint_restriction_middleware.py
@@ -0,0 +1,38 @@
+from django.http import HttpResponseForbidden
+import logging
+
+# lista de IPs permitidos (localhost, redes locais, etc)
+# https://en.wikipedia.org/wiki/Reserved_IP_addresses
+ALLOWED_IPS = [
+ '127.0.0.1',
+ '::1',
+ '10.0.0.0/8',
+ '172.16.0.0/12',
+ '192.168.0.0/16',
+ 'fc00::/7',
+ '::1',
+ 'fe80::/10',
+ '192.0.2.0/24',
+ '2001:db8::/32',
+ '224.0.0.0/4',
+ 'ff00::/8'
+]
+
+RESTRICTED_ENDPOINTS = ['/metrics']
+
+
+class EndpointRestrictionMiddleware:
+ logging.getLogger(__name__)
+
+ def __init__(self, get_response):
+ self.get_response = get_response
+
+ def __call__(self, request):
+ # IP do cliente
+ client_ip = request.META.get('REMOTE_ADDR')
+
+ # bloqueia acesso a endpoints restritos para IPs nao permitidos
+ if request.path in RESTRICTED_ENDPOINTS and client_ip not in ALLOWED_IPS:
+ return HttpResponseForbidden('Acesso proibido')
+
+ return self.get_response(request)
diff --git a/sapl/relatorios/forms.py b/sapl/relatorios/forms.py
index 8ac7eca02..59eb2d741 100644
--- a/sapl/relatorios/forms.py
+++ b/sapl/relatorios/forms.py
@@ -305,6 +305,10 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
materia__ano = django_filters.ChoiceFilter(required=False,
label='Ano da Matéria',
choices=choice_anos_com_materias)
+ # materia__autores = django_filters.CharFilter(widget=forms.HiddenInput())
+ materia__autores = django_filters.ModelChoiceFilter(
+ label='Autor da Matéria',
+ queryset=Autor.objects.all(), field_name='materia__autores')
@property
def qs(self):
@@ -317,7 +321,8 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
'tramitacao__unidade_tramitacao_local',
'tramitacao__unidade_tramitacao_destino',
'tramitacao__status',
- 'tramitacao__data_fim_prazo']
+ 'tramitacao__data_fim_prazo',
+ 'materia__autores']
def __init__(self, *args, **kwargs):
super(RelatorioDataFimPrazoTramitacaoFilterSet, self).__init__(
@@ -328,6 +333,7 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
'tramitacao__unidade_tramitacao_local'].label = 'Unidade Local (Origem)'
self.filters['tramitacao__unidade_tramitacao_destino'].label = 'Unidade Destino'
self.filters['tramitacao__status'].label = 'Status de tramitação'
+ self.filters['materia__autores'].label = 'Autor da Matéria'
row1 = to_row([('materia__ano', 12)])
row2 = to_row([('tramitacao__data_fim_prazo', 12)])
@@ -336,6 +342,7 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
row4 = to_row(
[('materia__tipo', 6),
('tramitacao__status', 6)])
+ row5 = to_row([('materia__autores', 12)])
buttons = FormActions(
*[
@@ -355,7 +362,7 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Tramitações'),
- row1, row2, row3, row4,
+ row1, row2, row3, row4, row5,
buttons, )
)
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index ccc88b86c..98cc47442 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -2171,6 +2171,12 @@ class RelatorioDataFimPrazoTramitacaoView(RelatorioMixin, FilterView):
else:
context['tipo'] = ''
+ if self.request.GET['materia__autores']:
+ autor = int(self.request.GET['materia__autores'])
+ context['materia__autor'] = (str(Autor.objects.get(id=autor)))
+ else:
+ context['materia__autor'] = ''
+
if self.request.GET['tramitacao__status']:
tramitacao_status = self.request.GET['tramitacao__status']
context['tramitacao__status'] = (
@@ -2630,6 +2636,7 @@ class RelatorioNormasVigenciaView(RelatorioMixin, FilterView):
return context
+
class RelatorioHistoricoTramitacaoAdmView(RelatorioMixin, FilterView):
model = DocumentoAdministrativo
filterset_class = RelatorioHistoricoTramitacaoAdmFilterSet
diff --git a/sapl/settings.py b/sapl/settings.py
index c23acd084..ba143ca12 100644
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -129,6 +129,7 @@ MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
+ 'sapl.endpoint_restriction_middleware.EndpointRestrictionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
diff --git a/sapl/templates/relatorios/RelatorioDataFimPrazoTramitacao_filter.html b/sapl/templates/relatorios/RelatorioDataFimPrazoTramitacao_filter.html
index 953169f7c..017399252 100644
--- a/sapl/templates/relatorios/RelatorioDataFimPrazoTramitacao_filter.html
+++ b/sapl/templates/relatorios/RelatorioDataFimPrazoTramitacao_filter.html
@@ -17,7 +17,8 @@
Tipo de matéria: {{ tipo }}
Status de tramitação: {{ tramitacao__status }}
Local de origem: {{ tramitacao__unidade_tramitacao_local }}
- Local de destino: {{ tramitacao__unidade_tramitacao_destino }}
+ Local de destino: {{ tramitacao__unidade_tramitacao_destino }}
+ Autor: {{ materia__autor }}
{% if object_list %}
{% if object_list|length == 1 %}