From ec3217908f481bc0d0319625fe384a055af314b8 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 3 Oct 2016 09:23:30 -0300 Subject: [PATCH 01/33] =?UTF-8?q?Remove=20pagina=C3=A7=C3=A3o=20na=20tela?= =?UTF-8?q?=20de=20pesquisa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../materia/materialegislativa_filter.html | 80 +++++++++---------- 1 file changed, 36 insertions(+), 44 deletions(-) diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index d072d19d5..9811394b9 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -18,56 +18,48 @@ {% block sections_nav %} {% endblock %} -{% block detail_content %} +{% block base_content %} {% if not filter_url %} {% crispy filter.form %} {% endif %} -

{% if filter_url %} - - - - - {% if paginator.count %} - {% if paginator.count > 1 %} -

{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

- {% elif paginator.count == 1 %} -

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

- {% endif %} - - {% for m in page_obj %} - - - {% endfor %} - {% else %} - - +

{% trans "Resultados" %}

- {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
- Autores: - {% for a in m.autoria_set.all %} - {% if not forloop.first %} - ,    {{a.autor|default_if_none:"Não Informado"}} - {% else %} -  {{a.autor|default_if_none:"Não Informado"}} - {% endif %} - {% endfor %} -
- Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
- Status:  {{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}
- Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}
- Ementa: {{ m.ementa|safe }}
-

-
-

Nenhuma matéria encontrada com essas especificações

-
+ + + + {% if paginator.count %} + {% if paginator.count > 1 %} +

{% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

+ {% elif paginator.count == 1 %} +

{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

{% endif %} + {% for m in page_obj %} + + + {% endfor %} + {% else %} + + {% endif %}

{% trans "Resultados" %}

+ {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
+ Autores: + {% for a in m.autoria_set.all %} + {% if not forloop.first %} + ,    {{a.autor|default_if_none:"Não Informado"}} + {% else %} +  {{a.autor|default_if_none:"Não Informado"}} + {% endif %} + {% endfor %} +
+ Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
+ Status:  {{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}
+ Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}
+ Ementa: {{ m.ementa|safe }}
+

+

Nenhuma matéria encontrada com essas especificações

- - -{% include "paginacao.html" %} -{% endif %} - -{% endblock detail_content %} + {% include "paginacao.html" %} + {% endif %} +{% endblock base_content %} From 3cd6f53880758251186ead1ffb33753baf76b19c Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 09:37:20 -0300 Subject: [PATCH 02/33] =?UTF-8?q?Addiciona=20checagem=20de=20permiss=C3=A3?= =?UTF-8?q?o=20nos=20menus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/templatetags/menus.py | 73 +++++++++-------- .../menus/mesa_diretora/mesa_diretora.html | 82 ------------------- sapl/templates/menus/subnav.html | 8 +- sapl/templates/parlamentares/subnav.yaml | 1 + 4 files changed, 45 insertions(+), 119 deletions(-) delete mode 100644 sapl/templates/menus/mesa_diretora/mesa_diretora.html diff --git a/sapl/base/templatetags/menus.py b/sapl/base/templatetags/menus.py index d5a398faf..56a301a6a 100644 --- a/sapl/base/templatetags/menus.py +++ b/sapl/base/templatetags/menus.py @@ -1,6 +1,7 @@ -import yaml from django import template from django.core.urlresolvers import reverse +import yaml + register = template.Library() @@ -14,6 +15,12 @@ def subnav(context, path=None): 1) Se a variável path não é nula; 2) Se existe no contexto a chave subnav_template_name; 3) o path default: /subnav.yaml + + Os campos esperados nos arquivos yaml são: + title + url + check_permission - opcional. quando usado + será realizado o teste de permissão para renderizá-lo. """ menu = None root_pk = context.get('root_pk', None) @@ -76,40 +83,36 @@ def resolve_urls_inplace(menu, pk, rm, context): else: if 'url' in menu: url_name = menu['url'] - menu['url'] = reverse('%s:%s' % (rm.app_name, menu['url']), - kwargs={'pk': pk}) - menu['active'] = 'active'\ - if context['request'].path == menu['url'] else '' - - if not menu['active']: - """ - Se não encontrada diretamente, - procura a url acionada dentro do crud, caso seja um. - Serve para manter o active no suvnav correto ao acionar - as funcionalidades diretas do MasterDetailCrud, como: - - visualização de detalhes, adição, edição, remoção. - - Casos para urls_extras: - Em relações de segundo nível, como ocorre em - (0) Comissões -> (1) Composição -> (2) Participação - - (2) não tem ligação direta com (1) através da view. Para (2) - ser localizado, e o nav-tabs ou nav-pills do front-end serem - ativados foi inserido o teste de existência de urls_extras - para serem testadas e, sendo válidado, o active do front-end - seja devidamente colocado. - """ - - view = context['view'] - if hasattr(view, '__class__') and\ - hasattr(view.__class__, 'crud'): - urls = view.__class__.crud.get_urls() - for u in urls: - if (u.name == url_name or - 'urls_extras' in menu and - u.name in menu['urls_extras']): - menu['active'] = 'active' - break + + if 'check_permission' in menu and not context[ + 'request'].user.has_perm(menu['check_permission']): + menu['url'] = '' + menu['active'] = '' + else: + menu['url'] = reverse( + '%s:%s' % (rm.app_name, menu['url']), kwargs={'pk': pk}) + menu['active'] = 'active'\ + if context['request'].path == menu['url'] else '' + + if not menu['active']: + """ + Se não encontrada diretamente, + procura a url acionada dentro do crud, caso seja um. + Serve para manter o active no suvnav correto ao acionar + as funcionalidades diretas do MasterDetailCrud, como: + - visualização de detalhes, adição, edição, remoção. + """ + + view = context['view'] + if hasattr(view, '__class__') and\ + hasattr(view.__class__, 'crud'): + urls = view.__class__.crud.get_urls() + for u in urls: + if (u.name == url_name or + 'urls_extras' in menu and + u.name in menu['urls_extras']): + menu['active'] = 'active' + break if 'children' in menu: menu['active'] = resolve_urls_inplace( diff --git a/sapl/templates/menus/mesa_diretora/mesa_diretora.html b/sapl/templates/menus/mesa_diretora/mesa_diretora.html deleted file mode 100644 index 982b80407..000000000 --- a/sapl/templates/menus/mesa_diretora/mesa_diretora.html +++ /dev/null @@ -1,82 +0,0 @@ -{% extends "crud/detail.html" %} -{% load i18n %} -{% block actions %} {% endblock %} - -{% block detail_content %} -
- {% csrf_token %} -
- Escolha da Legislatura e da Sessão Legislativa -
-
- - -
-
- - -
-
-
-
-
- Escolha da Composição da Mesa Diretora -
-
- - -
- -
-

- {% if cargos_vagos %} - {% if perms.parlamentares.add_cargomesa or perms.parlamentares.add_composicaomesa %} - - {% endif %} - {% endif %} -
-
- {% if perms.parlamentares.add_cargomesa or perms.parlamentares.add_composicaomesa %} - - {% endif %} -
- - {% if cargos_vagos %} -
- - -
- -
- {% endif %} - -
-
-
-{% endblock detail_content %} diff --git a/sapl/templates/menus/subnav.html b/sapl/templates/menus/subnav.html index 7a029ab10..580d4160c 100644 --- a/sapl/templates/menus/subnav.html +++ b/sapl/templates/menus/subnav.html @@ -12,12 +12,16 @@ {% else %} -
  • {% trans item.title %}
  • + {% if item.url %} +
  • {% trans item.title %}
  • + {% endif %} {% endif %} {% endfor %} diff --git a/sapl/templates/parlamentares/subnav.yaml b/sapl/templates/parlamentares/subnav.yaml index 8d9c4e65b..6979811f9 100644 --- a/sapl/templates/parlamentares/subnav.yaml +++ b/sapl/templates/parlamentares/subnav.yaml @@ -7,6 +7,7 @@ url: filiacao_list - title: {% trans 'Dependentes' %} url: dependente_list + check_permission: parlamentares.list_dependente - title: {% trans 'Comissões' %} url: participacao_parlamentar_list - title: {% trans 'Proposições' %} From 691bc59558dd93eeb07e40e33a2a2ce7f557b8d7 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 10:00:01 -0300 Subject: [PATCH 03/33] =?UTF-8?q?Torna=20p=C3=BAblic=20a=20listagem=20de?= =?UTF-8?q?=20mat=C3=A9rias=20da=20ordem=20do=20dia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index daff34b99..f30e78e92 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -43,8 +43,8 @@ from .models import (Bancada, Bloco, CargoBancada, CargoMesa, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) -OrdemDiaCrud = Crud.build(OrdemDia, '') -RegistroVotacaoCrud = Crud.build(RegistroVotacao, '') +#OrdemDiaCrud = Crud.build(OrdemDia, '') +#RegistroVotacaoCrud = Crud.build(RegistroVotacao, '') TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') @@ -122,6 +122,7 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): model = OrdemDia parent_field = 'sessao_plenaria' help_path = '' + public = [RP_LIST, RP_DETAIL] class BaseMixin(MasterDetailCrud.BaseMixin): list_field_names = ['numero_ordem', 'materia', 'observacao', From b32de39f4efab65ed8b6da6943d10314a578aba6 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 10:01:59 -0300 Subject: [PATCH 04/33] =?UTF-8?q?Torna=20p=C3=BAblica=20a=20lista=20e=20de?= =?UTF-8?q?talhe=20de=20Mat=20Exped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index f30e78e92..6091f668f 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -246,12 +246,13 @@ class ExpedienteMateriaCrud(MasterDetailCrud): model = ExpedienteMateria parent_field = 'sessao_plenaria' help_path = '' + public = [RP_LIST, RP_DETAIL] class BaseMixin(MasterDetailCrud.BaseMixin): list_field_names = ['numero_ordem', 'materia', 'observacao', 'resultado'] - class ListView(Crud.PublicMixin, MasterDetailCrud.ListView): + class ListView(MasterDetailCrud.ListView): ordering = ['numero_ordem', 'materia', 'resultado'] def get_rows(self, object_list): From 6a70cba5baeba55b565ce6ff689fdd26caab7c0b Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 10:12:42 -0300 Subject: [PATCH 05/33] =?UTF-8?q?Add=20controle=20de=20acesso=20ao=20bot?= =?UTF-8?q?=C3=B5es=20de=20vota=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/sessao/views.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 6091f668f..acb31a2f9 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -174,11 +174,11 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): 'pk': obj.sessao_plenaria_id, 'oid': obj.materia_id, 'mid': obj.pk}) - if self.request.user.has_perms(permissoes_sessao()): + if self.request.user.has_module_perms(AppConfig.label): btn_registrar = ''' - Registrar Votação''' % ( + Registrar Votação''' % ( url) obj.resultado = btn_registrar else: @@ -279,16 +279,19 @@ class ExpedienteMateriaCrud(MasterDetailCrud): 'oid': obj.materia_id, 'mid': obj.pk}) - btn_registrar = ''' - Registrar Votação''' % (url) - obj.resultado = btn_registrar + if self.request.user.has_module_perms(AppConfig.label): + btn_registrar = ''' + + Registrar Votação''' % (url) + obj.resultado = btn_registrar else: url = reverse('sapl.sessao:abrir_votacao_exp', kwargs={ 'pk': obj.pk, 'spk': obj.sessao_plenaria_id}) - btn_abrir = ''' - Matéria não votada
    + btn_abrir = '''Matéria não votada
    ''' + + if self.request.user.has_module_perms(AppConfig.label): + btn_abrir += ''' Abrir Votação''' % (url) From 2ae95faea7082a404e16510a7abf59bd3022319f Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 3 Oct 2016 09:41:01 -0300 Subject: [PATCH 06/33] =?UTF-8?q?Ajusta=20mat=C3=A9rias=20em=20tramita?= =?UTF-8?q?=C3=A7=C3=A3o=20na=20comiss=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/comissoes/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index 9d7208f62..edead6e02 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -68,10 +68,11 @@ class MateriasTramitacaoListView(ListView): def get_queryset(self): # FIXME: Otimizar consulta lista = [] - materias = MateriaLegislativa.objects.filter(tramitacao__isnull=False) + materias = MateriaLegislativa.objects.filter( + tramitacao__isnull=False).order_by('tipo', 'ano', 'numero') for materia in materias: comissao = materia.tramitacao_set.last( - ).unidade_tramitacao_local.comissao + ).unidade_tramitacao_destino.comissao if comissao: if comissao.pk == int(self.kwargs['pk']): lista.append(materia) From 3d679c9f00cce05c32eb0ee24fa5d57a104783c3 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 3 Oct 2016 11:43:46 -0300 Subject: [PATCH 07/33] Fix #676 --- sapl/crud/base.py | 1 - sapl/parlamentares/views.py | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 6f67af03e..5e55acaff 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -354,7 +354,6 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): for fieldname in self.list_field_names: if not isinstance(fieldname, tuple): fieldname = fieldname, - s = [] for fn in fieldname: m = self.model diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 105bd0679..e567d5cf2 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -122,6 +122,21 @@ class MandatoCrud(MasterDetailCrud): class ListView(MasterDetailCrud.ListView): ordering = ('-legislatura__numero') + def get_headers(self): + return [_('Legislatura'), _('Votos do Mandato'), + _('Coligação'), _('Votos da Coligação')] + + def get_rows(self, object_list): + mandatos = [] + for m in object_list: + mandato = [(m, reverse('sapl.parlamentares:mandato_detail', + kwargs={'pk': m.pk})), + (m.votos_recebidos, None), + (m.coligacao, None), + (m.coligacao.numero_votos, None)] + mandatos.append(mandato) + return mandatos + class ComposicaoColigacaoCrud(MasterDetailCrud): model = ComposicaoColigacao From e858678d5adf06133b9c2b57dabbfdec82a1ff37 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 3 Oct 2016 12:04:16 -0300 Subject: [PATCH 08/33] =?UTF-8?q?Remove=20pagina=C3=A7=C3=A3o=20errada=20n?= =?UTF-8?q?a=20telas=20de=20pesquisa=20de=20pauta=20de=20sess=C3=A3o=20e?= =?UTF-8?q?=20sess=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/sessao/pauta_sessao_filter.html | 63 ++++++++----------- .../sessao/sessaoplenaria_filter.html | 13 ++-- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/sapl/templates/sessao/pauta_sessao_filter.html b/sapl/templates/sessao/pauta_sessao_filter.html index efacee554..6c95cea33 100644 --- a/sapl/templates/sessao/pauta_sessao_filter.html +++ b/sapl/templates/sessao/pauta_sessao_filter.html @@ -5,45 +5,36 @@ {% block sections_nav %} {% endblock %} -{% block detail_content %} +{% block base_content %}

    Pesquisar Pauta de Sessão



    - {% crispy filter.form %} -

    - - - - - {% if page_obj|length %} - {% if numero_res > 1 %} -

    Foram encontradas {{numero_res}} pautas de sessões.


    - {% elif numero_res == 1 %} -

    Foi encontrada {{numero_res}} pauta de sessão.


    - {% endif %} - - {% for s in page_obj %} - - - - - {% endfor %} - {% else %} - - + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + + {% if filter_url %} +

    +

    Resultados

    - {{s}}
    -
    - - - -
    -

    Nenhuma Pauta de Sessão encontrada com essas especificações

    -
    + + {% if page_obj|length %} + {% if numero_res > 1 %} +

    Foram encontradas {{numero_res}} pautas de sessões.


    + {% elif numero_res == 1 %} +

    Foi encontrada {{numero_res}} pauta de sessão.


    {% endif %} + {% for s in page_obj %} + + + + {% endfor %} + {% else %} + + {% endif %}

    Resultados

    {{s}}
    + +

    Nenhuma Pauta de Sessão encontrada com essas especificações

    - -{% include "paginacao.html" %} - -{% endblock detail_content %} - + {% include "paginacao.html" %} + {% endif %} +{% endblock base_content %} diff --git a/sapl/templates/sessao/sessaoplenaria_filter.html b/sapl/templates/sessao/sessaoplenaria_filter.html index aa35489b8..2b3edb2e4 100644 --- a/sapl/templates/sessao/sessaoplenaria_filter.html +++ b/sapl/templates/sessao/sessaoplenaria_filter.html @@ -18,17 +18,18 @@ {% block sections_nav %} {% endblock %} -{% block detail_content %} +{% block base_content %}

    Pesquisar Sessão Plenária



    - {% crispy filter.form %} + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} + {% if filter_url %}

    - - - + {% if page_obj|length %} {% if numero_res > 1 %}

    Foram encontradas {{numero_res}} sessões.


    @@ -53,4 +54,4 @@

    Resultados

    Resultados

    {% include "paginacao.html" %} {% endif %} -{% endblock detail_content %} +{% endblock base_content %} From 82fee0e0512f758aa5ddb0e77bff8ca5590259fb Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Mon, 3 Oct 2016 12:13:32 -0300 Subject: [PATCH 09/33] =?UTF-8?q?Remove=20pagina=C3=A7=C3=A3o=20errada=20n?= =?UTF-8?q?a=20telas=20de=20pesquisa=20de=20protocolo=20e=20documento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../documentoadministrativo_filter.html | 73 ++++++-------- .../protocoloadm/protocolo_filter.html | 95 +++++++------------ 2 files changed, 61 insertions(+), 107 deletions(-) diff --git a/sapl/templates/protocoloadm/documentoadministrativo_filter.html b/sapl/templates/protocoloadm/documentoadministrativo_filter.html index 8daf516dd..c7f3debac 100644 --- a/sapl/templates/protocoloadm/documentoadministrativo_filter.html +++ b/sapl/templates/protocoloadm/documentoadministrativo_filter.html @@ -14,54 +14,35 @@ {% if filter_url %} {% endif %} - {% endblock actions %} - - -{% block detail_content %} - - {% if not filter_url %} - - {% crispy filter.form %} - - {% endif %} - - {% if filter_url %} -

    - - - - - {% if page_obj|length %} - {% if numero_res > 1 %} -

    Pesquisa concluída com sucesso! Foram encontrados {{numero_res}} documentos.

    - {% elif numero_res == 1 %} -

    Pesquisa concluída com sucesso! Foi encontrado {{numero_res}} documento.

    - {% endif %} - - {% for d in page_obj %} - - - - {% endfor %} - {% else %} - - +{% block base_content %} + {% if not filter_url %} {% crispy filter.form %} {% endif %} + {% if filter_url %} +

    Resultados

    - {{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}
    - Interessado: {{ d.interessado|default_if_none:"Não Informado"}}
    - Assunto: {{ d.assunto|safe }}
    -

    -
    -

    Nenhum documento encontrado com essas especificações

    -
    + + {% if page_obj|length %} + {% if numero_res > 1 %} +

    Pesquisa concluída com sucesso! Foram encontrados {{numero_res}} documentos.

    + {% elif numero_res == 1 %} +

    Pesquisa concluída com sucesso! Foi encontrado {{numero_res}} documento.

    {% endif %} - -

    Resultados

    -{% include "paginacao.html" %} -{% endif %} - -{% endblock detail_content %} \ No newline at end of file + {% for d in page_obj %} + + + {{d.tipo.sigla}} {{d.numero}}/{{d.ano}} - {{d.tipo}}
    + Interessado: {{ d.interessado|default_if_none:"Não Informado"}}
    + Assunto: {{ d.assunto|safe }}
    + + + {% endfor %} + {% else %} +

    Nenhum documento encontrado com essas especificações

    + {% endif %} + + {% include "paginacao.html" %} + {% endif %} +{% endblock base_content %} diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html index 78def8046..19125ad95 100644 --- a/sapl/templates/protocoloadm/protocolo_filter.html +++ b/sapl/templates/protocoloadm/protocolo_filter.html @@ -5,76 +5,49 @@ {% block sections_nav %} {% endblock %} -{% block detail_content %} +{% block base_content %}

    Pesquisa de Protocolo



    {% if filter_url %} - + {% endif %} - + {% if not filter_url %} {% crispy filter.form %} {% endif %} - {% if filter_url %} -

    - - - - - {% if page_obj|length %} - {% if filter_url %} - {% if numero_res > 1 %} -

    Pesquisa concluída com sucesso! Foram encontrados {{numero_res}} protocolos.

    - {% elif numero_res == 1 %} -

    Pesquisa concluída com sucesso! Foi encontrado {{numero_res}} protocolo.

    - {% endif %} +

    Resultados

    + + {% if page_obj|length %} + {% if filter_url %} + {% if numero_res > 1 %} +

    Pesquisa concluída com sucesso! Foram encontrados {{numero_res}} protocolos.

    + {% elif numero_res == 1 %} +

    Pesquisa concluída com sucesso! Foi encontrado {{numero_res}} protocolo.

    {% endif %} - {% for p in page_obj %} - - - - {% endfor %} - {% else %} - - {% endif %} - + {% for p in page_obj %} + + + + {% endfor %} + {% else %} + + {% endif %}

    Resultados

    - Protocolo: - - {{ p.numero|stringformat:'06d' }}/{{ p.ano }} - -   -   - - - Etiqueta Individual -
    - - Assunto: {{ p.assunto_ementa|default_if_none:"Não Informado"}}
    - - Data Protocolo: {{ p.data|date:"d/m/Y"|default_if_none:"Não Informado" }} - Horário: {{ p.hora|date:"G:i:s" }}
    - - Interessado: {{ p.interessado }}
    - - Natureza do Processo: - {% if p.tipo_processo == 0 %} - Administrativo - {% elif p.tipo_processo == 1 %} - Matéria Legislativa - {% endif %}
    - - Classificação: {{ p.tipo_documento|default_if_none:"Não Informado" }}
    -

    -
    -

    Nenhum protocolo encontrado com essas especificações

    -
    + Protocolo: + {{ p.numero|stringformat:'06d' }}/{{ p.ano }}  -   + Etiqueta Individual
    + Assunto: {{ p.assunto_ementa|default_if_none:"Não Informado"}}
    + Data Protocolo: {{ p.data|date:"d/m/Y"|default_if_none:"Não Informado" }} - Horário: {{ p.hora|date:"G:i:s" }}
    + Interessado: {{ p.interessado }}
    + Natureza do Processo: + {% if p.tipo_processo == 0 %} Administrativo {% elif p.tipo_processo == 1 %} Matéria Legislativa {% endif %}
    + Classificação: {{ p.tipo_documento|default_if_none:"Não Informado" }}
    +

    Nenhum protocolo encontrado com essas especificações

    - -{% include "paginacao.html" %} - -{% endif %} - -{% endblock detail_content %} \ No newline at end of file + {% include "paginacao.html" %} + {% endif %} +{% endblock base_content %} From 2a2f17a8eb1e3b3fb838a14d040f80b19d4a69d9 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 13:36:40 -0300 Subject: [PATCH 10/33] =?UTF-8?q?Ref.=20perms=20da=20app=20sessao=20e=20in?= =?UTF-8?q?clui=20valida=C3=A7=C3=A3o=20painel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/base/models.py | 11 +- sapl/base/templatetags/common_tags.py | 10 +- sapl/base/views.py | 2 +- sapl/crud/base.py | 21 ++- sapl/sessao/views.py | 189 ++++++++++++-------------- sapl/templates/sessao/subnav.yaml | 5 +- sapl/utils.py | 26 +++- 7 files changed, 152 insertions(+), 112 deletions(-) diff --git a/sapl/base/models.py b/sapl/base/models.py index cc2004455..a0a902702 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -107,6 +107,15 @@ class AppConfig(models.Model): ('view_tabelas_auxiliares', _('Visualizar Tabelas Auxiliares')), ) + @classmethod + def attr(cls, attr): + config = AppConfig.objects.first() + + if not config: + return '' + + return getattr(config, attr) + def __str__(self): return _('Configurações da Aplicação - %(id)s') % { 'id': self.id} @@ -204,4 +213,4 @@ def create_proxy_permissions( models.signals.post_migrate.connect( receiver=create_proxy_permissions, - dispatch_uid="django.contrib.auth.management.create_permissions") \ No newline at end of file + dispatch_uid="django.contrib.auth.management.create_permissions") diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index c926a485d..86205cef2 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -122,10 +122,12 @@ def ultima_filiacao(value): @register.filter def get_config_not_exists(user): - if not AppConfig.objects.all().exists(): - return True - else: - return False + return not AppConfig.objects.exists() + + +@register.filter +def get_config_attr(attribute): + return AppConfig.attr(attribute) @register.filter diff --git a/sapl/base/views.py b/sapl/base/views.py index fa3475a8d..b7d6378b8 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -1,5 +1,5 @@ -from braces.views import PermissionRequiredMixin +from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.urlresolvers import reverse from django.db.models import Count, Q from django.http import HttpResponseRedirect diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 5e55acaff..e72a9b5c9 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -158,11 +158,25 @@ class ListWithSearchForm(forms.Form): ) +class PermissionRequiredForAppCrudMixin(PermissionRequiredMixin): + + def has_permission(self): + apps = self.app_label + if isinstance(apps, str): + apps = apps, + # papp_label vazio dará acesso geral + for app in apps: + if not self.request.user.has_module_perms(app): + return False + return True + + class PermissionRequiredContainerCrudMixin(PermissionRequiredMixin): def has_permission(self): perms = self.get_permission_required() - # Torna a view pública se não possuir o atributo permission_required + # Torna a view pública se não possuir conteudo + # no atributo permission_required return self.request.user.has_perms(perms) if len(perms) else True def dispatch(self, request, *args, **kwargs): @@ -673,7 +687,10 @@ class CrudDetailView(PermissionRequiredContainerCrudMixin, return DetailView.get_object(self, queryset=queryset) def get(self, request, *args, **kwargs): - self.object = self.model.objects.get(pk=kwargs.get('pk')) + try: + self.object = self.model.objects.get(pk=kwargs.get('pk')) + except: + raise Http404 obj = self.crud if hasattr(self, 'crud') else self if hasattr(obj, 'model_set') and obj.model_set: self.object_list = self.get_queryset() diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index acb31a2f9..f7e2201e9 100644 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1,9 +1,9 @@ from datetime import datetime from re import sub -from braces.views import PermissionRequiredMixin from django.contrib import messages from django.contrib.auth.decorators import permission_required +from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.urlresolvers import reverse from django.forms.utils import ErrorList @@ -19,8 +19,10 @@ from django.views.generic.edit import FormMixin from django_filters.views import FilterView from rest_framework import generics +from sapl.base.models import AppConfig as AppsAppConfig from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, - MasterDetailCrud, make_pagination) + MasterDetailCrud, make_pagination, + PermissionRequiredForAppCrudMixin) from sapl.materia.forms import pega_ultima_tramitacao from sapl.materia.models import (Autoria, DocumentoAcessorio, TipoMateriaLegislativa, Tramitacao) @@ -29,8 +31,9 @@ from sapl.norma.models import NormaJuridica from sapl.parlamentares.models import (Legislatura, Parlamentar, SessaoLegislativa) from sapl.sessao.apps import AppConfig +from sapl.sessao.forms import ExpedienteMateriaForm, OrdemDiaForm from sapl.sessao.serializers import SessaoPlenariaSerializer -from sapl.utils import permissoes_painel, permissoes_sessao +from sapl.utils import permissoes_painel, permission_required_for_app from .forms import (AdicionarVariasMateriasFilterSet, ExpedienteForm, ListMateriaForm, MesaForm, PautaSessaoFilterSet, @@ -43,9 +46,9 @@ from .models import (Bancada, Bloco, CargoBancada, CargoMesa, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar) + #OrdemDiaCrud = Crud.build(OrdemDia, '') #RegistroVotacaoCrud = Crud.build(RegistroVotacao, '') - TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') CargoBancadaCrud = CrudAux.build(CargoBancada, '') @@ -129,12 +132,14 @@ class MateriaOrdemDiaCrud(MasterDetailCrud): 'resultado'] class CreateView(MasterDetailCrud.CreateView): + form_class = OrdemDiaForm def get_success_url(self): return reverse('sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']}) class UpdateView(MasterDetailCrud.UpdateView): + form_class = OrdemDiaForm def get_initial(self): self.initial['tipo_materia'] = self.object.materia.tipo.id @@ -299,35 +304,40 @@ class ExpedienteMateriaCrud(MasterDetailCrud): obj.resultado = btn_abrir else: url = '' - if obj.tipo_votacao == 1: - url = reverse('sapl.sessao:votacaosimbolicaexpedit', - kwargs={ - 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) - elif obj.tipo_votacao == 2: - url = reverse('sapl.sessao:votacaonominalexpedit', - kwargs={ - 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) - elif obj.tipo_votacao == 3: - url = reverse('sapl.sessao:votacaosecretaexpedit', - kwargs={ - 'pk': obj.sessao_plenaria_id, - 'oid': obj.materia_id, - 'mid': obj.pk}) - obj.resultado = '%s' % (url, - obj.resultado) + + if self.request.user.has_module_perms(AppConfig.label): + if obj.tipo_votacao == 1: + url = reverse( + 'sapl.sessao:votacaosimbolicaexpedit', + kwargs={ + 'pk': obj.sessao_plenaria_id, + 'oid': obj.materia_id, + 'mid': obj.pk}) + elif obj.tipo_votacao == 2: + url = reverse('sapl.sessao:votacaonominalexpedit', + kwargs={ + 'pk': obj.sessao_plenaria_id, + 'oid': obj.materia_id, + 'mid': obj.pk}) + elif obj.tipo_votacao == 3: + url = reverse('sapl.sessao:votacaosecretaexpedit', + kwargs={ + 'pk': obj.sessao_plenaria_id, + 'oid': obj.materia_id, + 'mid': obj.pk}) + obj.resultado = '%s' % (url, + obj.resultado) return [self._as_row(obj) for obj in object_list] class CreateView(MasterDetailCrud.CreateView): + form_class = ExpedienteMateriaForm def get_success_url(self): return reverse('sapl.sessao:expedientemateria_list', kwargs={'pk': self.kwargs['pk']}) class UpdateView(MasterDetailCrud.UpdateView): + form_class = ExpedienteMateriaForm def get_initial(self): self.initial['tipo_materia'] = self.object.materia.tipo.id @@ -393,9 +403,6 @@ class SessaoCrud(Crud): list_field_names = ['data_inicio', 'legislatura', 'sessao_legislativa', 'tipo'] - class CrudDetailView(DetailView): - model = SessaoPlenaria - class ListView(Crud.ListView): ordering = ['-data_inicio'] @@ -409,6 +416,13 @@ class SessaoCrud(Crud): 'sessao_legislativa': sessao_legislativa} +class SessaoPermissionMixin(PermissionRequiredForAppCrudMixin, + FormMixin, + DetailView): + model = SessaoPlenaria + app_label = AppConfig.label, + + class PresencaMixin: def get_presencas(self): @@ -445,14 +459,7 @@ class PresencaView(FormMixin, PresencaMixin, DetailView): form_class = PresencaForm model = SessaoPlenaria - @method_decorator(permission_required(( - '%s.add_%s' % ( - AppConfig.label, SessaoPlenariaPresenca._meta.model_name), - '%s.change_%s' % ( - AppConfig.label, SessaoPlenariaPresenca._meta.model_name), - '%s.delete_%s' % ( - AppConfig.label, SessaoPlenariaPresenca._meta.model_name), - ))) + @method_decorator(permission_required_for_app(AppConfig.label)) def post(self, request, *args, **kwargs): self.object = self.get_object() form = self.get_form() @@ -492,9 +499,31 @@ class PresencaView(FormMixin, PresencaMixin, DetailView): return reverse('sapl.sessao:presenca', kwargs={'pk': pk}) -class PainelView(PermissionRequiredMixin, TemplateView): +class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): template_name = 'sessao/painel.html' - permission_required = permissoes_painel() + app_label = 'painel' + + def has_permission(self): + painel_aberto = AppsAppConfig.attr('painel_aberto') + + if painel_aberto and self.request.user.is_anonymous(): + return True + + return PermissionRequiredForAppCrudMixin.has_permission(self) + + def get(self, request, *args, **kwargs): + if request.user.is_anonymous(): + self.template_name = 'painel/index.html' + return TemplateView.get(self, request, *args, **kwargs) + + def get_context_data(self, **kwargs): + + context = TemplateView.get_context_data(self, **kwargs) + context.update({ + 'head_title': str(_('Painel Plenário')), + 'sessao_id': kwargs['pk']}) + + return context class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): @@ -502,11 +531,7 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): form_class = PresencaForm model = SessaoPlenaria - @method_decorator(permission_required(( - '%s.add_%s' % (AppConfig.label, PresencaOrdemDia._meta.model_name), - '%s.change_%s' % (AppConfig.label, PresencaOrdemDia._meta.model_name), - '%s.delete_%s' % (AppConfig.label, PresencaOrdemDia._meta.model_name), - ))) + @method_decorator(permission_required_for_app(AppConfig.label)) def post(self, request, *args, **kwargs): self.object = self.get_object() @@ -514,9 +539,6 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): pk = kwargs['pk'] - if not self.request.user.has_perms(permissoes_sessao()): - return self.form_invalid(form) - if form.is_valid(): # Pegar os presentes salvos no banco presentes_banco = PresencaOrdemDia.objects.filter( @@ -589,11 +611,7 @@ class ListMateriaOrdemDiaView(FormMixin, DetailView): return self.render_to_response(context) - @method_decorator(permission_required(( - '%s.add_%s' % (AppConfig.label, OrdemDia._meta.model_name), - '%s.change_%s' % (AppConfig.label, OrdemDia._meta.model_name), - '%s.delete_%s' % (AppConfig.label, OrdemDia._meta.model_name), - ))) + @method_decorator(permission_required_for_app(AppConfig.label)) def post(self, request, *args, **kwargs): self.object = self.get_object() context = self.get_context_data(object=self.object) @@ -684,11 +702,7 @@ class MesaView(FormMixin, DetailView): return self.render_to_response(context) - @method_decorator(permission_required(( - '%s.add_integrantemesa' % AppConfig.label, - '%s.change_integrantemesa' % AppConfig.label, - '%s.delete_integrantemesa' % AppConfig.label, - ))) + @method_decorator(permission_required_for_app(AppConfig.label)) def post(self, request, *args, **kwargs): self.object = self.get_object() form = MesaForm(request.POST) @@ -759,8 +773,9 @@ class MesaView(FormMixin, DetailView): return reverse('sapl.sessao:mesa', kwargs={'pk': pk}) -class ResumoView(SessaoCrud.CrudDetailView): +class ResumoView(DetailView): template_name = 'sessao/resumo.html' + model = SessaoPlenaria def get(self, request, *args, **kwargs): self.object = self.get_object() @@ -931,18 +946,16 @@ class ResumoView(SessaoCrud.CrudDetailView): return self.render_to_response(context) -class ExpedienteView(FormMixin, - SessaoCrud.CrudDetailView): +class ExpedienteView(FormMixin, DetailView): template_name = 'sessao/expediente.html' form_class = ExpedienteForm + model = SessaoPlenaria + @method_decorator(permission_required_for_app(AppConfig.label)) def post(self, request, *args, **kwargs): self.object = self.get_object() form = ExpedienteForm(request.POST) - if not self.request.user.has_perms(permissoes_sessao()): - return self.form_invalid(form) - if form.is_valid(): list_tipo = request.POST.getlist('tipo') list_conteudo = request.POST.getlist('conteudo') @@ -999,16 +1012,13 @@ class ExpedienteView(FormMixin, return reverse('sapl.sessao:expediente', kwargs={'pk': pk}) -class VotacaoEditView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoEditView(SessaoPermissionMixin): ''' Votação Simbólica e Secreta ''' template_name = 'sessao/votacao/votacao_edit.html' - permission_required = permissoes_sessao() def post(self, request, *args, **kwargs): @@ -1075,9 +1085,7 @@ class VotacaoEditView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoView(SessaoPermissionMixin): ''' Votação Simbólica e Secreta @@ -1085,7 +1093,6 @@ class VotacaoView(PermissionRequiredMixin, template_name = 'sessao/votacao/votacao.html' form_class = VotacaoForm - permission_required = permissoes_sessao() def get(self, request, *args, **kwargs): self.object = self.get_object() @@ -1197,11 +1204,8 @@ class VotacaoView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoNominalView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoNominalView(SessaoPermissionMixin): template_name = 'sessao/votacao/nominal.html' - permission_required = permissoes_sessao() def get(self, request, *args, **kwargs): ordem_id = kwargs['mid'] @@ -1325,11 +1329,8 @@ class VotacaoNominalView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoNominalEditView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoNominalEditView(SessaoPermissionMixin): template_name = 'sessao/votacao/nominal_edit.html' - permission_required = permissoes_sessao() def get(self, request, *args, **kwargs): context = {} @@ -1405,11 +1406,8 @@ class VotacaoNominalEditView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoNominalExpedienteView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoNominalExpedienteView(SessaoPermissionMixin): template_name = 'sessao/votacao/nominal.html' - permission_required = permissoes_sessao() def get(self, request, *args, **kwargs): expediente_id = kwargs['mid'] @@ -1531,11 +1529,8 @@ class VotacaoNominalExpedienteView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoNominalExpedienteEditView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoNominalExpedienteEditView(SessaoPermissionMixin): template_name = 'sessao/votacao/nominal_edit.html' - permission_required = permissoes_sessao() def get(self, request, *args, **kwargs): context = {} @@ -1610,9 +1605,7 @@ class VotacaoNominalExpedienteEditView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoExpedienteView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoExpedienteView(SessaoPermissionMixin): ''' Votação Simbólica e Secreta @@ -1620,7 +1613,6 @@ class VotacaoExpedienteView(PermissionRequiredMixin, template_name = 'sessao/votacao/votacao.html' form_class = VotacaoForm - permission_required = permissoes_sessao() def get(self, request, *args, **kwargs): self.object = self.get_object() @@ -1734,9 +1726,7 @@ class VotacaoExpedienteView(PermissionRequiredMixin, kwargs={'pk': pk}) -class VotacaoExpedienteEditView(PermissionRequiredMixin, - FormMixin, - SessaoCrud.CrudDetailView): +class VotacaoExpedienteEditView(SessaoPermissionMixin): ''' Votação Simbólica e Secreta @@ -1744,7 +1734,6 @@ class VotacaoExpedienteEditView(PermissionRequiredMixin, template_name = 'sessao/votacao/votacao_edit.html' form_class = VotacaoEditForm - permission_required = permissoes_sessao() def get_success_url(self): pk = self.kwargs['pk'] @@ -1835,8 +1824,9 @@ class PautaSessaoListView(SessaoListView): template_name = "sessao/pauta_sessao_list.html" -class PautaSessaoDetailView(SessaoCrud.CrudDetailView): +class PautaSessaoDetailView(DetailView): template_name = "sessao/pauta_sessao_detail.html" + model = SessaoPlenaria def get(self, request, *args, **kwargs): self.object = self.get_object() @@ -1946,8 +1936,9 @@ class SessaoPlenariaView(generics.ListAPIView): serializer_class = SessaoPlenariaSerializer -class PautaExpedienteDetail(SessaoCrud.CrudDetailView): +class PautaExpedienteDetail(DetailView): template_name = "sessao/pauta/expediente.html" + model = SessaoPlenaria def get(self, request, *args, **kwargs): pk = self.kwargs['pk'] @@ -1964,8 +1955,9 @@ class PautaExpedienteDetail(SessaoCrud.CrudDetailView): 'tramitacao': tramitacao}) -class PautaOrdemDetail(SessaoCrud.CrudDetailView): +class PautaOrdemDetail(DetailView): template_name = "sessao/pauta/ordem.html" + model = SessaoPlenaria def get(self, request, *args, **kwargs): pk = self.kwargs['pk'] @@ -2063,11 +2055,11 @@ def retira_materias_ja_adicionadas(id_sessao, model): return lista_id_materias -class AdicionarVariasMateriasExpediente(PermissionRequiredMixin, +class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, MateriaLegislativaPesquisaView): filterset_class = AdicionarVariasMateriasFilterSet template_name = 'sessao/adicionar_varias_materias_expediente.html' - permission_required = permissoes_sessao() + app_label = AppConfig.label def get_filterset_kwargs(self, filterset_class): super(AdicionarVariasMateriasExpediente, @@ -2143,7 +2135,6 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredMixin, class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): filterset_class = AdicionarVariasMateriasFilterSet template_name = 'sessao/adicionar_varias_materias_ordem.html' - permission_required = permissoes_sessao() def get_filterset_kwargs(self, filterset_class): super(AdicionarVariasMateriasExpediente, diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index cca959a10..ac08302f4 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -1,4 +1,5 @@ -{% load i18n %} +{% load i18n common_tags %} + - title: {% trans 'Abertura' %} children: - title: {% trans 'Dados Básicos' %} @@ -28,6 +29,6 @@ - title: {% trans 'Painel Eletrônico' %} url: painel - + {% if not 'painel_aberto'|get_config_attr %}check_permission: painel.list_painel{%endif%} - title: {% trans 'Resumo' %} url: resumo diff --git a/sapl/utils.py b/sapl/utils.py index 3b6d8b1f0..467d0d2b2 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,18 +1,19 @@ -import hashlib from datetime import date from functools import wraps from unicodedata import normalize as unicodedata_normalize +import hashlib -import magic from django import forms from django.apps import apps from django.conf import settings from django.contrib import admin +from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ValidationError +from django.core.exceptions import ValidationError, PermissionDenied from django.utils.translation import ugettext_lazy as _ from floppyforms import ClearableFileInput +import magic def normalize(txt): @@ -279,6 +280,25 @@ def permissoes(nome_grupo, app_label): return set(lista_permissoes) +def permission_required_for_app(app_label, login_url=None, + raise_exception=False): + """ + Decorator for views that checks whether a user has a particular permission + enabled, redirecting to the log-in page if necessary. + If the raise_exception parameter is given the PermissionDenied exception + is raised. + """ + def check_perms(user): + if user.has_module_perms(app_label): + return True + # In case the 403 handler should be called raise the exception + if raise_exception: + raise PermissionDenied + # As the last resort, show the login form + return False + return user_passes_test(check_perms, login_url=login_url) + + def permissoes_materia(): return permissoes('Operador de Matéria', 'materia') From 98713161b90a41ad76ac3cf737762b118a53683e Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 14:56:30 -0300 Subject: [PATCH 11/33] Ajusta de busca de mat e crud de legislacaocitada --- sapl/crud/base.py | 2 +- sapl/materia/views.py | 51 +++++++- sapl/templates/crud/detail.html | 58 ++++----- .../materia/materialegislativa_filter.html | 110 +++++++++--------- sapl/templates/materia/subnav.yaml | 6 +- 5 files changed, 133 insertions(+), 94 deletions(-) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index e72a9b5c9..060153993 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -316,7 +316,7 @@ class CrudBaseMixin(CrispyLayoutFormMixin): def delete_url(self): obj = self.crud if hasattr(self, 'crud') else self if not obj.DeleteView.permission_required: - return self.resolve_url(ACTION_DELETE) + return self.resolve_url(ACTION_DELETE, args=(self.object.id,)) else: return self.resolve_url(ACTION_DELETE, args=(self.object.id,))\ if self.request.user.has_perm( diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b7ddbc233..d5b13e4a9 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -27,8 +27,10 @@ from sapl.base.models import CasaLegislativa from sapl.compilacao.views import IntegracaoTaView from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, CrudDetailView, - MasterDetailCrud, make_pagination) -from sapl.materia.forms import AnexadaForm + MasterDetailCrud, make_pagination, + ACTION_CREATE, ACTION_UPDATE, ACTION_LIST, + ACTION_DELETE) +from sapl.materia.forms import AnexadaForm, LegislacaoCitadaForm from sapl.norma.models import LegislacaoCitada from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, autor_modal, gerar_hash_arquivo, get_base_url, @@ -51,8 +53,7 @@ from .models import (AcompanhamentoMateria, Anexada, Autor, Autoria, Tramitacao, UnidadeTramitacao) -AnexadaCrud = Crud.build(Anexada, '') - +#AnexadaCrud = Crud.build(Anexada, '') OrigemCrud = Crud.build(Origem, '') TipoMateriaCrud = CrudAux.build( @@ -720,7 +721,37 @@ class LegislacaoCitadaCrud(MasterDetailCrud): return reverse('%s:%s' % (namespace, self.url_name(suffix)), args=args) + def has_permission(self): + return self.request.user.has_module_perms('materia') + + @property + def list_url(self): + return self.resolve_url(ACTION_LIST, args=(self.kwargs['pk'],))\ + if self.request.user.has_module_perms('materia') else '' + + @property + def create_url(self): + obj = self.crud if hasattr(self, 'crud') else self + if not obj.CreateView: + return '' + return self.resolve_url(ACTION_CREATE, args=(self.kwargs['pk'],))\ + if self.request.user.has_module_perms('materia') else '' + + @property + def update_url(self): + return self.resolve_url(ACTION_CREATE, args=(self.kwargs['pk'],))\ + if self.request.user.has_module_perms('materia') else '' + + @property + def delete_url(self): + return self.resolve_url(ACTION_DELETE, args=(self.object.id,))\ + if self.request.user.has_module_perms('materia') else '' + + class CreateView(MasterDetailCrud.CreateView): + form_class = LegislacaoCitadaForm + class UpdateView(MasterDetailCrud.UpdateView): + form_class = LegislacaoCitadaForm def get_initial(self): self.initial['tipo'] = self.object.norma.tipo.id @@ -751,6 +782,18 @@ class AnexadaCrud(MasterDetailCrud): class BaseMixin(MasterDetailCrud.BaseMixin): list_field_names = ['materia_anexada', 'data_anexacao'] + class CreateView(MasterDetailCrud.CreateView): + form_class = AnexadaForm + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = AnexadaForm + + def get_initial(self): + self.initial['tipo'] = self.object.materia_anexada.tipo.id + self.initial['numero'] = self.object.materia_anexada.numero + self.initial['ano'] = self.object.materia_anexada.ano + return self.initial + class DetailView(MasterDetailCrud.DetailView): @property diff --git a/sapl/templates/crud/detail.html b/sapl/templates/crud/detail.html index 0992bc345..e5d9c0ffc 100644 --- a/sapl/templates/crud/detail.html +++ b/sapl/templates/crud/detail.html @@ -48,36 +48,38 @@ {% endfor %} {% endblock detail_content %} -
    - {% if not rows %} -

    {{ NO_ENTRIES_MSG }}

    - {% else %} -
    {% blocktrans with verbose_name_plural=view.model_set_verbose_name_plural %}Total de {{ verbose_name_plural }}: {{count}}{% endblocktrans %}
    - - + {% block table_content %} +
    + {% if not rows %} +

    {{ NO_ENTRIES_MSG }}

    + {% else %} +
    {% blocktrans with verbose_name_plural=view.model_set_verbose_name_plural %}Total de {{ verbose_name_plural }}: {{count}}{% endblocktrans %}
    +
    + + + {% for name in headers %} + + {% endfor %} + + + + {% for value_list in rows %} - {% for name in headers %} - + {% for value, href in value_list %} + {% endfor %} - - - {% for value_list in rows %} - - {% for value, href in value_list %} - {% endfor %} - - {% endfor %} - -
    {{ name }}
    {{ name }} + {% if href %} + {{ value }} + {% elif value != 'core.Cep.None' %} + {{ value|safe }} + {% endif %} +
    - {% if href %} - {{ value }} - {% elif value != 'core.Cep.None' %} - {{ value|safe }} - {% endif %} -
    - {% endif %} -
    - {% include "paginacao.html" %} + + + {% endif %} + + {% include "paginacao.html" %} + {% endblock table_content %} {% endblock base_content %} diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 9811394b9..ec49f450a 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -2,64 +2,62 @@ {% load i18n %} {% load crispy_forms_tags %} -{% block actions %} -
    - {% if user.is_authenticated %} - - {% blocktrans with verbose_name=view.verbose_name %} Adicionar Matéria Legislativa {% endblocktrans %} - + {% block actions %} +
    + {% if user.is_authenticated %} + + {% blocktrans with verbose_name=view.verbose_name %} Adicionar Matéria Legislativa {% endblocktrans %} + + {% endif %} + {% if filter_url %} + {% trans 'Fazer nova pesquisa' %} {% endif %} - {% if filter_url %} - {% trans 'Fazer nova pesquisa' %} - {% endif %} -
    -{% endblock %} - -{% block sections_nav %} -{% endblock %} +
    + {% endblock %} -{% block base_content %} + {% block detail_content %} + {% if not filter_url %} + {% crispy filter.form %} + {% endif %} - {% if not filter_url %} - {% crispy filter.form %} - {% endif %} + {% if filter_url %} + + + + + {% if paginator.count %} + {% if paginator.count > 1 %} +

    {% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

    + {% elif paginator.count == 1 %} +

    {% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

    + {% endif %} - {% if filter_url %} -

    {% trans "Resultados" %}

    - - - - {% if paginator.count %} - {% if paginator.count > 1 %} -

    {% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}

    - {% elif paginator.count == 1 %} -

    {% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}

    + {% for m in page_obj %} + + + {% endfor %} + {% else %} + {% endif %} - - {% for m in page_obj %} - - - {% endfor %} - {% else %} - - {% endif %} -

    {% trans "Resultados" %}

    + {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
    + Autores: + {% for a in m.autoria_set.all %} + {% if not forloop.first %} + ,    {{a.autor|default_if_none:"Não Informado"}} + {% else %} +  {{a.autor|default_if_none:"Não Informado"}} + {% endif %} + {% endfor %} +
    + Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
    + Status:  {{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}
    + Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}
    + Ementa: {{ m.ementa|safe }}
    +

    +

    Nenhuma matéria encontrada com essas especificações

    - {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}
    - Autores: - {% for a in m.autoria_set.all %} - {% if not forloop.first %} - ,    {{a.autor|default_if_none:"Não Informado"}} - {% else %} -  {{a.autor|default_if_none:"Não Informado"}} - {% endif %} - {% endfor %} -
    - Localização Atual:  {{m.tramitacao_set.last.unidade_tramitacao_destino|default_if_none:"Não Informada"}}
    - Status:  {{m.tramitacao_set.last.status|default_if_none:"Não Informada"}}
    - Data da última Tramitação:  {{m.tramitacao_set.last.data_tramitacao|default_if_none:"Não Informada"}}
    - Ementa: {{ m.ementa|safe }}
    -

    -

    Nenhuma matéria encontrada com essas especificações

    - {% include "paginacao.html" %} - {% endif %} -{% endblock base_content %} + + {% include "paginacao.html" %} + {% endif %} + {% endblock detail_content %} + {% block table_content %} + {% endblock table_content %} diff --git a/sapl/templates/materia/subnav.yaml b/sapl/templates/materia/subnav.yaml index c1a5bf8d6..dbbf8eddf 100644 --- a/sapl/templates/materia/subnav.yaml +++ b/sapl/templates/materia/subnav.yaml @@ -11,16 +11,12 @@ url: documentoacessorio_list - title: {% trans 'Legislação Citada' %} url: legislacaocitada_list + app_name: 'materia' - title: {% trans 'Numeração' %} url: numeracao_list - title: {% trans 'Tramitação' %} url: tramitacao_list - title: {% trans 'Relatoria' %} url: relatoria_list - -# Opção adicionada para chamar o TextoArticulado da matéria. -# para integração foram necessárias apenas criar a url materia_ta em urls.py -# e a view MateriaTaView(IntegracaoTaView) em views.py -# Em nada mais a integração interfere em MateriaLegislativa - title: {% trans 'Texto' %} url: materia_ta From 3252a14ef340e11d48ee932964b9f0925f6925c3 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 15:00:46 -0300 Subject: [PATCH 12/33] =?UTF-8?q?Add=20especializa=C3=A7=C3=A3o=20do=20for?= =?UTF-8?q?m=20em=20Norma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/norma/views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 27f8b94dd..f00494323 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -5,11 +5,13 @@ from django.views.generic import FormView, ListView from sapl.compilacao.views import IntegracaoTaView from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, make_pagination +from sapl.norma.forms import NormaJuridicaForm from .forms import NormaJuridicaPesquisaForm from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, TipoNormaJuridica) + LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') @@ -28,6 +30,7 @@ class NormaCrud(Crud): public = [RP_LIST, RP_DETAIL] class UpdateView(Crud.UpdateView): + form_class = NormaJuridicaForm @property def layout_key(self): @@ -42,6 +45,7 @@ class NormaCrud(Crud): return self.initial.copy() class CreateView(Crud.CreateView): + form_class = NormaJuridicaForm @property def layout_key(self): From cab54d80202e044af9206cefddb122e9557d5e8d Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 16:17:00 -0300 Subject: [PATCH 13/33] Add masterdetailcrud para Legislacao Citada --- sapl/crud/base.py | 3 -- sapl/materia/forms.py | 30 +++++++++++++---- sapl/materia/views.py | 12 ++++--- sapl/norma/models.py | 3 ++ sapl/norma/views.py | 2 +- .../materia/materialegislativa_filter.html | 2 +- .../test_inicializa_grupos_autorizacoes.py | 32 ++++++++++++++++++- 7 files changed, 67 insertions(+), 17 deletions(-) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 060153993..87f8050fd 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -1086,9 +1086,6 @@ class MasterDetailCrud(Crud): def get_url_regex(cls): return r'^%s/(?P\d+)/edit$' % cls.model._meta.model_name - def get(self, request, *args, **kwargs): - return Crud.UpdateView.get(self, request, *args, **kwargs) - class DeleteView(Crud.DeleteView): permission_required = RP_DELETE, diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index f4575658a..c33c5bc7b 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -364,17 +364,35 @@ class LegislacaoCitadaForm(ModelForm): else: cleaned_data['norma'] = norma - if LegislacaoCitada.objects.filter( + filtro_base = LegislacaoCitada.objects.filter( materia=self.instance.materia, - norma=cleaned_data['norma'] - ).exists(): - msg = _('Essa Legislação já foi cadastrada.') - raise ValidationError(msg) - + norma=self.cleaned_data['norma'], + disposicoes=self.cleaned_data['disposicoes'], + parte=self.cleaned_data['parte'], + livro=self.cleaned_data['livro'], + titulo=self.cleaned_data['titulo'], + capitulo=self.cleaned_data['capitulo'], + secao=self.cleaned_data['secao'], + subsecao=self.cleaned_data['subsecao'], + artigo=self.cleaned_data['artigo'], + paragrafo=self.cleaned_data['paragrafo'], + inciso=self.cleaned_data['inciso'], + alinea=self.cleaned_data['alinea'], + item=self.cleaned_data['item']) + + if not self.instance.id: + if filtro_base.exists(): + msg = _('Essa Legislação já foi cadastrada.') + raise ValidationError(msg) + else: + if filtro_base.exclude(id=self.instance.id).exists(): + msg = _('Essa Legislação já foi cadastrada.') + raise ValidationError(msg) return cleaned_data def save(self, commit=False): legislacao = super(LegislacaoCitadaForm, self).save(commit) + legislacao.norma = self.cleaned_data['norma'] legislacao.save() return legislacao diff --git a/sapl/materia/views.py b/sapl/materia/views.py index d5b13e4a9..3b12c145e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -29,7 +29,7 @@ from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, CrudDetailView, MasterDetailCrud, make_pagination, ACTION_CREATE, ACTION_UPDATE, ACTION_LIST, - ACTION_DELETE) + ACTION_DELETE, ACTION_DETAIL) from sapl.materia.forms import AnexadaForm, LegislacaoCitadaForm from sapl.norma.models import LegislacaoCitada from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, @@ -731,15 +731,17 @@ class LegislacaoCitadaCrud(MasterDetailCrud): @property def create_url(self): - obj = self.crud if hasattr(self, 'crud') else self - if not obj.CreateView: - return '' return self.resolve_url(ACTION_CREATE, args=(self.kwargs['pk'],))\ if self.request.user.has_module_perms('materia') else '' + @property + def detail_url(self): + return self.resolve_url(ACTION_DETAIL, args=(self.object.id,))\ + if self.request.user.has_module_perms('materia') else '' + @property def update_url(self): - return self.resolve_url(ACTION_CREATE, args=(self.kwargs['pk'],))\ + return self.resolve_url(ACTION_UPDATE, args=(self.kwargs['pk'],))\ if self.request.user.has_module_perms('materia') else '' @property diff --git a/sapl/norma/models.py b/sapl/norma/models.py index c03c4c305..55f07ad16 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -167,6 +167,9 @@ class LegislacaoCitada(models.Model): verbose_name = _('Legislação') verbose_name_plural = _('Legislações') + def __str__(self): + return str(self.norma) + class VinculoNormaJuridica(models.Model): TIPO_VINCULO_CHOICES = ( diff --git a/sapl/norma/views.py b/sapl/norma/views.py index f00494323..c2dd31724 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -12,7 +12,7 @@ from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica, TipoNormaJuridica) -LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') +# LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '') AssuntoNormaCrud = CrudAux.build(AssuntoNorma, 'assunto_norma_juridica', diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index ec49f450a..48bcaf1d6 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -4,7 +4,7 @@ {% block actions %}
    - {% if user.is_authenticated %} + {% if perms.materia %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Matéria Legislativa {% endblocktrans %} diff --git a/scripts/test_inicializa_grupos_autorizacoes.py b/scripts/test_inicializa_grupos_autorizacoes.py index f356e85aa..9498ac40b 100644 --- a/scripts/test_inicializa_grupos_autorizacoes.py +++ b/scripts/test_inicializa_grupos_autorizacoes.py @@ -1,6 +1,9 @@ from django.apps import apps from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType +from django.utils.translation import string_concat + +from django.utils.translation import ugettext_lazy as _ import pytest from inicializa_grupos_autorizacoes import cria_grupos_permissoes @@ -17,12 +20,25 @@ def test_grupo_padrao_tem_permissoes_sobre_todo_o_app(app_label): app = apps.get_app_config(app_label) + for klass in list(app.get_models()): + opts = klass._meta + permissions = ( + ("list_" + opts.model_name, + string_concat( + _('Visualizaçao da lista de'), ' ', + opts.verbose_name_plural)), + ("detail_" + opts.model_name, + string_concat( + _('Visualização dos detalhes de'), ' ', + opts.verbose_name_plural)), + ) + # código testado cria_grupos_permissoes() def gerar_permissoes(app): for model in app.get_models(): - for op in ['add', 'change', 'delete']: + for op in ['add', 'change', 'delete', 'list', 'detail']: yield model, 'Can %s %s' % (op, model._meta.verbose_name) grupo = Group.objects.get(name='Operador de %s' % app.verbose_name) esperado = set(gerar_permissoes(app)) @@ -36,6 +52,20 @@ def test_grupo_padrao_tem_permissoes_sobre_todo_o_app(app_label): def test_permissoes_extras_sao_apagadas(app_label): app = apps.get_app_config(app_label) + + for klass in list(app.get_models()): + opts = klass._meta + permissions = ( + ("list_" + opts.model_name, + string_concat( + _('Visualizaçao da lista de'), ' ', + opts.verbose_name_plural)), + ("detail_" + opts.model_name, + string_concat( + _('Visualização dos detalhes de'), ' ', + opts.verbose_name_plural)), + ) + grupo = Group.objects.create(name='Operador de %s' % app.verbose_name) permissao_errada = Permission.objects.create( From dc15fa3eef4fe85fb91024b02e92c5fb614ce1e7 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Mon, 3 Oct 2016 16:36:39 -0300 Subject: [PATCH 14/33] =?UTF-8?q?HOT-FIX=20para=20eliminar=20duplica=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20mat=C3=A9rias=20na=20lista?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/comissoes/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py index edead6e02..277714460 100644 --- a/sapl/comissoes/views.py +++ b/sapl/comissoes/views.py @@ -73,8 +73,10 @@ class MateriasTramitacaoListView(ListView): for materia in materias: comissao = materia.tramitacao_set.last( ).unidade_tramitacao_destino.comissao - if comissao: - if comissao.pk == int(self.kwargs['pk']): + if (comissao and + materia not in lista and + comissao.pk == int(self.kwargs['pk']) + ): lista.append(materia) return lista From 23187f959a3280bf8b69619f7a528dad9b6fe7bd Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 3 Oct 2016 17:20:46 -0300 Subject: [PATCH 15/33] Ajusta listagem de mandatos conforme issue #676 --- sapl/crud/base.py | 29 ++++++++++++++++------------- sapl/parlamentares/views.py | 19 ++++--------------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 87f8050fd..1d4182760 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -379,17 +379,12 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): if m == self.model: s.append(force_text(f.verbose_name)) else: - s.append(force_text(m._meta.verbose_name)) + s.append(force_text(f.verbose_name)) s = ' / '.join(s) r.append(s) return r def _as_row(self, obj): - """ - FIXME: Refatorar função para capturar url correta em caso de uso de - campos foreignkey. getHeaders já faz isso para construir o título. - falta fazer com esta função - """ r = [] for i, name in enumerate(self.list_field_names): url = self.resolve_url( @@ -401,20 +396,28 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): url = url + ('?pkk=' + self.kwargs['pk'] if 'pk' in self.kwargs else '') + if not isinstance(name, tuple): + name = name, + """ se elemento de list_field_name for uma tupla, constrói a informação com ' - ' se os campos forem simples, ou com
    se for m2m """ if isinstance(name, tuple): s = '' for j, n in enumerate(name): - ss = get_field_display(obj, n)[1] - ss = ( - ('
    ' if '