From b5b0ca23baa925ceaa694970784ed39266463670 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 11 Oct 2016 10:35:37 -0300 Subject: [PATCH 1/5] Adiciona /sessao/pesquisar-sessao a excecoes de url --- sapl/test_urls.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 425d0d55b..6f4f748ed 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -285,6 +285,7 @@ urls_publicas_excecoes = { '/sessao/pauta-sessao/1', '/sessao/pauta-sessao/1/expediente/', '/sessao/pauta-sessao/1/ordem/', + '/sessao/pesquisar-sessao' '/comissao/1/materias-em-tramitacao', @@ -324,7 +325,7 @@ def test_permissions_urls_for_users_by_apps(url_item, client): como é o caso de PainelView que está na app 'sessao' mas é um redirecionamento para 'painel'... aqui é feita a troca da app a ser testada, por essas outras possíveis. - + Este, até a ultima versão deste teste é o único tipo de view que possui restrição restrição simples, por permissão, e não por container, como é o caso de proposições que possui restrição @@ -423,7 +424,7 @@ def test_permissions_urls_for_users_by_apps(url_item, client): No teste de requisição "%s" a url (%s). App (%s) O usuário (%s) deveria ser redirecionado - para tela de login. + para tela de login. """ % (_type, url, app, username) else: assert btn_login not in content, """ @@ -434,10 +435,10 @@ def test_permissions_urls_for_users_by_apps(url_item, client): invariavelmente pública, a adicione na variavel abaixo localizada no arquivo que se encontra este teste: - + urls_publicas_excecoes - - + + """ % (_type, url, app, username) if username not in users_for_url_atual_app: From 98b278d1572b4f504ca2ba6ba909ae28f9e11d17 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 11 Oct 2016 11:00:14 -0300 Subject: [PATCH 2/5] =?UTF-8?q?Adiciona=20urls=20a=20exce=C3=A7=C3=A3o=20n?= =?UTF-8?q?o=20teste=20de=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/test_urls.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 6f4f748ed..c35b0b5e5 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -272,20 +272,34 @@ urls_publicas_excecoes = { '/sessao/pauta-sessao/1', '/sessao/pauta-sessao/pesquisar-pauta', '/sessao/pesquisar-sessao', + '/sessao/1/reordenar-expediente' + '/sessao/1/reordenar-ordem' '/proposicao/1/ta', # FIXME Compilação deverá tratar '/materia/1/ta', '/norma/1/ta', + + '/comissao/1/materias-em-tramitacao' + + '/proposicao/' + '/proposicao/1' + '/proposicao/1/delete' + '/proposicao/1/edit' + '/protocoloadm/pesquisar-autor' ], 'post': [ '/norma/pesquisa-resultado', '/mesa-diretora/' # tratamento de permissão interno. - 'sessao/1/resumo', + '/sessao/1/resumo', '/sessao/pauta-sessao', '/sessao/pauta-sessao/1', '/sessao/pauta-sessao/1/expediente/', '/sessao/pauta-sessao/1/ordem/', '/sessao/pesquisar-sessao' + '/sessao/1/reordenar-expediente' + '/sessao/1/reordenar-ordem' + '/sessao/pauta-sessao/pesquisar-pauta' + '/sessao/pesquisar-sessao' '/comissao/1/materias-em-tramitacao', @@ -295,6 +309,12 @@ urls_publicas_excecoes = { '/materia/confirmar/1/1', '/materia/pesquisar-materia' + '/proposicao/' + '/proposicao/1' + '/proposicao/1/delete' + '/proposicao/1/edit' + '/protocoloadm/pesquisar-autor' + ] } From f733cd851973f9f0093deea2a4feb8959d68038f Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 11 Oct 2016 11:13:04 -0300 Subject: [PATCH 3/5] Fix virgulas --- sapl/test_urls.py | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/sapl/test_urls.py b/sapl/test_urls.py index c35b0b5e5..77a06f7e1 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -272,20 +272,20 @@ urls_publicas_excecoes = { '/sessao/pauta-sessao/1', '/sessao/pauta-sessao/pesquisar-pauta', '/sessao/pesquisar-sessao', - '/sessao/1/reordenar-expediente' - '/sessao/1/reordenar-ordem' + '/sessao/1/reordenar-expediente', + '/sessao/1/reordenar-ordem', '/proposicao/1/ta', # FIXME Compilação deverá tratar '/materia/1/ta', '/norma/1/ta', - '/comissao/1/materias-em-tramitacao' + '/comissao/1/materias-em-tramitacao', - '/proposicao/' - '/proposicao/1' - '/proposicao/1/delete' - '/proposicao/1/edit' - '/protocoloadm/pesquisar-autor' + '/proposicao/', + '/proposicao/1', + '/proposicao/1/delete', + '/proposicao/1/edit', + '/protocoloadm/pesquisar-autor', ], 'post': [ '/norma/pesquisa-resultado', @@ -295,11 +295,11 @@ urls_publicas_excecoes = { '/sessao/pauta-sessao/1', '/sessao/pauta-sessao/1/expediente/', '/sessao/pauta-sessao/1/ordem/', - '/sessao/pesquisar-sessao' - '/sessao/1/reordenar-expediente' - '/sessao/1/reordenar-ordem' - '/sessao/pauta-sessao/pesquisar-pauta' - '/sessao/pesquisar-sessao' + '/sessao/pesquisar-sessao', + '/sessao/1/reordenar-expediente', + '/sessao/1/reordenar-ordem', + '/sessao/pauta-sessao/pesquisar-pauta', + '/sessao/pesquisar-sessao', '/comissao/1/materias-em-tramitacao', @@ -307,14 +307,13 @@ urls_publicas_excecoes = { '/materia/1/ta', '/norma/1/ta', '/materia/confirmar/1/1', - '/materia/pesquisar-materia' - - '/proposicao/' - '/proposicao/1' - '/proposicao/1/delete' - '/proposicao/1/edit' - '/protocoloadm/pesquisar-autor' + '/materia/pesquisar-materia', + '/proposicao/', + '/proposicao/1', + '/proposicao/1/delete', + '/proposicao/1/edit', + '/protocoloadm/pesquisar-autor', ] } From b2f47e655406c1acd149e4bc9835f5ee6972d0f6 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 11 Oct 2016 11:46:37 -0300 Subject: [PATCH 4/5] Fix urls_publicas_excecoes --- echo | 14029 ++++++++++++++++++++++++++++++++++++++++++++ sapl/test_urls.py | 2 +- teste.py | 9 + 3 files changed, 14039 insertions(+), 1 deletion(-) create mode 100644 echo create mode 100644 teste.py diff --git a/echo b/echo new file mode 100644 index 000000000..7a95a6562 --- /dev/null +++ b/echo @@ -0,0 +1,14029 @@ +]0;IPython: Documents/saplVIRTUAL_ENV -> /home/eduardo/.virtualenvs/sapl/lib/python3.4/site-packages +============================= test session starts ============================== +platform linux -- Python 3.4.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 +django settings: sapl.settings (from ini file) +rootdir: /home/eduardo/Documents/sapl, inifile: pytest.ini +plugins: cov-2.3.0, django-2.9.1, ipdb-0.1-prerelease2 +collected 2013 items + +sapl/test_urls.py .....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................F....F....F....F....F....F.........F....F....F....F....F....F....F....F.........F....F....F....F....F....F....F....F....F....F....F....F....F....F....F....F....F....F....F...........F....F....F....F....F..............................................................................FFFFFFFFFFFFFFFFFFF................................................................................................................................................................................................................................................................................................................................................................................................................FFFFFFFFFF.............................................................FFFFFF.FFF.FFFFFFFFFFFFFFFFFFFFFFF..F + +=================================== FAILURES =================================== +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item238] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050365a60>, 'sistema/app-config/', [], 'sapl.base') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item243] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04ec17bf8>, 'sistema/bancada/', [], 'sapl.sessao') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item248] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04ec17ea0>, 'sistema/bloco/', [], 'sapl.sessao') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item253] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04ec201e0>, 'sistema/cargo-bancada/', [], 'sapl.sessao') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item258] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0503657b8>, 'sistema/casa-legislativa/', [], 'sapl.base') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item263] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9c6620>, 'sistema/coligacao/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item273] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036cb70>, 'sistema/comissao/cargo/', [], 'sapl.comissoes') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item278] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036ce18>, 'sistema/comissao/periodo-composicao/', [], 'sapl.comissoes') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item283] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050378158>, 'sistema/comissao/tipo/', [], 'sapl.comissoes') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item288] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9c6b70>, 'sistema/frente/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item293] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502df488>, 'sistema/lexml/provedor/', [], 'sapl.lexml') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item298] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502df730>, 'sistema/lexml/publicador/', [], 'sapl.lexml') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item303] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9f0bf8>, 'sistema/materia/autor/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item308] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9f91e0>, 'sistema/materia/orgao/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item318] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9e5b70>, 'sistema/materia/regime-tramitacao/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item323] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9f0ea0>, 'sistema/materia/status-tramitacao/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item328] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9e5e18>, 'sistema/materia/tipo-autor/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item333] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9f0158>, 'sistema/materia/tipo-documento/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item338] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9f0400>, 'sistema/materia/tipo-fim-relatoria/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item343] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9e58c8>, 'sistema/materia/tipo/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item348] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9f06a8>, 'sistema/materia/unidade-tramitacao/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item353] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9d91e0>, 'sistema/mesa-diretora/cargo-mesa/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item358] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9cfea0>, 'sistema/mesa-diretora/sessao-legislativa/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item363] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9fd510>, 'sistema/norma/assunto/', [], 'sapl.norma') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item368] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9fd268>, 'sistema/norma/tipo/', [], 'sapl.norma') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item373] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9c6e18>, 'sistema/parlamentar/legislatura/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item378] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9cf400>, 'sistema/parlamentar/nivel-instrucao/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item383] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9cfbf8>, 'sistema/parlamentar/partido/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item388] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9cf6a8>, 'sistema/parlamentar/tipo-afastamento/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item393] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9cf158>, 'sistema/parlamentar/tipo-dependente/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item398] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9cf950>, 'sistema/parlamentar/tipo-militar/', [], 'sapl.parlamentares') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item403] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9e5620>, 'sistema/proposicao/autor/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item408] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9e5378>, 'sistema/proposicao/tipo/', [], 'sapl.materia') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item420] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04ec17950>, 'sistema/sessao-plenaria/tipo-expediente/', [], 'sapl.sessao') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item425] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04ec176a8>, 'sistema/sessao-plenaria/tipo-resultado-votacao/', [], 'sapl.sessao') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item430] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04ec17400>, 'sistema/sessao-plenaria/tipo/', [], 'sapl.sessao') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item435] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e400>, 'sistema/status-tramitacao-adm/', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +________ test_crudaux_list_do_crud_esta_na_pagina_sistema[url_item440] _________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e158>, 'sistema/tipo-documento-adm/', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_crudaux_list_do_crud_esta_na_pagina_sistema(url_item, admin_client): + + # Verifica a url é de um CrudAux e, se for, testa se está + # na página Tabelas Auxiliares + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + view_class = None + if hasattr(key, 'view_class'): + view_class = key.view_class + + # se não tem view_class, possivelmente não é uma classed base view + if not view_class: + return + + # se não tem atributo crud, não é será nenhum tipo de crud + if not hasattr(view_class, 'crud'): + return + + herancas_crud = list(map(str, type.mro(view_class.crud))) + for string_class in herancas_crud: + if 'CrudAux' in string_class: + + herancas_view = list(map(str, type.mro(view_class))) + + for string_view_class in herancas_view: + # verifica se o link para manutenção do crud está em /sistema + if 'ListView' in string_view_class: +> response = admin_client.get('/sistema', {}, follow=True) + +sapl/test_urls.py:141: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +_________________________ test_urlpatterns[url_item16] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9d9510>, 'docadm/', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item17] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98fd90>, 'docadm/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item18] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98fea0>, 'docadm/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/1/delete) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item19] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98fe18>, 'docadm/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/1/edit) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item20] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9d97b8>, 'docadm/create', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/create) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item21] _________________________ + +url_item = (, 'docadm/doc-ace-adm/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-ace-adm/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item22] _________________________ + +url_item = (, 'docadm/doc-ace-adm/edit/%(pk)s/%(ano)s', ['pk', 'ano'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-ace-adm/edit/1/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item23] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98ff28>, 'docadm/doc-acessorio/', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-acessorio/) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item24] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502800d0>, 'docadm/doc-acessorio/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-acessorio/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item25] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502801e0>, 'docadm/doc-acessorio/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-acessorio/1/delete) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item26] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280158>, 'docadm/doc-acessorio/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-acessorio/1/edit) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item27] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280048>, 'docadm/doc-acessorio/create', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-acessorio/create) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item28] _________________________ + +url_item = (, 'docadm/doc-adm/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/doc-adm/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item29] _________________________ + +url_item = (, 'docadm/pesq-doc-adm', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/pesq-doc-adm) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item30] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280268>, 'docadm/tramitacao-doc-adm/%(pk)s/tramitacaoadministrativo', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/tramitacao-doc-adm/1/tramitacaoadministrativo) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item31] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502802f0>, 'docadm/tramitacao-doc-adm/%(pk)s/tramitacaoadministrativo/create', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/tramitacao-doc-adm/1/tramitacaoadministrativo/create) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item32] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280378>, 'docadm/tramitacao-doc-adm/tramitacaoadministrativo/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/tramitacao-doc-adm/tramitacaoadministrativo/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item33] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280488>, 'docadm/tramitacao-doc-adm/tramitacaoadministrativo/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/tramitacao-doc-adm/tramitacaoadministrativo/1/delete) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +_________________________ test_urlpatterns[url_item34] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280400>, 'docadm/tramitacao-doc-adm/tramitacaoadministrativo/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/docadm/tramitacao-doc-adm/tramitacaoadministrativo/1/edit) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item435] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e400>, 'sistema/status-tramitacao-adm/', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/status-tramitacao-adm/) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item436] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e510>, 'sistema/status-tramitacao-adm/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/status-tramitacao-adm/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item437] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e620>, 'sistema/status-tramitacao-adm/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/status-tramitacao-adm/1/delete) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item438] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e598>, 'sistema/status-tramitacao-adm/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/status-tramitacao-adm/1/edit) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item439] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e488>, 'sistema/status-tramitacao-adm/create', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/status-tramitacao-adm/create) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item440] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e158>, 'sistema/tipo-documento-adm/', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/tipo-documento-adm/) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item441] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e268>, 'sistema/tipo-documento-adm/%(pk)s', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/tipo-documento-adm/1) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item442] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e378>, 'sistema/tipo-documento-adm/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/tipo-documento-adm/1/delete) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item443] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e2f0>, 'sistema/tipo-documento-adm/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/tipo-documento-adm/1/edit) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +________________________ test_urlpatterns[url_item444] _________________________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f91e1e0>, 'sistema/tipo-documento-adm/create', [], 'sapl.protocoloadm') +admin_client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_urlpatterns(url_item, admin_client): + + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + assert '\n' not in url, """ + A url (%s) da app (%s) está mal formada. + """ % (app_name, url) + + app_name = app_name[5:] + + assert app_name in apps_url_patterns_prefixs_and_users, """ + A app (%s) da url (%s) não consta na lista de prefixos do teste + """ % (app_name, url) + + if app_name in apps_url_patterns_prefixs_and_users: + prefixs = apps_url_patterns_prefixs_and_users[app_name]['prefixs'] + + isvalid = False + for prefix in prefixs: + if url.startswith(prefix): + isvalid = True + break + +> assert isvalid, """ + O prefixo da url (%s) não está no padrão de sua app (%s). + Os prefixos permitidos são: + %s + """ % (url, app_name, prefixs) +E AssertionError: +E O prefixo da url (/sistema/tipo-documento-adm/create) não está no padrão de sua app (protocoloadm). +E Os prefixos permitidos são: +E ['/protocoloadm', '/docadm/sistema'] +E +E assert False + +sapl/test_urls.py:254: AssertionError +______________ test_permissions_urls_for_users_by_apps[url_item3] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c620>, 'comissao/%(pk)s/composicao/create', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('7bpa3uesppy7ns1gsx9sm5lcsnyo5hn3', datetime.datetime(2016, 10, 11, 14, 15, 15, 423886, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/1/composicao/create +______________ test_permissions_urls_for_users_by_apps[url_item4] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c510>, 'comissao/%(pk)s/delete', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_geral {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/1/delete +______________ test_permissions_urls_for_users_by_apps[url_item5] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c488>, 'comissao/%(pk)s/edit', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('7jt6whgolvs7ftcx9yzp2xave7o5xvnt', datetime.datetime(2016, 10, 11, 14, 15, 19, 387079, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/1/edit +______________ test_permissions_urls_for_users_by_apps[url_item6] ______________ + +url_item = (, 'comissao/%(pk)s/materias-em-tramitacao', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/1/materias-em-tramitacao +______________ test_permissions_urls_for_users_by_apps[url_item7] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c840>, 'comissao/%(pk)s/participacao', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('blz7if1xg2odotvm7i641shbhcp3mxq4', datetime.datetime(2016, 10, 11, 14, 15, 22, 611850, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_painel {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/1/participacao +______________ test_permissions_urls_for_users_by_apps[url_item8] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c8c8>, 'comissao/%(pk)s/participacao/create', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('l9rjsnqyvvtkqoqjc3mhledk1q9rl7hr', datetime.datetime(2016, 10, 11, 14, 15, 24, 382486, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/1/participacao/create +_____________ test_permissions_urls_for_users_by_apps[url_item10] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c7b8>, 'comissao/composicao/%(pk)s/delete', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('u14b676mus329iqw81o8l3rcqlgnj6q9', datetime.datetime(2016, 10, 11, 14, 15, 27, 591360, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/composicao/1/delete +_____________ test_permissions_urls_for_users_by_apps[url_item11] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c730>, 'comissao/composicao/%(pk)s/edit', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('rq6fh5ia0ac9v4gzdoz1vcv7kabco7wt', datetime.datetime(2016, 10, 11, 14, 15, 29, 342310, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/composicao/1/edit +_____________ test_permissions_urls_for_users_by_apps[url_item12] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c378>, 'comissao/create', [], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('p0viey88gte42ifykp8uw4lijujkgryx', datetime.datetime(2016, 10, 11, 14, 15, 31, 253921, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/create +_____________ test_permissions_urls_for_users_by_apps[url_item14] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036ca60>, 'comissao/participacao/%(pk)s/delete', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('n1ponlaf0agb3hqg6ie1fj6cy42qkm0y', datetime.datetime(2016, 10, 11, 14, 15, 34, 667815, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/participacao/1/delete +_____________ test_permissions_urls_for_users_by_apps[url_item15] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc05036c9d8>, 'comissao/participacao/%(pk)s/edit', ['pk'], 'sapl.comissoes') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('bpl6gfizvrbeymgz036oiuc91hkxq5dk', datetime.datetime(2016, 10, 11, 14, 15, 37, 451057, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_comissoes': ['/comissao'], 'operador_geral': ['/sistema', '/comissao']} /comissao/participacao/1/edit +_____________ test_permissions_urls_for_users_by_apps[url_item16] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9d9510>, 'docadm/', [], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('fz8bb6icn6cdi0wz8wlx3hn1prkgb75v', datetime.datetime(2016, 10, 11, 14, 15, 40, 286646, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/ +_____________ test_permissions_urls_for_users_by_apps[url_item17] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98fd90>, 'docadm/%(pk)s', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/1 +_____________ test_permissions_urls_for_users_by_apps[url_item18] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98fea0>, 'docadm/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/1/delete +_____________ test_permissions_urls_for_users_by_apps[url_item19] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98fe18>, 'docadm/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/1/edit +_____________ test_permissions_urls_for_users_by_apps[url_item20] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f9d97b8>, 'docadm/create', [], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('jlcqaw2862k14g7peuhvw4jdiikkqlwj', datetime.datetime(2016, 10, 11, 14, 15, 48, 562375, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/create +_____________ test_permissions_urls_for_users_by_apps[url_item21] ______________ + +url_item = (, 'docadm/doc-ace-adm/%(pk)s', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('68us1rdd3hs8t1a7jxfl2ujqzl2h5zq1', datetime.datetime(2016, 10, 11, 14, 15, 50, 180925, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-ace-adm/1 +_____________ test_permissions_urls_for_users_by_apps[url_item22] ______________ + +url_item = (, 'docadm/doc-ace-adm/edit/%(pk)s/%(ano)s', ['pk', 'ano'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-ace-adm/edit/1/1 +_____________ test_permissions_urls_for_users_by_apps[url_item23] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc04f98ff28>, 'docadm/doc-acessorio/', [], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('3khibaw474loj6q1g2j5j97gwkms2pza', datetime.datetime(2016, 10, 11, 14, 15, 54, 101230, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-acessorio/ +_____________ test_permissions_urls_for_users_by_apps[url_item24] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502800d0>, 'docadm/doc-acessorio/%(pk)s', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-acessorio/1 +_____________ test_permissions_urls_for_users_by_apps[url_item25] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502801e0>, 'docadm/doc-acessorio/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-acessorio/1/delete +_____________ test_permissions_urls_for_users_by_apps[url_item26] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280158>, 'docadm/doc-acessorio/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-acessorio/1/edit +_____________ test_permissions_urls_for_users_by_apps[url_item27] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280048>, 'docadm/doc-acessorio/create', [], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('xhve3xe2zi66umdru23jg4ycic21mz5v', datetime.datetime(2016, 10, 11, 14, 16, 4, 514192, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-acessorio/create +_____________ test_permissions_urls_for_users_by_apps[url_item28] ______________ + +url_item = (, 'docadm/doc-adm/%(pk)s', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/doc-adm/1 +_____________ test_permissions_urls_for_users_by_apps[url_item29] ______________ + +url_item = (, 'docadm/pesq-doc-adm', [], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('zi3fqs79ieqmx1tcvf7te0h5l8tgwvz3', datetime.datetime(2016, 10, 11, 14, 16, 8, 167065, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/pesq-doc-adm +_____________ test_permissions_urls_for_users_by_apps[url_item30] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280268>, 'docadm/tramitacao-doc-adm/%(pk)s/tramitacaoadministrativo', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/tramitacao-doc-adm/1/tramitacaoadministrativo +_____________ test_permissions_urls_for_users_by_apps[url_item31] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc0502802f0>, 'docadm/tramitacao-doc-adm/%(pk)s/tramitacaoadministrativo/create', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/tramitacao-doc-adm/1/tramitacaoadministrativo/create +_____________ test_permissions_urls_for_users_by_apps[url_item32] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280378>, 'docadm/tramitacao-doc-adm/tramitacaoadministrativo/%(pk)s', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/tramitacao-doc-adm/tramitacaoadministrativo/1 +_____________ test_permissions_urls_for_users_by_apps[url_item33] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280488>, 'docadm/tramitacao-doc-adm/tramitacaoadministrativo/%(pk)s/delete', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/tramitacao-doc-adm/tramitacaoadministrativo/1/delete +_____________ test_permissions_urls_for_users_by_apps[url_item34] ______________ + +url_item = (._add_base..CrudViewWithBase at 0x7fc050280400>, 'docadm/tramitacao-doc-adm/tramitacaoadministrativo/%(pk)s/edit', ['pk'], 'sapl.protocoloadm') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:206: in render + return self._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:173: in render + return compiled_parent._render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/utils.py:92: in instrumented_test_render + return self.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/loader_tags.py:69: in render + result = block.nodelist.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:992: in render + bit = node.render_annotated(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:959: in render_annotated + return self.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:319: in render + match = condition.eval(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/defaulttags.py:951: in eval + return self.value.resolve(context, ignore_failures=True) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:736: in resolve + new_obj = func(obj, *arg_vals) +sapl/base/templatetags/common_tags.py:92: in get_doc_adm_template_perms + app_config = AppConfig.objects.last() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:559: in last + objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_appconfig"."id", "base_appconfig"."documentos_administrativos", "base_appconfig"."sequencia_numeracao", ..._materia", "base_appconfig"."texto_articulado_norma" FROM "base_appconfig" ORDER BY "base_appconfig"."id" DESC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.ProgrammingError: column base_appconfig.texto_articulado_proposicao does not exist +E LINE 1: ...cia_numeracao", "base_appconfig"."painel_aberto", "base_appc... +E ^ + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: ProgrammingError +----------------------------- Captured stdout call ----------------------------- +operador_geral {'operador_geral': ['/sistema', '/docadm', '/protocoloadm'], 'operador_administrativo': ['/docadm'], 'operador_protocoloadm': ['/protocoloadm']} /docadm/tramitacao-doc-adm/tramitacaoadministrativo/1/edit +_____________ test_permissions_urls_for_users_by_apps[url_item35] ______________ + +url_item = (, 'login/', [], 'sapl.base') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('c1uywktes83r58cl8d3wl7q9t8slb8ic', datetime.datetime(2016, 10, 11, 14, 16, 19, 138164, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema']} /login/ +_____________ test_permissions_urls_for_users_by_apps[url_item36] ______________ + +url_item = (, 'logout/', [], 'sapl.base') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:505: in get + response = self._handle_redirects(response, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:686: in _handle_redirects + response = self.get(path, QueryDict(url.query), follow=False, **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:174: in get_response + response = self.process_exception_by_middleware(e, request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:172: in get_response + response = response.render() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:160: in render + self.content = self.rendered_content +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/response.py:137: in rendered_content + content = template.render(context, self._request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/backends/django.py:95: in render + return self.template.render(context) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/template/base.py:204: in render + with context.bind_template(self): +/usr/lib/python3.4/contextlib.py:59: in __enter__ + return next(self.gen) +../../.virtualenvs/sapl/lib/python3.4/site-packages/debug_toolbar/panels/templates/panel.py:49: in _request_context_bind_template + context = processor(self.request) +sapl/context_processors.py:7: in parliament_info + casa = get_casalegislativa() +sapl/base/views.py:26: in get_casalegislativa + return CasaLegislativa.objects.first() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:550: in first + objects = list((self if self.ordered else self.order_by('pk'))[:1]) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:258: in __iter__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "base_casalegislativa"."id", "base_casalegislativa"."codigo", "base_casalegislativa"."nome", "base_casalegisla..."base_casalegislativa"."informacao_geral" FROM "base_casalegislativa" ORDER BY "base_casalegislativa"."id" ASC LIMIT 1' +params = () + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_geral': ['/sistema']} /logout/ +_____________ test_permissions_urls_for_users_by_apps[url_item39] ______________ + +url_item = (, 'materia/%(pk)s/acompanhar-confirmar', ['pk'], 'sapl.materia') +client = + + @pytest.mark.parametrize('url_item', _lista_urls) + def test_permissions_urls_for_users_by_apps(url_item, client): + key, url, var, app_name = url_item + url = '/' + (url % {v: 1 for v in var}) + + if not get_user_model().objects.exists(): + for app in sapl_appconfs: + # readequa permissões dos models adicionando + # list e detail permissions + create_perms_post_migrate(app) + # cria usuários de perfil do sapl + cria_grupos_permissoes() + users = get_user_model().objects.values_list('username', flat=True) + + app_labels = app_name.split('.')[1] + + view = None + if hasattr(key, 'view_class'): + view = key.view_class() + + """ + A classe PermissionRequiredForAppCrudMixin pode ser usada em uma + app mas envolver permissoes para outras + como é o caso de PainelView que está na app 'sessao' + mas é um redirecionamento para 'painel'... aqui é feita + a troca da app a ser testada, por essas outras possíveis. + + Este, até a ultima versão deste teste é o único tipo de view que + possui restrição restrição simples, por permissão, e não por + container, como é o caso de proposições que possui restrição + por usuário e não só por, ou não tem, o campo permission_required + """ + if PermissionRequiredForAppCrudMixin in type.mro(key.view_class): + # essa classe deve informar app_label + assert hasattr(key.view_class, 'app_label') + # app_label deve ter conteudo + assert key.view_class.app_label + app_labels = key.view_class.app_label + else: + + if hasattr(view, 'permission_required') and \ + view.permission_required is not None and\ + len(view.permission_required) == 0: + """ + condição do Crud, se tem permission_required e ele é igual [], + então é uma view pública, teste liberado. + """ + return + else: + """ + Views que não se encaixam nãs condições acima, podem possuir + ou não restrição de acesso. Se o código continuar, + será tratado como tentativa de validar pois é possível + ter restrição local, como uma anotação method_required. + Caberá ao desenvolvedor de uma nova view, se for pública e + sem necessidade de nenhum tratamento de permissão, para limpar + o teste to py.test adicionar sua url + representativa na variavel externa ao teste: + + urls_publicas_excecoes, logo acima do teste + """ + pass + + if isinstance(app_labels, str): + app_labels = app_labels, + + for app in app_labels: + + assert app in apps_url_patterns_prefixs_and_users, """ + O app_label (%s) associado a url (%s) não está na base de testes. + %s + """ % (app_name, url) + + if 'users' not in apps_url_patterns_prefixs_and_users[app]: + continue + + users_for_url_atual_app = apps_url_patterns_prefixs_and_users[ + app]['users'] + + for username in users: + print(username, users_for_url_atual_app, url) + + client.login(username=username, password='interlegis') + + rg = None + try: + if url not in urls_publicas_excecoes['get']: + rg = client.get(url, {}, follow=True) + except: + pass + + rp = None + try: + if url not in urls_publicas_excecoes['post']: + rp = client.post(url, {}, follow=True) + except: + pass + + """ + devido às urls serem incompletas ou com pks e outras valores + inexistentes na base, iniciar a execução da view, seja por get, + post ou qualquer outro método pode causar o erro... + por isso o "try ... except" acima. + No entanto, o objetivo do teste é validar o acesso de toda url. + Independente do erro que vá acontecer, esse erro não ocorrerá + se o user não tiver permissão de acesso pelo fato de que "AS + VIEWS BEM FORMADAS PARA VALIDAÇÃO DE ACESSO DEVEM SEMPRE + REDIRECIONAR PARA + LOGIN ANTES DE SUA EXECUÇÃO", desta forma nunca gerando erro + interno dada qualquer incoerência de parâmetros nas urls + """ + + for _type, content in ( + ('get', str(rg.content if rg else '')), + ('post', str(rp.content if rp else ''))): + + if not content: + continue + + def _assert_login(_in): + if _in: + assert btn_login in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) deveria ser redirecionado + para tela de login. + """ % (_type, url, app, username) + else: + assert btn_login not in content, """ + No teste de requisição "%s" a url (%s). + App (%s) + O usuário (%s) não deveria ser redirecionado + para tela de login. Se essa é uma url + invariavelmente pública, a adicione na variavel + abaixo localizada no arquivo que se encontra este + teste: + + urls_publicas_excecoes + + + """ % (_type, url, app, username) + + if username not in users_for_url_atual_app: + # se não é usuário da app deve ser redirecionado para login + _assert_login(True) + else: + prefixs = users_for_url_atual_app[username] + for pr in prefixs: + if url.startswith(pr): + _assert_login(False) + break + +> client.get('/logout/', follow=True) + +sapl/test_urls.py:473: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:503: in get + **extra) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:304: in get + return self.generic('GET', path, secure=secure, **r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:380: in generic + return self.request(**r) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/test/client.py:467: in request + six.reraise(*exc_info) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:686: in reraise + raise value +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/core/handlers/base.py:123: in get_response + response = middleware_method(request) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/middleware/locale.py:25: in process_request + request, check_path=self.is_language_prefix_patterns_used) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/__init__.py:199: in get_language_from_request + return _trans.get_language_from_request(request, check_path) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/translation/trans_real.py:494: in get_language_from_request + lang_code = request.session.get(LANGUAGE_SESSION_KEY) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:61: in get + return self._session.get(key, default) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/base.py:201: in _get_session + self._session_cache = self.load() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/contrib/sessions/backends/db.py:33: in load + expire_date__gt=timezone.now() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/manager.py:122: in manager_method + return getattr(self.get_queryset(), name)(*args, **kwargs) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:381: in get + num = len(clone) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:240: in __len__ + self._fetch_all() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:1074: in _fetch_all + self._result_cache = list(self.iterator()) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/query.py:52: in __iter__ + results = compiler.execute_sql() +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/models/sql/compiler.py:848: in execute_sql + cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: in execute + return self.cursor.execute(sql, params) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/utils.py:95: in __exit__ + six.reraise(dj_exc_type, dj_exc_value, traceback) +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/utils/six.py:685: in reraise + raise value.with_traceback(tb) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +sql = 'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s)' +params = ('uvoajg1ljw8wo30glsjnaridxyjxvv92', datetime.datetime(2016, 10, 11, 14, 16, 24, 515850, tzinfo=)) + + def execute(self, sql, params=None): + self.db.validate_no_broken_transaction() + with self.db.wrap_database_errors: + if params is None: + return self.cursor.execute(sql) + else: +> return self.cursor.execute(sql, params) +E django.db.utils.InternalError: current transaction is aborted, commands ignored until end of transaction block + +../../.virtualenvs/sapl/lib/python3.4/site-packages/django/db/backends/utils.py:64: InternalError +----------------------------- Captured stdout call ----------------------------- +operador_administrativo {'operador_autor': ['/proposicao'], 'operador_geral': ['/sistema', '/materia'], 'operador_materia': ['/materia']} /materia/1/acompanhar-confirmar +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! KeyboardInterrupt !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +to show a full traceback on KeyboardInterrupt use --fulltrace +/usr/lib/python3.4/ast.py:172: KeyboardInterrupt +========= 100 failed, 1449 passed, 1 pytest-warnings in 159.31 seconds ========= diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 77a06f7e1..74392abd6 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -289,7 +289,7 @@ urls_publicas_excecoes = { ], 'post': [ '/norma/pesquisa-resultado', - '/mesa-diretora/' # tratamento de permissão interno. + '/mesa-diretora/', # tratamento de permissão interno. '/sessao/1/resumo', '/sessao/pauta-sessao', '/sessao/pauta-sessao/1', diff --git a/teste.py b/teste.py new file mode 100644 index 000000000..c58094d0f --- /dev/null +++ b/teste.py @@ -0,0 +1,9 @@ +]0;IPython: Documents/saplVIRTUAL_ENV -> /home/eduardo/.virtualenvs/sapl/lib/python3.4/site-packages +============================= test session starts ============================== +platform linux -- Python 3.4.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 +django settings: sapl.settings (from ini file) +rootdir: /home/eduardo/Documents/sapl, inifile: pytest.ini +plugins: cov-2.3.0, django-2.9.1, ipdb-0.1-prerelease2 +collected 2515 items + +sapl/test_urls.py ...F \ No newline at end of file From c4cf3982540818f9e76f6aa9e66d60caf67f23d9 Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 11 Oct 2016 11:48:29 -0300 Subject: [PATCH 5/5] Remove arquivo teste --- teste.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 teste.py diff --git a/teste.py b/teste.py deleted file mode 100644 index c58094d0f..000000000 --- a/teste.py +++ /dev/null @@ -1,9 +0,0 @@ -]0;IPython: Documents/saplVIRTUAL_ENV -> /home/eduardo/.virtualenvs/sapl/lib/python3.4/site-packages -============================= test session starts ============================== -platform linux -- Python 3.4.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -django settings: sapl.settings (from ini file) -rootdir: /home/eduardo/Documents/sapl, inifile: pytest.ini -plugins: cov-2.3.0, django-2.9.1, ipdb-0.1-prerelease2 -collected 2515 items - -sapl/test_urls.py ...F \ No newline at end of file