From ed9734985d4f2b260f0d363c362e844cfde3dd37 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Sun, 23 Jul 2023 21:26:32 -0700 Subject: [PATCH] =?UTF-8?q?Adiciona=20controle=20de=20visibilidade=20no=20?= =?UTF-8?q?m=C3=B3dulo=20de=20relatorios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/templatetags/common_tags.py | 8 +- sapl/relatorios/urls.py | 2 +- sapl/relatorios/views.py | 6 + .../templates/relatorios/relatorios_list.html | 179 +++++++++++------- sapl/utils.py | 74 ++++++++ 5 files changed, 201 insertions(+), 68 deletions(-) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index ade7ceef7..7cd751d1d 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -11,8 +11,7 @@ from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposic from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import Filiacao from sapl.sessao.models import SessaoPlenaria -from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO - +from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO, is_report_allowed register = template.Library() @@ -405,3 +404,8 @@ def dont_break_out(value): @register.filter(expects_localtime=True) def parse_datetime(value): return django_parse_datetime(value) + + +@register.filter +def is_report_visible(request, url_path=None): + return is_report_allowed(request, url_path) \ No newline at end of file diff --git a/sapl/relatorios/urls.py b/sapl/relatorios/urls.py index e16e44162..b27bfc55a 100644 --- a/sapl/relatorios/urls.py +++ b/sapl/relatorios/urls.py @@ -97,4 +97,4 @@ urlpatterns = [ name='relatorio_documentos_acessorios'), url(r'^sistema/relatorios/normas-por-autor$', RelatorioNormasPorAutorView.as_view(), name='normas_por_autor'), -] +] \ No newline at end of file diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index a0c8addd6..ccc88b86c 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1760,9 +1760,15 @@ class RelatoriosListView(TemplateView): class RelatorioMixin: + # TODO: verificar se todos os relatorios de sistema/relatorios extendem esse Mixin def get(self, request, *args, **kwargs): super(RelatorioMixin, self).get(request) + # TODO: import as global + from sapl.utils import is_report_allowed + if not is_report_allowed(request): + raise Http404() + is_relatorio = request.GET.get('relatorio') context = self.get_context_data(filter=self.filterset) diff --git a/sapl/templates/relatorios/relatorios_list.html b/sapl/templates/relatorios/relatorios_list.html index 5f77a5e6a..38346fa21 100644 --- a/sapl/templates/relatorios/relatorios_list.html +++ b/sapl/templates/relatorios/relatorios_list.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load common_tags %} {% load i18n crispy_forms_tags %} {% block base_content %} @@ -12,72 +13,120 @@ - - Matérias em tramitação - Matérias Legislativas por Ano, Tipo, Local atual e Status da Tramitação informados. - - - Matérias por Autor - Listagem e totalização de matérias por autor, com filtros para tipo e período. - - - Matérias por Ano, Autor e Tipo - Totalização anual de matérias agrupadas por autor e tipo. - - - Matérias por Ano, Assunto - Totalização de matérias agrupadas por ano e assunto. - - - Presença nas sessões - Presença dos parlamentares nas sessões plenárias. - - - Atas - Atas de Sessão Plenária. - - - Histórico de tramitações de Matérias - Histórico de tramitações por período e local informados. - - - Matérias por prazos de Tramitação - Relatório de tramitações em intervalo de data de fim de prazo. - - - Reunião de Comissão - Reunião de Comissão por data. - - - Audiência Pública - Audiência Pública com o tipo. - - - Normas por mês - Normas publicadas por mês. - - - Normas por vigência - Normas vigentes ou não vigentes. - - - Histórico de tramitações de documentos - Histórico de tramitações de documentos por período e local informados. - + {% url 'sapl.relatorios:materia_por_tramitacao' as materia_por_tramitacao %} + {% if request|is_report_visible:materia_por_tramitacao %} + + Matérias em tramitação + Matérias Legislativas por Ano, Tipo, Local atual e Status da Tramitação informados. + + {% endif %} + {% url 'sapl.relatorios:materia_por_autor' as materia_por_autor %} + {% if request|is_report_visible:materia_por_autor %} + + Matérias por Autor + Listagem e totalização de matérias por autor, com filtros para tipo e período. + + {% endif %} + {% url 'sapl.relatorios:materia_por_ano_autor_tipo' as materia_por_ano_autor_tipo %} + {% if request|is_report_visible:materia_por_ano_autor_tipo %} + + Matérias por Ano, Autor e Tipo + Totalização anual de matérias agrupadas por autor e tipo. + + {% endif %} + {% url 'sapl.relatorios:materia_por_ano_assunto' as materia_por_ano_assunto %} + {% if request|is_report_visible:materia_por_ano_assunto %} + + Matérias por Ano, Assunto + Totalização de matérias agrupadas por ano e assunto. + + {% endif %} + {% url 'sapl.relatorios:presenca_sessao' as presenca_sessao %} + {% if request|is_report_visible:presenca_sessao %} + + Presença nas sessões + Presença dos parlamentares nas sessões plenárias. + + {% endif %} + {% url 'sapl.relatorios:atas' as atas %} + {% if request|is_report_visible:atas %} + + Atas + Atas de Sessão Plenária. + + {% endif %} + {% url 'sapl.relatorios:historico_tramitacoes' as historico_tramitacoes %} + {% if request|is_report_visible:historico_tramitacoes %} + + Histórico de tramitações de Matérias + Histórico de tramitações por período e local informados. + + {% endif %} + {% url 'sapl.relatorios:data_fim_prazo_tramitacoes' as data_fim_prazo_tramitacoes %} + {% if request|is_report_visible:data_fim_prazo_tramitacoes %} + + Matérias por prazos de Tramitação + Relatório de tramitações em intervalo de data de fim de prazo. + + {% endif %} + {% url 'sapl.relatorios:reuniao' as reuniao %} + {% if request|is_report_visible:reuniao %} + + Reunião de Comissão + Reunião de Comissão por data. + + {% endif %} + {% url 'sapl.relatorios:audiencia' as audiencia %} + {% if request|is_report_visible:audiencia %} + + Audiência Pública + Audiência Pública com o tipo. + + {% endif %} + {% url 'sapl.relatorios:normas_por_mes' as normas_por_mes %} + {% if request|is_report_visible:normas_por_mes %} + + Normas por mês + Normas publicadas por mês. + + {% endif %} + {% url 'sapl.relatorios:normas_por_vigencia' as normas_por_vigencia %} + {% if request|is_report_visible:normas_por_vigencia %} + + Normas por vigência + Normas vigentes ou não vigentes. + + {% endif %} + {% url 'sapl.relatorios:historico_tramitacoes_adm' as historico_tramitacoes_adm %} + {% if request|is_report_visible:historico_tramitacoes_adm %} + + Histórico de tramitações de documentos + Histórico de tramitações de documentos por período e local informados. + + {% endif %} {% if estatisticas_acesso_normas %} - - Estatísticas de acesso de Normas - Normas por acesso. - - {% endif %} - - Documentos Acessórios de Matérias Legislativas - Documentos Acessórios por tipo, período e tipo da Matéria Legislativa associada. - - - Normas Por Autor - Listagem e totalização de normas por autor, com filtros para tipo e período. - + {% url 'sapl.relatorios:estatisticas_acesso' as estatisticas_acesso %} + {% if request|is_report_visible:estatisticas_acesso %} + + Estatísticas de acesso de Normas + Normas por acesso. + + {% endif %} + {% endif %} + {% url 'sapl.relatorios:relatorio_documentos_acessorios' as relatorio_documentos_acessorios %} + {% if request|is_report_visible:relatorio_documentos_acessorios %} + + Documentos Acessórios de Matérias Legislativas + Documentos Acessórios por tipo, período e tipo da Matéria Legislativa associada. + + {% endif %} + {% url 'sapl.relatorios:normas_por_autor' as normas_por_autor %} + {% if request|is_report_visible:normas_por_autor %} + + Normas Por Autor + Listagem e totalização de normas por autor, com filtros para tipo e período. + + {% endif %} diff --git a/sapl/utils.py b/sapl/utils.py index 0770b4e15..da40ac102 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1216,3 +1216,77 @@ class GoogleRecapthaMixin: _('Ocorreu um erro na validação do reCAPTCHA.')) return cd + + +# TODO: cache this map and invalidate on each update +def get_report_urls_map(): + from django.urls import get_resolver + from django.urls.base import reverse + + # TODO: avoid URLs with params now, but need to incorporate in the future + SKIPLIST = ['relatorio_sessao_plenaria', + 'relatorio_etiqueta_protocolo', + 'resumo_ata_pdf', + 'resumo_ata_pdf', + 'relatorio_sessao_plenaria_pdf', + 'etiqueta_materia_legislativa', + 'relatorio_materia_tramitacao'] + + NAMESPACE = 'sapl.relatorios:' + URL_PATTERN = 'sapl.relatorios.urls' + + url_map = {} + for url in get_resolver(URL_PATTERN).url_patterns: + if url.name in SKIPLIST: + continue + dst_url = reverse(f"{NAMESPACE}{url.name}") + url_map[dst_url] = {"name": url.name, + "public": True, + "internal": True} #TODO: get permissions from AppConfig and fine grained permissions + return url_map + + +def is_report_allowed(request, url_path=None): + from sapl.utils import get_report_urls_map # TODO: import global + url_map = get_report_urls_map() # TODO: cache this!!! Globally + + path = url_path if url_path else request.path + authenticated = True if request.user.is_authenticated else False + + if path in url_map.keys(): + path_metadata = url_map[path] + if not authenticated and path_metadata['public']: + return True + elif authenticated and path_metadata['internal']: + return True + else: + return False + # default + return True + + +def get_path_to_name_report_map(): + return {'/relatorios/materia': '', + '/relatorios/capa-processo': '', + '/relatorios/ordem-dia': '', + '/relatorios/relatorio-documento-administrativo': '', + '/relatorios/espelho': '', + '/relatorios/protocolo': '', + '/sistema/relatorios/': '', + '/sistema/relatorios/materia-por-autor': 'Matérias por Autor', + '/sistema/relatorios/relatorio-por-mes': 'Normas por mês', + '/sistema/relatorios/relatorio-por-vigencia': 'Normas por vigência', + '/sistema/relatorios/estatisticas-acesso': '', + '/sistema/relatorios/materia-por-ano-autor-tipo': 'Matérias por Ano, Autor e Tipo', + '/sistema/relatorios/materia-por-tramitacao': 'Matérias em tramitação', + '/sistema/relatorios/materia-por-assunto': 'Matérias por Ano, Assunto', + '/sistema/relatorios/historico-tramitacoes': 'Histórico de tramitações de Matérias', + '/sistema/relatorios/data-fim-prazo-tramitacoes': 'Matérias por prazos de Tramitação', + '/sistema/relatorios/presenca': 'Presença nas sessões', + '/sistema/relatorios/atas': 'Atas', + '/sistema/relatorios/reuniao': 'Reunião de Comissão', + '/sistema/relatorios/audiencia': 'Audiência Pública', + '/sistema/relatorios/historico-tramitacoesadm': 'Histórico de tramitações de documentos', + '/sistema/relatorios/documentos_acessorios': 'Documentos Acessórios de Matérias Legislativas', + '/sistema/relatorios/normas-por-autor': 'Normas Por Autor' + } \ No newline at end of file