From debc275fb22746013aca571ed1023fa044a64357 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Sat, 8 Oct 2016 14:37:46 -0300 Subject: [PATCH] Fix #715 --- sapl/compilacao/compilacao_data_tables.sql | 44 ++++---- sapl/compilacao/models.py | 4 +- sapl/compilacao/views.py | 116 ++++++++++++--------- sapl/sessao/forms.py | 24 ++--- sapl/sessao/urls.py | 12 ++- sapl/test_urls.py | 9 +- scripts/lista_urls.py | 3 +- 7 files changed, 116 insertions(+), 96 deletions(-) diff --git a/sapl/compilacao/compilacao_data_tables.sql b/sapl/compilacao/compilacao_data_tables.sql index 00985a371..d0d815b58 100644 --- a/sapl/compilacao/compilacao_data_tables.sql +++ b/sapl/compilacao/compilacao_data_tables.sql @@ -222,28 +222,28 @@ INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (120, 119, true, 1, 1, false); INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (120, 119, true, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 117, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 117, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 116, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 116, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 115, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 115, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 114, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 114, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 113, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 113, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 112, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 112, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 111, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 111, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 101, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 101, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 102, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 102, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 103, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 103, false, 2, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 1, 1, true); -INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 2, 1, true); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 117, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 117, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 116, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 116, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 115, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 115, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 114, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 114, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 113, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 113, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 112, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 112, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 111, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 111, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 101, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 101, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 102, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 102, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 103, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 103, false, 2, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 1, -1, false); +INSERT INTO compilacao_tipodispositivorelationship (filho_permitido_id, pai_id, filho_de_insercao_automatica, perfil_id, quantidade_permitida, permitir_variacao) VALUES (125, 104, false, 2, -1, false); diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py index 9fa6fec37..da2708cfe 100644 --- a/sapl/compilacao/models.py +++ b/sapl/compilacao/models.py @@ -1210,7 +1210,7 @@ class Dispositivo(BaseModel, TimestampedMixin): dp.nivel = dispositivo_base.nivel dp.texto = '' dp.visibilidade = True - #dp.auto_inserido = dispositivo_base.auto_inserido + # dp.auto_inserido = dispositivo_base.auto_inserido dp.ta = dispositivo_base.ta dp.dispositivo_pai = dispositivo_base.dispositivo_pai dp.publicacao = dispositivo_base.publicacao @@ -1246,7 +1246,7 @@ class Dispositivo(BaseModel, TimestampedMixin): if disps.exists(): dispositivo.set_numero_completo( disps[0].get_numero_completo()) - dispositivo.transform_in_next() + # dispositivo.transform_in_next() else: dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ]) else: diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py index 3fae0fea8..c125b3688 100644 --- a/sapl/compilacao/views.py +++ b/sapl/compilacao/views.py @@ -1577,24 +1577,9 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): def allowed_inserts(self, _base=None): request = self.request try: - if request and 'perfil_estrutural' not in request.session: - self.set_perfil_in_session(request) - - perfil_pk = request.session['perfil_estrutural'] - base = Dispositivo.objects.get( pk=self.kwargs['dispositivo_id'] if not _base else _base) - prox_possivel = Dispositivo.objects.filter( - ordem__gt=base.ordem, - nivel__lte=base.nivel, - ta_id=base.ta_id)[:1] - - if prox_possivel.exists(): - prox_possivel = prox_possivel[0] - else: - prox_possivel = None - result = [{'tipo_insert': force_text(string_concat( _('Inserir Após'), ' ', @@ -1612,10 +1597,24 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): {'tipo_insert': force_text(_('Inserir Antes')), 'icone': '↶ ', 'action': 'json_add_prior', - 'itens': []} - ] + 'itens': []}] + + if request and 'perfil_estrutural' not in request.session: + self.set_perfil_in_session(request) + + perfil_pk = request.session['perfil_estrutural'] + + prox_possivel = Dispositivo.objects.filter( + ordem__gt=base.ordem, + nivel__lte=base.nivel, + ta_id=base.ta_id)[:1] - # Possíveis inserções sequenciais já existentes + if prox_possivel.exists(): + prox_possivel = prox_possivel[0] + else: + prox_possivel = None + + # Possíveis inserções de nível já existentes parents = base.get_parents() parents.insert(0, base) nivel = sys.maxsize @@ -1769,38 +1768,60 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): else: Dispositivo.set_numero_for_add_in(base, base, td) - r = [{'class_css': td.class_css, - 'tipo_pk': td.pk, - 'variacao': 0, - 'provavel': '%s (%s)' % ( - base.rotulo_padrao(1, paradentro), - td.nome,), - 'dispositivo_base': base.pk}] + r = [] + + flag_pv = td.permitido_variacao(tipb, perfil_pk=perfil_pk) + + if td.contagem_continua and flag_pv: + flag_direcao = 1 + flag_variacao = 0 + while True: + if base.dispositivo0 == 0: + local_insert = 1 + else: + local_insert = 0 + + rt = base.transform_in_next(flag_direcao) + if not rt[0]: + break + flag_variacao += rt[1] + r.append({'class_css': td.class_css, + 'tipo_pk': td.pk, + 'variacao': flag_variacao, + 'provavel': '%s (%s)' % ( + base.rotulo_padrao(local_insert), + base.tipo_dispositivo.nome,), + 'dispositivo_base': base.pk}) + + flag_direcao = -1 + + r.reverse() + + if len(r) > 0 and td.formato_variacao0 == \ + TipoDispositivo.FNCN: + r = [r[0], ] + else: + if td.contagem_continua: + base.transform_in_next() + r = [{'class_css': td.class_css, + 'tipo_pk': td.pk, + 'variacao': 0, + 'provavel': '%s (%s)' % ( + base.rotulo_padrao(1, paradentro), + td.nome,), + 'dispositivo_base': base.pk}] if paradentro == 1: - """if (tipb.class_css == 'caput' and - td.class_css == 'paragrafo'): - result[0]['itens'].insert(0, r[0]) - else:""" result[1]['itens'] += r else: result[2]['itens'] += r result[0]['itens'] += r - # if len(result[0]['itens']) < len(result[1]['itens']): - # r = result[0] - # result.remove(result[0]) - # result.insert(1, r) - - # remover temporariamente a opção inserir antes - # confirmar necessidade + # FIXME para liberar as opções de inserção antes, + # o método json_add_prior deve ser implementado if len(result) > 2: result.pop() - # if tipb.dispositivo_de_articulacao and\ - # tipb.dispositivo_de_alteracao: - # result.pop() - return result except Exception as e: @@ -1912,15 +1933,13 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin): ordem__lte=base.ordem, ordem__gte=parents[-1].ordem, tipo_dispositivo_id=tipo.pk, - ta_id=base.ta_id)[:1] + ta_id=base.ta_id).first() - if not ultimo_irmao.exists(): - dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) - else: - ultimo_irmao = ultimo_irmao[0] - dp.set_numero_completo( - ultimo_irmao.get_numero_completo()) - dp.transform_in_next() + dp.set_numero_completo( + [1, 0, 0, 0, 0, 0, ] if not ultimo_irmao else + ultimo_irmao.get_numero_completo()) + if ultimo_irmao: + dp.transform_in_next(variacao) else: if ';' in tipo.rotulo_prefixo_texto: dp.set_numero_completo([0, 0, 0, 0, 0, 0, ]) @@ -2198,7 +2217,6 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin, def json_add_next_registra_inclusao( self, context, local_add='json_add_next'): - base = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id']) bloco_alteracao = Dispositivo.objects.get(pk=context['pk_bloco']) data = {} diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index b38997972..fa5694777 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -15,8 +15,7 @@ from sapl.parlamentares.models import Parlamentar from sapl.utils import RANGE_DIAS_MES, RANGE_MESES, autor_label, autor_modal from .models import (Bancada, ExpedienteMateria, Orador, OradorExpediente, - OrdemDia, PresencaOrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca) + OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca) def recupera_anos(): @@ -203,6 +202,7 @@ class SessaoPlenariaFilterSet(django_filters.FilterSet): class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): + class Meta: model = MateriaLegislativa fields = ['numero', @@ -278,16 +278,16 @@ class AdicionarVariasMateriasFilterSet(MateriaLegislativaFilterSet): class OradorForm(ModelForm): def __init__(self, *args, **kwargs): - super(OradorForm, self).__init__(*args, **kwargs) + super(OradorForm, self).__init__(*args, **kwargs) - id_sessao = int(self.initial['id_sessao']) + id_sessao = int(self.initial['id_sessao']) - ids = [s.parlamentar.id for - s in SessaoPlenariaPresenca.objects.filter( - sessao_plenaria_id=id_sessao)] + ids = [s.parlamentar.id for + s in SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=id_sessao)] - self.fields['parlamentar'].queryset = Parlamentar.objects.filter( - id__in=ids).order_by('nome_completo') + self.fields['parlamentar'].queryset = Parlamentar.objects.filter( + id__in=ids).order_by('nome_completo') class Meta: model = Orador @@ -297,10 +297,10 @@ class OradorForm(ModelForm): class OradorExpedienteForm(ModelForm): def __init__(self, *args, **kwargs): - super(OradorExpedienteForm, self).__init__(*args, **kwargs) + super(OradorExpedienteForm, self).__init__(*args, **kwargs) - self.fields['parlamentar'].queryset = Parlamentar.objects.filter( - ativo=True).order_by('nome_completo') + self.fields['parlamentar'].queryset = Parlamentar.objects.filter( + ativo=True).order_by('nome_completo') class Meta: model = OradorExpediente diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 1e7bf11a2..8e209b104 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -54,7 +54,8 @@ urlpatterns = [ abrir_votacao_ordem_view, name="abrir_votacao"), url(r'^sessao/(?P\d+)/reordenar-expediente$', - reordernar_materias_expediente, name="reordenar_expediente"), + reordernar_materias_expediente, + name="reordenar_expediente"), url(r'^sessao/(?P\d+)/reordenar-ordem$', reordernar_materias_ordem, name="reordenar_ordem"), url(r'^sessao/rest/', include(sessao_rest)), @@ -105,15 +106,18 @@ urlpatterns = [ PesquisarSessaoPlenariaView.as_view(), name='pesquisar_sessao'), url(r'^sessao/(?P\d+)/matordemdia/votnom/(?P\d+)/(?P\d+)$', VotacaoNominalView.as_view(), name='votacaonominal'), - url(r'^sessao/(?P\d+)/matordemdia/votnom/edit/(?P\d+)/(?P\d+)$', + url(r'^sessao/(?P\d+)/matordemdia/votnom' + '/edit/(?P\d+)/(?P\d+)$', VotacaoNominalEditView.as_view(), name='votacaonominaledit'), url(r'^sessao/(?P\d+)/matordemdia/votsec/(?P\d+)/(?P\d+)$', VotacaoView.as_view(), name='votacaosecreta'), - url(r'^sessao/(?P\d+)/matordemdia/votsec/view/(?P\d+)/(?P\d+)$', + url(r'^sessao/(?P\d+)/matordemdia/votsec' + '/view/(?P\d+)/(?P\d+)$', VotacaoEditView.as_view(), name='votacaosecretaedit'), url(r'^sessao/(?P\d+)/matordemdia/votsimb/(?P\d+)/(?P\d+)$', VotacaoView.as_view(), name='votacaosimbolica'), - url(r'^sessao/(?P\d+)/matordemdia/votsimb/view/(?P\d+)/(?P\d+)$', + url(r'^sessao/(?P\d+)/matordemdia/votsimb' + '/view/(?P\d+)/(?P\d+)$', VotacaoEditView.as_view(), name='votacaosimbolicaedit'), url(r'^sessao/(?P\d+)/matexp/votnom/(?P\d+)/(?P\d+)$', VotacaoNominalExpedienteView.as_view(), name='votacaonominalexp'), diff --git a/sapl/test_urls.py b/sapl/test_urls.py index 5001f6033..55802b002 100644 --- a/sapl/test_urls.py +++ b/sapl/test_urls.py @@ -1,11 +1,11 @@ +import pytest from django.apps import apps from django.contrib.auth import get_user_model from django.contrib.auth.management import _get_all_permissions from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType -from django.utils.translation import string_concat from django.utils.translation import ugettext_lazy as _ -import pytest +from django.utils.translation import string_concat from sapl.crud.base import PermissionRequiredForAppCrudMixin from scripts.inicializa_grupos_autorizacoes import cria_grupos_permissoes @@ -13,7 +13,6 @@ from scripts.lista_urls import lista_urls from .settings import SAPL_APPS - pytestmark = pytest.mark.django_db sapl_appconfs = [apps.get_app_config(n[5:]) for n in SAPL_APPS] @@ -244,7 +243,7 @@ def em_construcao_crud_permissions_urls(urls_app, client): """ A classe PermissionRequiredForAppCrudMixin pode ser usada em uma - app mas envolver permissoes para outras + 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 a urls_app a ser testada, por essas outras possíveis @@ -333,4 +332,4 @@ def em_construcao_crud_permissions_urls(urls_app, client): url.startswith('/sistema/'): assert btn_login not in str(rp.content) - logout = client.get('/logout/', follow=True) + client.get('/logout/', follow=True) diff --git a/scripts/lista_urls.py b/scripts/lista_urls.py index e53169080..4c940f0c2 100644 --- a/scripts/lista_urls.py +++ b/scripts/lista_urls.py @@ -8,9 +8,8 @@ if __name__ == '__main__': django.setup() if True: - from django.apps import apps from sapl.urls import urlpatterns - from django.core.urlresolvers import RegexURLResolver, RegexURLPattern + from django.core.urlresolvers import RegexURLResolver class ListaUrls():