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 %}

Foi encontrada 1 matéria com esses parâmetros.



diff --git a/sapl/templates/relatorios/relatorio_fim_prazo_tramitacao.html b/sapl/templates/relatorios/relatorio_fim_prazo_tramitacao.html index da4172b0b..3bee7c7a6 100644 --- a/sapl/templates/relatorios/relatorio_fim_prazo_tramitacao.html +++ b/sapl/templates/relatorios/relatorio_fim_prazo_tramitacao.html @@ -11,7 +11,8 @@  Tipo de matéria: {{ tipo }}
 Status atual: {{ 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 %}

Foi encontrada 1 matéria com esses parâmetros.