From c76136cb6d41b03d4b0fdeee0fcc47c00e23dcbf Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Sat, 28 Oct 2023 14:39:14 -0700 Subject: [PATCH 01/81] =?UTF-8?q?Apaga=20Numera=C3=A7=C3=A3o=20se=20TipoMa?= =?UTF-8?q?teriaLegislativa=20=C3=A9=20apagado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0085_auto_20231028_1838.py | 19 +++++++++++++++++++ sapl/materia/models.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 sapl/materia/migrations/0085_auto_20231028_1838.py diff --git a/sapl/materia/migrations/0085_auto_20231028_1838.py b/sapl/materia/migrations/0085_auto_20231028_1838.py new file mode 100644 index 000000000..3531d7b7d --- /dev/null +++ b/sapl/materia/migrations/0085_auto_20231028_1838.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.28 on 2023-10-28 21:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0084_auto_20231007_2149'), + ] + + operations = [ + migrations.AlterField( + model_name='numeracao', + name='tipo_materia', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.TipoMateriaLegislativa', verbose_name='Tipo de Matéria'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 4c4109354..f81758dcc 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -624,7 +624,7 @@ class Numeracao(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) tipo_materia = models.ForeignKey( TipoMateriaLegislativa, - on_delete=models.PROTECT, + on_delete=models.CASCADE, verbose_name=_('Tipo de Matéria')) numero_materia = models.CharField(max_length=5, verbose_name=_('Número')) From 0e23896d3b65fe45cc657b9fc7521a0f205b4796 Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Sat, 28 Oct 2023 19:23:10 -0300 Subject: [PATCH 02/81] fix: padroniza nome_parlamentar para lista de presenca e votacoes nominais no resumo da ata (#3687) Co-authored-by: joao --- sapl/sessao/views.py | 2 +- sapl/templates/sessao/blocos_ata/assinaturas.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index f11efbc06..104d26d6b 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -2213,7 +2213,7 @@ def get_materias_ordem_do_dia(sessao_plenaria): if o.tipo_votacao == 2: for voto in VotoParlamentar.objects.filter(ordem=o.id): voto_nominal.append( - (voto.parlamentar.nome_completo, voto.voto)) + (voto.parlamentar.nome_parlamentar, voto.voto)) voto = RegistroVotacao.objects.filter(ordem=o.id).last() if voto: diff --git a/sapl/templates/sessao/blocos_ata/assinaturas.html b/sapl/templates/sessao/blocos_ata/assinaturas.html index 520215fe1..9d57eb88c 100644 --- a/sapl/templates/sessao/blocos_ata/assinaturas.html +++ b/sapl/templates/sessao/blocos_ata/assinaturas.html @@ -5,13 +5,13 @@

{% for p in assinatura_mesa %}
___________________________________________
- {{p.cargo}}: {{p.parlamentar.nome_completo}} / {% if p.parlamentar|filiacao_data_filter:object.data_inicio %} {{ p.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} + {{p.cargo}}: {{p.parlamentar.nome_parlamentar}} / {% if p.parlamentar|filiacao_data_filter:object.data_inicio %} {{ p.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}


{% endfor %} {% for p in assinatura_presentes %}
___________________________________________
- {{p.nome_completo}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} + {{p.nome_parlamentar}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}


{% endfor %} From 6a4f8422bb1f98b4470d10adca2c49afc15a26da Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Sat, 28 Oct 2023 19:23:35 -0300 Subject: [PATCH 03/81] feat: adiciona check de presenca e sessao aberta na leitura em bloco da ordem do dia (#3686) feat: adiciona check de presenca e sessao aberta na leitura em bloca da ordem do dia Co-authored-by: joao --- sapl/sessao/views.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 104d26d6b..e19cfc267 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -4425,8 +4425,14 @@ class LeituraEmBloco(PermissionRequiredForAppCrudMixin, ListView): selectedlist = request.POST.getlist('marcadas_4') if request.POST['origem'] == 'ordem': models = OrdemDia.objects.filter(id__in=selectedlist) + presenca_model = PresencaOrdemDia elif request.POST['origem'] == 'expediente': models = ExpedienteMateria.objects.filter(id__in=selectedlist) + presenca_model = SessaoPlenariaPresenca + + if (not verifica_presenca(request, presenca_model, self.kwargs['pk'], True) or + not verifica_sessao_iniciada(request, self.kwargs['pk'], True)): + return self.get(request, self.kwargs) if not models: messages.add_message(self.request, messages.ERROR, From 570002b65d1cab6361bb289f5d36dbbdfd6f0409 Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Mon, 20 Nov 2023 13:44:49 -0300 Subject: [PATCH 04/81] fix: corrige erro de loaddata cargomesa MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ao inserir o field id_ordenacao em parlamentares.CargoMesa, ao rodar migrate para geração inicial da base de dados, um erro de loaddata ocorria com o pre_popula de cargomesa, não pelos do fixture que não necessitou de alteração no json, mas pelo código do model que é usado pelo loaddata e gera um sql de inserção com o campo id_ordenacao que ainda não existe ao rodar 0008. Como é irrelevante o ponto de execução de 0008, mative este como mensagem de obsolência informando que foi migrado para 0044 por depender de 0043. --- .../migrations/0008_adiciona_cargos_mesa.py | 31 +++----------- .../migrations/0044_adiciona_cargos_mesa.py | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 sapl/parlamentares/migrations/0044_adiciona_cargos_mesa.py diff --git a/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py b/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py index fe88e6196..cab9c1158 100644 --- a/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py +++ b/sapl/parlamentares/migrations/0008_adiciona_cargos_mesa.py @@ -1,41 +1,20 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations -import json -import os - - -from django.core.management import call_command +from django.db import migrations -def gera_cargos_mesa(apps, schema_editor): - CargoMesa = apps.get_model("parlamentares", "CargoMesa") - db_alias = schema_editor.connection.alias - cargos_mesa = CargoMesa.objects.all().exists() - - if cargos_mesa: - # Caso haja algum CargoMesa cadastrado na base de dados, - # a migração não deve ser carregada para evitar duplicações de dados. - print("Carga de {} não efetuada. Já Existem {} cadastrados...".format( - CargoMesa._meta.verbose_name, CargoMesa._meta.verbose_name_plural)) - else: - fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) - # pega partidos listados em fixtures/pre_popula_partidos.json - fixture_filename = 'pre_popula_cargosmesa.json' - fixture_file = os.path.join(fixture_dir, fixture_filename) - call_command('loaddata', fixture_file) - class Migration(migrations.Migration): dependencies = [ # A dependencia real desse script é o arquivo 0001_initial.py, mas # isso gera um erro (Conflicting migrations detected; multiple leaf - # nodes in the migration graph). para não ocasionar problemas de migração, - # vamos manter a ordem padrão do django. + # nodes in the migration graph). para não ocasionar problemas de migração, + # vamos manter a ordem padrão do django. ('parlamentares', '0007_adiciona_partidos'), ] operations = [ - migrations.RunPython(gera_cargos_mesa), + # obsoleto, migrado para 0044 devido a dependência gerada por 0043 + # migrations.RunPython(gera_cargos_mesa), ] diff --git a/sapl/parlamentares/migrations/0044_adiciona_cargos_mesa.py b/sapl/parlamentares/migrations/0044_adiciona_cargos_mesa.py new file mode 100644 index 000000000..3b5277741 --- /dev/null +++ b/sapl/parlamentares/migrations/0044_adiciona_cargos_mesa.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import os + +from django.core.management import call_command +from django.db import migrations + + +def gera_cargos_mesa(apps, schema_editor): + CargoMesa = apps.get_model("parlamentares", "CargoMesa") + db_alias = schema_editor.connection.alias + cargos_mesa = CargoMesa.objects.all().exists() + + if cargos_mesa: + # Caso haja algum CargoMesa cadastrado na base de dados, + # a migração não deve ser carregada para evitar duplicações de dados. + print("Carga de {} não efetuada. Já Existem {} cadastrados...".format( + CargoMesa._meta.verbose_name, CargoMesa._meta.verbose_name_plural)) + else: + fixture_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), '../fixtures')) + # pega partidos listados em fixtures/pre_popula_partidos.json + fixture_filename = 'pre_popula_cargosmesa.json' + fixture_file = os.path.join(fixture_dir, fixture_filename) + call_command('loaddata', fixture_file) + + +class Migration(migrations.Migration): + + dependencies = [ + # A dependencia real desse script é o arquivo 0001_initial.py, mas + # isso gera um erro (Conflicting migrations detected; multiple leaf + # nodes in the migration graph). para não ocasionar problemas de migração, + # vamos manter a ordem padrão do django. + ('parlamentares', '0043_auto_20231007_2149'), + ] + + operations = [ + migrations.RunPython(gera_cargos_mesa), + ] From a4d51cb152fde14d8fd0d6638da4d1003e81016a Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Sat, 25 Nov 2023 23:44:07 -0300 Subject: [PATCH 05/81] fix: ajusta ordenacao de votos nominais por ordem alfabetica no extrato da sessao (#3690) Co-authored-by: joao --- sapl/base/templatetags/common_tags.py | 7 ++++++- sapl/templates/sessao/blocos_ata/materias_ordem_dia.html | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 7cd751d1d..8506669a4 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -408,4 +408,9 @@ def parse_datetime(value): @register.filter def is_report_visible(request, url_path=None): - return is_report_allowed(request, url_path) \ No newline at end of file + return is_report_allowed(request, url_path) + + +@register.filter +def sort_by_index(queryset, index): + return sorted(queryset, key=lambda x: x[index]) \ No newline at end of file diff --git a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html b/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html index 704cc52c2..8f14181cc 100644 --- a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html +++ b/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html @@ -1,3 +1,4 @@ +{% load common_tags %} {% if materias_ordem %}

@@ -28,7 +29,7 @@ {% if m.resultado_observacao %} - Obs.: {{ m.resultado_observacao }} {% endif %} {% if m.voto_nominal %} Votos Nominais : - {% for voto in m.voto_nominal %} + {% for voto in m.voto_nominal|sort_by_index:0 %} {{ voto.0 }} - {{ voto.1 }} {% if not forloop.last %} ; {% endif %} {% endfor %} From bff56d26c4a5fd226335cd736f3758cf53cd8005 Mon Sep 17 00:00:00 2001 From: cristian-longhi Date: Sat, 25 Nov 2023 23:52:28 -0300 Subject: [PATCH 06/81] =?UTF-8?q?Conserta=20bug=20na=20pagina=C3=A7=C3=A3o?= =?UTF-8?q?=20do=20Relat=C3=B3rio=20de=20Mat=C3=A9rias=20por=20Tramita?= =?UTF-8?q?=C3=A7=C3=A3o=20(#3689)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Conserta bug na paginação de Relatório O Relatório de Matérias por Tramitação não está apresentando a opção de paginação, em função da condição do if. A escolha por testar o filter_url para exibição se deu em função da tela inicial da pesquisa do relatório, quando ainda não haverá resultados e nem parâmetros de pesquisa na url. --- .../relatorios/RelatorioMateriasPorTramitacao_filter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/templates/relatorios/RelatorioMateriasPorTramitacao_filter.html b/sapl/templates/relatorios/RelatorioMateriasPorTramitacao_filter.html index c0ef7e9b7..3d471fba7 100644 --- a/sapl/templates/relatorios/RelatorioMateriasPorTramitacao_filter.html +++ b/sapl/templates/relatorios/RelatorioMateriasPorTramitacao_filter.html @@ -72,7 +72,7 @@ {% endfor %} {% endif %} - {% if page.object_list %} + {% if filter_url %} {% include "paginacao.html" %} {% endif %}
From 8a3e7e49a633a9e57853e93e371d1e42af4622e8 Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Sat, 25 Nov 2023 23:53:18 -0300 Subject: [PATCH 07/81] =?UTF-8?q?feat:=20adiciona=20script=20para=20ajuste?= =?UTF-8?q?=20to=20tamanho=20de=20fontes=20de=20se=C3=A7oes=20do=20painel?= =?UTF-8?q?=20eletronico=20(#3691)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: joao --- sapl/templates/painel/index.html | 110 +++++++++++++++++++------------ 1 file changed, 68 insertions(+), 42 deletions(-) diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index c9a7d813f..523fa2423 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -66,50 +66,68 @@

-
-
-
-

Parlamentares

- -
-
-
-
-

Oradores

- -
- -
-

Cronômetros

-
- Discurso:
- Aparte:
- Questão de Ordem:
- Considerações Finais: +
+
+
+

Parlamentares

+ +
+
+
+
+

Oradores

+ +
+ +
+
+

Cronômetros

+ + +
+
+ Discurso:
+ Aparte:
+ Questão de Ordem:
+ Considerações Finais: +
+
+ +
+
+

Resultado

+ + +
+
+ + +
+
+ +
+

Matéria em Votação

+ +
+ +
+ +
+ +
-
- -
-

Resultado

- -

-

- -
-

Matéria em Votação

- -
- -
- -
- -
-
@@ -490,6 +508,14 @@ `${parlamentar.partido} ` + `${parlamentar.voto} `) } + + function changeFontSize(elementId, increment) { + let element = document.getElementById(elementId); + if (element) { + let currentSize = parseFloat(window.getComputedStyle(element, null).getPropertyValue('font-size')); + element.style.fontSize = (currentSize + increment) + 'px'; + } + } From 455aaddc7f774a9610a82bf81ce093387e7b0379 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Sun, 26 Nov 2023 14:38:06 -0800 Subject: [PATCH 08/81] Bump Pillow version --- requirements/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 7405e8c42..f75313cb0 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -22,7 +22,7 @@ pytz==2019.3 python-magic==0.4.15 unipath==1.1 WeasyPrint==51 -Pillow==9.3.0 +Pillow==10.0.0 gunicorn==19.9.0 more-itertools==8.2.0 pysolr==3.6.0 From 6c002459a310a2a661ed3da8e4ccf19f76fc9059 Mon Sep 17 00:00:00 2001 From: Edward <9326037+edwardoliveira@users.noreply.github.com> Date: Tue, 28 Nov 2023 13:46:52 -0800 Subject: [PATCH 09/81] =?UTF-8?q?Conserta=20relatoria=20de=20mat=C3=A9rias?= =?UTF-8?q?=20(#3692)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix relatoria de matérias --- sapl/crispy_layout_mixin.py | 10 +++++++++- sapl/crud/base.py | 20 +++++++++++++++---- sapl/materia/views.py | 3 +++ sapl/templates/materia/layouts.yaml | 15 ++++++++++---- sapl/templates/norma/layouts.yaml | 2 +- sapl/templates/protocoloadm/layouts.yaml | 6 +++--- .../blocos_ata/ocorrencias_da_sessao.html | 1 - sapl/templates/sessao/layouts.yaml | 2 +- 8 files changed, 44 insertions(+), 15 deletions(-) diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py index b131623b9..57bc0d538 100644 --- a/sapl/crispy_layout_mixin.py +++ b/sapl/crispy_layout_mixin.py @@ -284,7 +284,7 @@ class CrispyLayoutFormMixin: 'text': field_display, } - def fk_urlize_for_detail(self, obj, fieldname): + def fk_urlify_for_detail(self, obj, fieldname): field = obj._meta.get_field(fieldname) value = getattr(obj, fieldname) @@ -298,6 +298,14 @@ class CrispyLayoutFormMixin: return field.verbose_name, display + def fk_urlify_for_list(self, obj, field): + value = getattr(obj, field) + return reverse( + '%s:%s_detail' % ( + value._meta.app_config.name, + value._meta.model_name), + kwargs={'pk': value.id}), + def m2m_urlize_for_detail(self, obj, fieldname): manager, fieldname = tuple(fieldname.split('__')) diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 5d6d8a3c1..94637d9d7 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -413,7 +413,7 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): 'composicao__periodo__data_inicio', 'composicao__periodo__data_fim')] """ r = [] - for fieldname in self.list_field_names: + for (fieldname, _) in self._parse_field_names(self.list_field_names): if not isinstance(fieldname, tuple): fieldname = fieldname, s = [] @@ -446,14 +446,26 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): r.append(s) return r + def _parse_field_names(self, field_name_list): + parsed_list = [] + for field_name in field_name_list: + field_tuple = tuple(field_name.split('|')) \ + if '|' in field_name else (field_name, None) + parsed_list.append(field_tuple) + return parsed_list + def _as_row(self, obj): r = [] - for i, name in enumerate(self.list_field_names): + for i, (name, func) in enumerate(self._parse_field_names(self.list_field_names)): + # URL padrão para primeira coluna da listagem url = self.resolve_url( ACTION_DETAIL, args=(obj.id,)) if i == 0 else None + # gera URL para matéria a partir de fk_urlify_for_list em layouts.yaml + if i > 0 and func is not None: + url = getattr(self, func)(obj, name)[0] """Caso o crud list seja para uma relação ManyToManyField""" - if url and hasattr(self, 'crud') and\ + if url and hasattr(self, 'crud') and \ hasattr(self.crud, 'is_m2m') and self.crud.is_m2m: url = url + ('?pkk=' + self.kwargs['pk'] if 'pk' in self.kwargs else '') @@ -483,7 +495,7 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): if m: ss = get_field_display(m, n[-1])[1] ss = ( - ('
' if '
    ' in ss else ' - ') + ss)\ + ('
    ' if '
      ' in ss else ' - ') + ss) \ if ss and j != 0 and s else ss except: pass diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 755fe2f1e..b1073cc7b 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1337,6 +1337,9 @@ class RelatoriaCrud(MasterDetailCrud): return {'comissao': localizacao} + class ListView(MasterDetailCrud.ListView): + layout_key = 'RelatoriaList' + class UpdateView(MasterDetailCrud.UpdateView): form_class = RelatoriaForm layout_key = None diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index 202772737..e42b350fc 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -59,8 +59,8 @@ Anexada: AnexadaDetail: {% trans 'Matéria Anexada' %}: - - materia_principal|fk_urlize_for_detail - - materia_anexada|fk_urlize_for_detail + - materia_principal|fk_urlify_for_detail + - materia_anexada|fk_urlify_for_detail - data_anexacao data_desanexacao Autoria: @@ -86,11 +86,18 @@ Orgao: Relatoria: {% trans 'Relatoria' %}: - - comissao|fk_urlize_for_detail - - materia|fk_urlize_for_detail + - comissao + - materia - data_designacao_relator data_destituicao_relator - parlamentar tipo_fim_relatoria +RelatoriaList: + {% trans 'Relatoria' %}: + - comissao + - materia|fk_urlify_for_list + - data_designacao_relator data_destituicao_relator + - parlamentar|fk_urlify_for_list tipo_fim_relatoria + TipoProposicao: {% trans 'Tipo Proposição' %}: - descricao content_type diff --git a/sapl/templates/norma/layouts.yaml b/sapl/templates/norma/layouts.yaml index 0ea7cea51..a44445bfb 100644 --- a/sapl/templates/norma/layouts.yaml +++ b/sapl/templates/norma/layouts.yaml @@ -51,7 +51,7 @@ LegislacaoCitada: LegislacaoCitadaDetail: {% trans 'Legislação Citada' %}: - - norma|fk_urlize_for_detail + - norma|fk_urlify_for_detail - disposicoes parte livro titulo - capitulo secao subsecao artigo - paragrafo inciso alinea item diff --git a/sapl/templates/protocoloadm/layouts.yaml b/sapl/templates/protocoloadm/layouts.yaml index cbfe3210f..31d0ab9f4 100644 --- a/sapl/templates/protocoloadm/layouts.yaml +++ b/sapl/templates/protocoloadm/layouts.yaml @@ -43,8 +43,8 @@ Anexado: AnexadoDetail: {% trans 'Documento Anexado' %}: - - documento_principal|fk_urlize_for_detail - - documento_anexado|fk_urlize_for_detail + - documento_principal|fk_urlify_for_detail + - documento_anexado|fk_urlify_for_detail - data_anexacao data_desanexacao Protocolo: @@ -70,5 +70,5 @@ VinculoDocAdminMateria: VinculoDocAdminMateriaDetail: {% trans 'Matéria Vinculada' %}: - - materia|fk_urlize_for_detail data_anexacao:3 data_desanexacao:3 + - materia|fk_urlify_for_detail data_anexacao:3 data_desanexacao:3 - documento diff --git a/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html b/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html index 4598cfbc8..20d1d8840 100644 --- a/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html +++ b/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html @@ -3,7 +3,6 @@

      Ocorrências da Sessão: {{ object.ocorrenciasessao.conteudo|striptags|safe }} -

{% endif %} diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 0fc779f08..95d542df5 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -133,5 +133,5 @@ Correspondencia: CorrespondenciaDetail: {% trans 'Correspondencia' %}: - numero_ordem:2 tipo:3 sessao_plenaria - - documento|fk_urlize_for_detail + - documento|fk_urlify_for_detail - observacao \ No newline at end of file From b495a35c34cc65cfd4894bae7a1b53cbcd5096ea Mon Sep 17 00:00:00 2001 From: Edward <9326037+edwardoliveira@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:36:17 -0800 Subject: [PATCH 10/81] Adiciona feature flag lib (#3693) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adiciona feature flag lib e refatora Solr para usá-la --- docker/docker-compose.yaml | 1 + docker/start.sh | 17 +++++++ docs/feature-flags.md | 45 +++++++++++++++++++ requirements/requirements.txt | 1 + sapl/base/forms.py | 1 - .../0059_remove_appconfig_sapl_as_sapn.py | 17 +++++++ sapl/base/models.py | 4 -- sapl/base/views.py | 6 +-- sapl/context_processors.py | 9 ++-- sapl/materia/views.py | 3 -- sapl/norma/views.py | 4 +- sapl/sessao/views.py | 3 -- sapl/settings.py | 16 ++++++- sapl/templates/base.html | 6 +-- sapl/templates/base/layouts.yaml | 2 +- .../materia/materialegislativa_filter.html | 12 ++--- .../templates/norma/normajuridica_detail.html | 1 + .../templates/norma/normajuridica_filter.html | 5 ++- sapl/templates/search/search.html | 8 ++-- .../sessao/sessaoplenaria_filter.html | 5 ++- sapl/utils.py | 6 +-- 21 files changed, 125 insertions(+), 47 deletions(-) create mode 100644 docs/feature-flags.md create mode 100644 sapl/base/migrations/0059_remove_appconfig_sapl_as_sapn.py diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 2bb8d82f2..771adc64e 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -54,6 +54,7 @@ services: SOLR_COLLECTION: sapl SOLR_URL: http://solr:solr@saplsolr:8983 IS_ZK_EMBEDDED: 'True' + ENABLE_SAPN: 'False' TZ: America/Sao_Paulo volumes: - sapl_data:/var/interlegis/sapl/data diff --git a/docker/start.sh b/docker/start.sh index 558b7d7b5..7a9345fbb 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -39,6 +39,7 @@ create_env() { echo "SOLR_COLLECTION = ""${SOLR_COLLECTION-sapl}" >> $FILENAME echo "SOLR_URL = ""${SOLR_URL-http://localhost:8983}" >> $FILENAME echo "IS_ZK_EMBEDDED = ""${IS_ZK_EMBEDDED-False}" >> $FILENAME + echo "ENABLE_SAPN = ""${ENABLE_SAPN-False}" >> $FILENAME echo "[ENV FILE] done." } @@ -85,14 +86,30 @@ if [ "${USE_SOLR-False}" == "True" ] || [ "${USE_SOLR-False}" == "true" ]; then fi python3 solr_cli.py -u $SOLR_URL -c $SOLR_COLLECTION -s $NUM_SHARDS -rf $RF -ms $MAX_SHARDS_PER_NODE $ZK_EMBEDDED & + # Enable SOLR switch on, creating if it doesn't exist on database + ./manage.py waffle_switch SOLR_SWITCH on --create else echo "Solr is offline, not possible to connect." + # Disable Solr switch off, creating if it doesn't exist on database + ./manage.py waffle_switch SOLR_SWITCH off --create fi else echo "Solr support is not initialized." + # Disable Solr switch off, creating if it doesn't exist on database + ./manage.py waffle_switch SOLR_SWITCH off --create fi +## Enable/Disable SAPN +if [ "${ENABLE_SAPN-False}" == "True" ] || [ "${ENABLE_SAPN-False}" == "true" ]; then + echo "Enabling SAPN" + ./manage.py waffle_switch SAPLN_SWITCH on --create +else + echo "Enabling SAPL" + ./manage.py waffle_switch SAPLN_SWITCH off --create +fi + + echo "Creating admin user..." user_created=$(python3 create_admin.py 2>&1) diff --git a/docs/feature-flags.md b/docs/feature-flags.md new file mode 100644 index 000000000..2e9df5b11 --- /dev/null +++ b/docs/feature-flags.md @@ -0,0 +1,45 @@ + +### Types + +Waffle supports three types of feature flippers: + +### Flags + +_"Flags can be used to enable a feature for specific users, groups, users meeting +certain criteria (such as being authenticated, or superusers) or a certain percentage +of visitors."_ + +https://waffle.readthedocs.io/en/stable/types/flag.html + +### Switches + +_"Switches are simple booleans: they are on or off, for everyone, all the time. +They do not require a request object and can be used in other contexts, such +as management commands and tasks."_ + +Enabling/Disabling via CLI (example): + + ./manage.py waffle_switch SOLR_SWITCH on --create + + ./manage.py waffle_switch SOLR_SWITCH off --create + + +https://waffle.readthedocs.io/en/stable/types/switch.html + +### Samples + +_"Samples are on a given percentage of the time. They do not require a request +object and can be used in other contexts, such as management commands and tasks."_ + +Liga e desliga baseado em amostragem aleatória. + +https://waffle.readthedocs.io/en/stable/types/sample.html + +### Reference +* Documentation: https://waffle.readthedocs.io/ +* Managing from CLI: https://waffle.readthedocs.io/en/stable/usage/cli.html +* Templates: https://waffle.readthedocs.io/en/stable/usage/templates.html +* Views: https://waffle.readthedocs.io/en/stable/usage/views.html +* Decorators: https://waffle.readthedocs.io/en/stable/usage/decorators.html + + diff --git a/requirements/requirements.txt b/requirements/requirements.txt index f75313cb0..95ed3fadf 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -11,6 +11,7 @@ django-extra-views==0.12.0 django-model-utils==3.1.2 django-extensions==2.1.4 django-image-cropping==1.2 +django-waffle==3.0.0 django-webpack-loader==1.6.0 drf-spectacular==0.18.2 django-ratelimit==3.0.1 diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 7fc2c6fdc..092206429 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1009,7 +1009,6 @@ class ConfiguracoesAppForm(ModelForm): 'google_recaptcha_site_key', 'google_recaptcha_secret_key', 'google_analytics_id_metrica', - 'sapl_as_sapn', 'identificacao_de_documentos', ] diff --git a/sapl/base/migrations/0059_remove_appconfig_sapl_as_sapn.py b/sapl/base/migrations/0059_remove_appconfig_sapl_as_sapn.py new file mode 100644 index 000000000..bd2edf7bd --- /dev/null +++ b/sapl/base/migrations/0059_remove_appconfig_sapl_as_sapn.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.28 on 2023-11-27 00:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0058_appconfig_ordenacao_pesquisa_materia'), + ] + + operations = [ + migrations.RemoveField( + model_name='appconfig', + name='sapl_as_sapn', + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index adf3f67f1..e0f00bbf2 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -107,10 +107,6 @@ class AppConfig(models.Model): default="", verbose_name=_('Esfera Federação'), choices=ESFERA_FEDERACAO_CHOICES) - sapl_as_sapn = models.BooleanField( - verbose_name=_( - 'Utilizar SAPL apenas como SAPL-Normas?'), - choices=YES_NO_CHOICES, default=False) # MÓDULO PARLAMENTARES diff --git a/sapl/base/views.py b/sapl/base/views.py index dd8f7ef27..8417c0021 100644 --- a/sapl/base/views.py +++ b/sapl/base/views.py @@ -50,8 +50,8 @@ from sapl.relatorios.views import (relatorio_estatisticas_acesso_normas) from sapl.sessao.models import (Bancada, SessaoPlenaria) from sapl.settings import EMAIL_SEND_USER from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, mail_service_configured, - SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, google_recaptcha_configured, sapl_as_sapn, - get_client_ip) + SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, google_recaptcha_configured, + get_client_ip, sapn_is_enabled) from .forms import (AlterarSenhaForm, CasaLegislativaForm, ConfiguracoesAppForm, EstatisticasAcessoNormasForm) from .models import AppConfig, CasaLegislativa @@ -62,7 +62,7 @@ def get_casalegislativa(): class IndexView(TemplateView): def get(self, request, *args, **kwargs): - if sapl_as_sapn(): + if sapn_is_enabled(): return redirect('/norma/pesquisar') return TemplateView.get(self, request, *args, **kwargs) diff --git a/sapl/context_processors.py b/sapl/context_processors.py index 86110cd4f..2b8a422cb 100644 --- a/sapl/context_processors.py +++ b/sapl/context_processors.py @@ -3,8 +3,7 @@ import logging from django.conf import settings from django.utils.translation import ugettext_lazy as _ -from sapl.utils import google_recaptcha_configured as google_recaptcha_configured_utils,\ - sapl_as_sapn as sapl_as_sapn_utils +from sapl.utils import google_recaptcha_configured as google_recaptcha_configured_utils, sapn_is_enabled from sapl.utils import mail_service_configured as mail_service_configured_utils @@ -36,10 +35,10 @@ def google_recaptcha_configured(request): return {'google_recaptcha_configured': True} -def sapl_as_sapn(request): +def enable_sapn(request): return { - 'sapl_as_sapn': sapl_as_sapn_utils(), + 'sapl_as_sapn': sapn_is_enabled(), 'nome_sistema': _('Sistema de Apoio ao Processo Legislativo') - if not sapl_as_sapn_utils() + if not sapn_is_enabled() else _('Sistema de Apoio à Publicação de Leis e Normas') } diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b1073cc7b..e656751dc 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -2132,9 +2132,6 @@ class MateriaLegislativaPesquisaView(FilterView): context['show_results'] = show_results_filter_set(qr) - context['USE_SOLR'] = settings.USE_SOLR if hasattr( - settings, 'USE_SOLR') else False - return context diff --git a/sapl/norma/views.py b/sapl/norma/views.py index d6d474590..fd12ebaf6 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -28,7 +28,7 @@ from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, MasterDetailCrud, make_pagination) from sapl.materia.models import Orgao from sapl.utils import show_results_filter_set, get_client_ip,\ - sapl_as_sapn + sapn_is_enabled from .forms import (AnexoNormaJuridicaForm, NormaFilterSet, NormaJuridicaForm, NormaPesquisaSimplesForm, NormaRelacionadaForm, @@ -187,8 +187,6 @@ class NormaPesquisaView(FilterView): context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else '' context['show_results'] = show_results_filter_set(qr) - context['USE_SOLR'] = settings.USE_SOLR if hasattr( - settings, 'USE_SOLR') else False return context diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index e19cfc267..8b1537661 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3997,9 +3997,6 @@ class PesquisarSessaoPlenariaView(FilterView): context['page_range'] = make_pagination( page_obj.number, paginator.num_pages) - context['USE_SOLR'] = settings.USE_SOLR if hasattr( - settings, 'USE_SOLR') else False - return context def get(self, request, *args, **kwargs): diff --git a/sapl/settings.py b/sapl/settings.py index fc120cfe8..8d1ae2bf9 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -80,6 +80,8 @@ INSTALLED_APPS = ( 'crispy_forms', 'floppyforms', + 'waffle', + 'drf_spectacular', 'rest_framework', 'rest_framework.authtoken', @@ -137,6 +139,7 @@ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', 'django_prometheus.middleware.PrometheusAfterMiddleware', + 'waffle.middleware.WaffleMiddleware', ] if DEBUG: INSTALLED_APPS += ('debug_toolbar',) @@ -210,8 +213,7 @@ TEMPLATES = [ 'sapl.context_processors.parliament_info', 'sapl.context_processors.mail_service_configured', 'sapl.context_processors.google_recaptcha_configured', - 'sapl.context_processors.sapl_as_sapn', - + 'sapl.context_processors.enable_sapn', ], 'debug': DEBUG }, @@ -255,6 +257,16 @@ DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL', cast=str, default='') SERVER_EMAIL = config('SERVER_EMAIL', cast=str, default='') EMAIL_RUNNING = None +# Feature Flag +WAFFLE_FLAG_DEFAULT = False +WAFFLE_SWITCH_DEFAULT = False +WAFFLE_CREATE_MISSING_FLAGS = True +WAFFLE_LOG_MISSING_FLAGS = True +WAFFLE_CREATE_MISSING_SWITCHES = True +WAFFLE_LOG_MISSING_SWITCHES = True +WAFFLE_ENABLE_ADMIN_PAGES = True + + MAX_DOC_UPLOAD_SIZE = 150 * 1024 * 1024 # 150MB MAX_IMAGE_UPLOAD_SIZE = 2 * 1024 * 1024 # 2MB DATA_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024 # 10MB diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 21e9221f5..09fcda6bb 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -1,6 +1,7 @@ {% load i18n staticfiles menus %} {% load common_tags %} +{% load waffle_tags %} {% load render_bundle from webpack_loader %} {% load webpack_static from webpack_loader %} @@ -11,13 +12,10 @@ - {% block head_title %}{% if sapl_as_sapn %}SAPL-Normas - {% else %}SAPL - {%endif%}{{nome_sistema}}{% endblock %} + {% block head_title %}{% switch "SAPLN_SWITCH" %}SAPL-Normas - {% else %}SAPL - {%endswitch%}{{nome_sistema}}{% endblock %} - - - {% block head_content %} {% block webpack_loader_css %} diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index 6dabd981a..34c4f111d 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -20,7 +20,7 @@ UserDetail: AppConfig: {% trans 'Configurações Gerais' %}: - - esfera_federacao sapl_as_sapn + - esfera_federacao #{% trans 'Módulo Parlamentares' %}: #{% trans 'Módulo Mesa Diretora' %}: diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index afdb5e48c..3a51dc973 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/sapl/templates/materia/materialegislativa_filter.html @@ -1,18 +1,18 @@ {% extends "crud/detail.html" %} {% load i18n %} {% load tz %} +{% load waffle_tags %} {% load crispy_forms_tags common_tags%} {% load webpack_static from webpack_loader %} {% block actions %}
- {% if USE_SOLR %} - - Pesquisa Textual - - {% endif %} - + {% switch "SOLR_SWITCH" %} + + Pesquisa Textual + + {% endswitch %} {% if perms.materia.add_materialegislativa %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Matéria Legislativa {% endblocktrans %} diff --git a/sapl/templates/norma/normajuridica_detail.html b/sapl/templates/norma/normajuridica_detail.html index 9ab051213..c618c81d2 100644 --- a/sapl/templates/norma/normajuridica_detail.html +++ b/sapl/templates/norma/normajuridica_detail.html @@ -1,5 +1,6 @@ {% extends "crud/detail.html" %} {% load i18n common_tags %} +{% load waffle_tags %} {% load render_bundle from webpack_loader %} {% block webpack_loader_css %} diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html index ad900d6ff..ce10aec10 100644 --- a/sapl/templates/norma/normajuridica_filter.html +++ b/sapl/templates/norma/normajuridica_filter.html @@ -1,14 +1,15 @@ {% extends "crud/detail.html" %} {% load i18n %} +{% load waffle_tags %} {% load crispy_forms_tags common_tags %} {% block actions %}
- - {% if not sapl_as_sapn %} - + {% switch "SAPLN_SWITCH" %}

Em quais tipos de documento deseja pesquisar?

@@ -27,7 +25,7 @@ {{ form.models }}
- {% endif %} + {% endswitch %}
diff --git a/sapl/templates/sessao/sessaoplenaria_filter.html b/sapl/templates/sessao/sessaoplenaria_filter.html index 8d0957d51..c84580c25 100644 --- a/sapl/templates/sessao/sessaoplenaria_filter.html +++ b/sapl/templates/sessao/sessaoplenaria_filter.html @@ -1,14 +1,15 @@ {% extends "crud/detail.html" %} {% load i18n %} +{% load waffle_tags %} {% load crispy_forms_tags common_tags %} {% block actions %}
- {% if USE_SOLR %} + {% switch "SOLR_SWITCH" %} Pesquisa Textual - {% endif %} + {% endswitch %} {% if perms.sessao %} {% blocktrans with verbose_name=view.verbose_name %} Adicionar Sessão Plenária {% endblocktrans %} diff --git a/sapl/utils.py b/sapl/utils.py index da40ac102..de31e05b0 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1061,9 +1061,9 @@ def google_recaptcha_configured(): return not AppConfig.attr('google_recaptcha_site_key') == '' -def sapl_as_sapn(): - from sapl.base.models import AppConfig - return AppConfig.attr('sapl_as_sapn') +def sapn_is_enabled(): + import waffle + return waffle.switch_is_active('SAPLN_SWITCH') def timing(f): From 1379e11af532e93507cdf52cce785381e8bc8552 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Wed, 29 Nov 2023 09:49:48 -0800 Subject: [PATCH 11/81] Bump Pillow --- requirements/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 95ed3fadf..34af44090 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -23,7 +23,7 @@ pytz==2019.3 python-magic==0.4.15 unipath==1.1 WeasyPrint==51 -Pillow==10.0.0 +Pillow==10.0.1 gunicorn==19.9.0 more-itertools==8.2.0 pysolr==3.6.0 From b7971ac6bcad017526b83665e86457e6b1f6936d Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Wed, 29 Nov 2023 09:52:56 -0800 Subject: [PATCH 12/81] Release: 3.1.163-RC18 --- CHANGES.md | 5 +++++ docker/docker-compose.yaml | 2 +- sapl/settings.py | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f69979c53..55f95eced 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,9 @@ +3.1.163-RC18 / 2023-11-29 +========================= + + * Bump Pillow + 3.1.163-RC17 / 2023-09-30 ========================= diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 771adc64e..05d4863b9 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -32,7 +32,7 @@ services: networks: - sapl-net sapl: - image: interlegis/sapl:3.1.163-RC17 + image: interlegis/sapl:3.1.163-RC18 # build: # context: ../ # dockerfile: ./docker/Dockerfile diff --git a/sapl/settings.py b/sapl/settings.py index 8d1ae2bf9..52d7ece89 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.163-RC17' +SAPL_VERSION = '3.1.163-RC18' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 09fcda6bb..31936f84a 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -192,7 +192,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.163-RC17 + Release: 3.1.163-RC18

diff --git a/setup.py b/setup.py index abeb6ad6a..a039077e4 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.163-RC17', + version='3.1.163-RC18', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From dcbab27767d68c2f6655aeb8e446ec7989350581 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Wed, 29 Nov 2023 10:39:15 -0800 Subject: [PATCH 13/81] Release: 3.1.163-RC19 --- CHANGES.md | 6 ++++++ docker/docker-compose.yaml | 2 +- sapl/settings.py | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 55f95eced..3b2c7d2b8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,10 @@ +3.1.163-RC19 / 2023-11-29 +========================= + + * Release: 3.1.163-RC18 + * Bump Pillow + 3.1.163-RC18 / 2023-11-29 ========================= diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 05d4863b9..b0ac942cd 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -32,7 +32,7 @@ services: networks: - sapl-net sapl: - image: interlegis/sapl:3.1.163-RC18 + image: interlegis/sapl:3.1.163-RC19 # build: # context: ../ # dockerfile: ./docker/Dockerfile diff --git a/sapl/settings.py b/sapl/settings.py index 52d7ece89..114f5e472 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.163-RC18' +SAPL_VERSION = '3.1.163-RC19' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 31936f84a..c76ecd3b2 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -192,7 +192,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.163-RC18 + Release: 3.1.163-RC19

diff --git a/setup.py b/setup.py index a039077e4..13ed7f7ca 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.163-RC18', + version='3.1.163-RC19', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From b338e7c9b9a3b9286573cc82b7d78fee1de06872 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Sun, 3 Dec 2023 13:44:41 -0800 Subject: [PATCH 14/81] HOT-FIX: Bump easy-thumbnails --- requirements/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 34af44090..30df37e77 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -15,7 +15,7 @@ django-waffle==3.0.0 django-webpack-loader==1.6.0 drf-spectacular==0.18.2 django-ratelimit==3.0.1 -easy-thumbnails==2.5 +easy-thumbnails==2.8.5 python-decouple==3.1 psycopg2-binary==2.8.6 pyyaml==6.0.1 From ae7380df76a2ef16dc4e22fbe35e802390898d52 Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Mon, 4 Dec 2023 17:14:32 -0800 Subject: [PATCH 15/81] Release: 3.1.163-RC20 --- CHANGES.md | 5 +++++ docker/docker-compose.yaml | 4 ++-- sapl/settings.py | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3b2c7d2b8..e43fa4533 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,9 @@ +3.1.163-RC20 / 2023-12-04 +========================= + + * HOT-FIX: Bump easy-thumbnails + 3.1.163-RC19 / 2023-11-29 ========================= diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index b0ac942cd..8f797c1c8 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -32,7 +32,7 @@ services: networks: - sapl-net sapl: - image: interlegis/sapl:3.1.163-RC19 + image: interlegis/sapl:3.1.163-RC20 # build: # context: ../ # dockerfile: ./docker/Dockerfile @@ -54,7 +54,7 @@ services: SOLR_COLLECTION: sapl SOLR_URL: http://solr:solr@saplsolr:8983 IS_ZK_EMBEDDED: 'True' - ENABLE_SAPN: 'False' + ENABLE_SAPN: 'True' TZ: America/Sao_Paulo volumes: - sapl_data:/var/interlegis/sapl/data diff --git a/sapl/settings.py b/sapl/settings.py index 114f5e472..0dbd1735a 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.163-RC19' +SAPL_VERSION = '3.1.163-RC20' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/sapl/templates/base.html b/sapl/templates/base.html index c76ecd3b2..42fee7ee8 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -192,7 +192,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.163-RC19 + Release: 3.1.163-RC20

diff --git a/setup.py b/setup.py index 13ed7f7ca..beb7e8952 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.163-RC19', + version='3.1.163-RC20', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 7367e986994fc38238294e76d444a85499ed3366 Mon Sep 17 00:00:00 2001 From: Edward <9326037+edwardoliveira@users.noreply.github.com> Date: Mon, 4 Dec 2023 17:22:52 -0800 Subject: [PATCH 16/81] Update CHANGES.md Fix changes in RC-18 --- CHANGES.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index e43fa4533..4d8816b1f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,13 +7,26 @@ 3.1.163-RC19 / 2023-11-29 ========================= - * Release: 3.1.163-RC18 * Bump Pillow 3.1.163-RC18 / 2023-11-29 ========================= * Bump Pillow + * Adiciona feature flag lib + * Conserta relatoria de matérias + * Bump Pillow version + * feat: adiciona script para ajuste to tamanho de fontes de seçoes do painel eletronico + * Conserta bug na paginação do Relatório de Matérias por Tramitação + * fix: ajusta ordenacao de votos nominais por ordem alfabetica no extrato da sessao + * fix: corrige erro de loaddata cargomesa + * feat: adiciona check de presenca e sessao aberta na leitura em bloco da ordem do dia + * fix: padroniza nome_parlamentar para lista de presenca e votacoes nominais no resumo da ata + * Apaga Numeração se TipoMateriaLegislativa é apagado + * Adiciona opção de remover formatação + * Adiciona ordenacao em cargo mesa + * Remove tags de considerações finais e ocorrências de sessão + * fix: padroniza nome_parlamentar para lista de presenca e votacoes nominais no resumo da ata 3.1.163-RC17 / 2023-09-30 ========================= From 49a6149ee073e405fe2a75fdc60da978ce6474f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LeandroJata=C3=AD?= Date: Thu, 7 Dec 2023 13:27:19 -0300 Subject: [PATCH 17/81] fix: Update docker-compose.yaml --- docker/docker-compose.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 8f797c1c8..9f6f15f7a 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -54,7 +54,7 @@ services: SOLR_COLLECTION: sapl SOLR_URL: http://solr:solr@saplsolr:8983 IS_ZK_EMBEDDED: 'True' - ENABLE_SAPN: 'True' + ENABLE_SAPN: 'False' TZ: America/Sao_Paulo volumes: - sapl_data:/var/interlegis/sapl/data From 2f1f42f150a2136487513b006a05dffacc29415f Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Mon, 11 Dec 2023 16:36:03 -0300 Subject: [PATCH 18/81] =?UTF-8?q?fix:=20invert=20l=C3=B3gica=20do=20sapln?= =?UTF-8?q?=5Fswitch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/templates/search/search.html | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/templates/search/search.html b/sapl/templates/search/search.html index 650a49aec..ccb20532a 100644 --- a/sapl/templates/search/search.html +++ b/sapl/templates/search/search.html @@ -12,6 +12,7 @@ {% switch "SAPLN_SWITCH" %} + {% else %}

Em quais tipos de documento deseja pesquisar?

From 53df1ae68392c395863a644978b38693dfb26f1f Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Sat, 30 Dec 2023 23:47:36 -0300 Subject: [PATCH 19/81] feat: adiciona o turno na info de materias na pauta de sessao (#3694) Co-authored-by: joao --- sapl/sessao/views.py | 6 ++++-- sapl/templates/sessao/pauta_sessao_detail.html | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 8b1537661..2d20ff277 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -3866,7 +3866,8 @@ class PautaSessaoDetailView(DetailView): 'resultado_observacao': resultado_observacao, 'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"), 'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-', - 'autor': [str(x.autor) for x in m.materia.autoria_set.select_related('autor').all()] + 'autor': [str(x.autor) for x in m.materia.autoria_set.select_related('autor').all()], + 'turno': get_turno(ultima_tramitacao.turno) if ultima_tramitacao else '' }) context.update({'materia_expediente': materias_expediente}) @@ -3949,7 +3950,8 @@ class PautaSessaoDetailView(DetailView): 'resultado_observacao': resultado_observacao, 'situacao': ultima_tramitacao.status if ultima_tramitacao else _("Não informada"), 'processo': f'{str(numeracao.numero_materia)}/{str(numeracao.ano_materia)}' if numeracao else '-', - 'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)] + 'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)], + 'turno': get_turno(ultima_tramitacao.turno) if ultima_tramitacao else '' }) context.update({ diff --git a/sapl/templates/sessao/pauta_sessao_detail.html b/sapl/templates/sessao/pauta_sessao_detail.html index 80bd24452..92ad35a6b 100644 --- a/sapl/templates/sessao/pauta_sessao_detail.html +++ b/sapl/templates/sessao/pauta_sessao_detail.html @@ -67,7 +67,8 @@ {{m.titulo}}
Processo: {{ m.processo }}
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} + Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }}
+ Turno: {{ m.turno }} {{m.ementa|dont_break_out}} @@ -92,7 +93,8 @@ {{m.numero}} - {{m.titulo}}
Processo: {{ m.processo }}
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }} + Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }}
+ Turno: {{ m.turno }} {{m.ementa|dont_break_out}} From 162bc6e0bf69740549cad065749c36c6a7136fc6 Mon Sep 17 00:00:00 2001 From: joaohortsenado <100957576+joaohortsenado@users.noreply.github.com> Date: Sat, 30 Dec 2023 23:48:26 -0300 Subject: [PATCH 20/81] fix: corrige bug na pesquisa de impressos etiquetas (#3695) Co-authored-by: joao --- sapl/materia/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index e656751dc..5492ddfb6 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -2660,9 +2660,9 @@ class EtiquetaPesquisaView(PermissionRequiredMixin, FormView): if form.cleaned_data['processo_inicial']: materias = materias.filter( - numeracao__numero_materia__gte=form.cleaned_data[ + numero__gte=form.cleaned_data[ 'processo_inicial'], - numeracao__numero_materia__lte=form.cleaned_data[ + numero__lte=form.cleaned_data[ 'processo_final']) context['quantidade'] = len(materias) From 098b38faa72311662115b3bc0fc442972344dbeb Mon Sep 17 00:00:00 2001 From: Edward Oliveira Date: Mon, 26 Feb 2024 22:11:28 -0800 Subject: [PATCH 21/81] Add blank space when SAPN --- sapl/templates/search/search.html | 1 + 1 file changed, 1 insertion(+) diff --git a/sapl/templates/search/search.html b/sapl/templates/search/search.html index ccb20532a..aa3f8f431 100644 --- a/sapl/templates/search/search.html +++ b/sapl/templates/search/search.html @@ -12,6 +12,7 @@
{% switch "SAPLN_SWITCH" %} +   {% else %}
From d5a2831c6ac625b38f2bd934a833ed220f096693 Mon Sep 17 00:00:00 2001 From: LeandroJatai Date: Fri, 26 Apr 2024 14:41:06 -0300 Subject: [PATCH 22/81] =?UTF-8?q?fix:=20corrige=20carga=20de=20permiss?= =?UTF-8?q?=C3=B5es=20p=C3=BAblicas=20do=20crud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit permissões declaradas como públicas no atributo "public" do Crud estavam sendo descartadas pois estavam sendo guardadas no atributo crud as subclasses originais do crud, e não a construída dentro do get_urls. --- sapl/base/templatetags/menus.py | 26 +++++++----- sapl/crud/base.py | 73 ++++++++++++++++++++++++--------- 2 files changed, 69 insertions(+), 30 deletions(-) diff --git a/sapl/base/templatetags/menus.py b/sapl/base/templatetags/menus.py index 0c3f54ca9..65ecdcfec 100644 --- a/sapl/base/templatetags/menus.py +++ b/sapl/base/templatetags/menus.py @@ -183,17 +183,21 @@ def resolve_urls_inplace(menu, pk, rm, context): as funcionalidades diretas do MasterDetailCrud, como: - visualização de detalhes, adição, edição, remoção. """ - if 'view' in context: - view = context['view'] - if hasattr(view, '__class__') and\ - hasattr(view.__class__, 'crud'): - urls = view.__class__.crud.get_urls() - for u in urls: - if (u.name == url_name or - 'urls_extras' in menu and - u.name in menu['urls_extras']): - menu['active'] = 'active' - break + try: + if 'view' in context: + view = context['view'] + if hasattr(view, 'crud'): + urls = view.crud.get_urls() + for u in urls: + if (u.name == url_name or + 'urls_extras' in menu and + u.name in menu['urls_extras']): + menu['active'] = 'active' + break + except: + url_active = menu.get('url', '') + logger.warning( + f'Não foi possível definir se url {url_active} é a url ativa.') elif 'check_permission' in menu and not context[ 'request'].user.has_perm(menu['check_permission']): menu['active'] = '' diff --git a/sapl/crud/base.py b/sapl/crud/base.py index 94637d9d7..5dbc713dc 100644 --- a/sapl/crud/base.py +++ b/sapl/crud/base.py @@ -263,18 +263,18 @@ class CrudBaseMixin(CrispyLayoutFormMixin): self.model_name_set = getattr( obj.model, obj.model_set).field.model._meta.model_name - if hasattr(self, 'permission_required') and self.permission_required: - if hasattr(obj, 'public'): - self.permission_required = list( - set(self.permission_required) - set(obj.public)) - else: - obj.public = [] + if not hasattr(obj, 'public'): + obj.public = [] - self.permission_required = tuple(( - self.permission(pr) for pr in self.permission_required)) + if hasattr(self, 'permission_required') and self.permission_required: - else: - obj.public = [] + self.permission_required = tuple( + ( + self.permission(pr) for pr in ( + set(self.permission_required) - set(obj.public) + ) + ) + ) @classmethod def url_name(cls, suffix): @@ -460,7 +460,8 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): # URL padrão para primeira coluna da listagem url = self.resolve_url( ACTION_DETAIL, args=(obj.id,)) if i == 0 else None - # gera URL para matéria a partir de fk_urlify_for_list em layouts.yaml + # gera URL para matéria a partir de fk_urlify_for_list em + # layouts.yaml if i > 0 and func is not None: url = getattr(self, func)(obj, name)[0] @@ -495,7 +496,7 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView): if m: ss = get_field_display(m, n[-1])[1] ss = ( - ('
' if '
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),t={width:n.width(),height:n.height()},i=document.activeElement;try{i.id}catch(e){i=document.body}n.wrap(e);if(n[0]===i||te.contains(n[0],i))te(i).trigger("focus");e=n.parent();if(n.css("position")==="static"){e.css({position:"relative"});n.css({position:"relative"})}else{te.extend(r,{position:n.css("position"),zIndex:n.css("z-index")});te.each(["top","left","bottom","right"],function(e,t){r[t]=n.css(t);if(isNaN(parseInt(r[t],10)))r[t]="auto"});n.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}n.css(t);return e.css(r).show()},removeWrapper:function(e){var t=document.activeElement;if(e.parent().is(".ui-effects-wrapper")){e.parent().replaceWith(e);if(e[0]===t||te.contains(e[0],t))te(t).trigger("focus")}return e}});function O(e,t,n,r){if(te.isPlainObject(e)){t=e;e=e.effect}e={effect:e};if(t==null)t={};if(typeof t==="function"){r=t;n=null;t={}}if(typeof t==="number"||te.fx.speeds[t]){r=n;n=t;t={}}if(typeof n==="function"){r=n;n=null}if(t)te.extend(e,t);n=n||t.duration;e.duration=te.fx.off?0:typeof n==="number"?n:n in te.fx.speeds?te.fx.speeds[n]:te.fx.speeds._default;e.complete=r||t.complete;return e}function E(e){if(!e||typeof e==="number"||te.fx.speeds[e])return true;if(typeof e==="string"&&!te.effects.effect[e])return true;if(typeof e==="function")return true;if(typeof e==="object"&&!e.effect)return true;return false}function Q(e,t){var n=t.outerWidth(),r=t.outerHeight(),i=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=i.exec(e)||["",0,n,r,0];return{top:parseFloat(o[1])||0,right:o[2]==="auto"?n:parseFloat(o[2]),bottom:o[3]==="auto"?r:parseFloat(o[3]),left:parseFloat(o[4])||0}}te.extend(te.effects,{version:"1.13.2",define:function(e,t,n){if(!n){n=t;t="effect"}te.effects.effect[e]=n;te.effects.effect[e].mode=t;return n},scaledDimensions:function(e,t,n){if(t===0)return{height:0,width:0,outerHeight:0,outerWidth:0};var r=n!=="horizontal"?(t||100)/100:1,i=n!=="vertical"?(t||100)/100:1;return{height:e.height()*i,width:e.width()*r,outerHeight:e.outerHeight()*i,outerWidth:e.outerWidth()*r}},clipToBox:function(e){return{width:e.clip.right-e.clip.left,height:e.clip.bottom-e.clip.top,left:e.clip.left,top:e.clip.top}},unshift:function(e,t,n){var r=e.queue();if(t>1)r.splice.apply(r,[1,0].concat(r.splice(t,n)));e.dequeue()},saveStyle:function(e){e.data(t,e[0].style.cssText)},restoreStyle:function(e){e[0].style.cssText=e.data(t)||"";e.removeData(t)},mode:function(e,t){var n=e.is(":hidden");if(t==="toggle")t=n?"show":"hide";if(n?t==="hide":t==="show")t="none";return t},getBaseline:function(e,t){var n,r;switch(e[0]){case"top":n=0;break;case"middle":n=.5;break;case"bottom":n=1;break;default:n=e[0]/t.height}switch(e[1]){case"left":r=0;break;case"center":r=.5;break;case"right":r=1;break;default:r=e[1]/t.width}return{x:r,y:n}},createPlaceholder:function(e){var t,n=e.css("position"),r=e.position();e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight());if(/^(static|relative)/.test(n)){n="absolute";t=te("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),float:e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder");e.data(D+"placeholder",t)}e.css({position:n,left:r.left,top:r.top});return t},removePlaceholder:function(e){var t=D+"placeholder",n=e.data(t);if(n){n.remove();e.removeData(t)}},cleanUp:function(e){te.effects.restoreStyle(e);te.effects.removePlaceholder(e)},setTransition:function(r,e,i,o){o=o||{};te.each(e,function(e,t){var n=r.cssUnit(t);if(n[0]>0)o[t]=n[0]*i+n[1]});return o}}),te.fn.extend({effect:function(){var i=O.apply(this,arguments),o=te.effects.effect[i.effect],s=o.mode,e=i.queue,t=e||"fx",a=i.complete,l=i.mode,c=[],n=function(e){var t=te(this),n=te.effects.mode(t,l)||s;t.data(T,true);c.push(n);if(s&&(n==="show"||n===s&&n==="hide"))t.show();if(!s||n!=="none")te.effects.saveStyle(t);if(typeof e==="function")e()};if(te.fx.off||!o)if(l)return this[l](i.duration,a);else return this.each(function(){if(a)a.call(this)});function r(e){var t=te(this);function n(){t.removeData(T);te.effects.cleanUp(t);if(i.mode==="hide")t.hide();r()}function r(){if(typeof a==="function")a.call(t[0]);if(typeof e==="function")e()}i.mode=c.shift();if(te.uiBackCompat!==false&&!s)if(t.is(":hidden")?l==="hide":l==="show"){t[l]();r()}else o.call(t[0],i,r);else if(i.mode==="none"){t[l]();r()}else o.call(t[0],i,n)}return e===false?this.each(n).each(r):this.queue(t,n).queue(t,r)},show:function(n){return function(e){if(E(e))return n.apply(this,arguments);else{var t=O.apply(this,arguments);t.mode="show";return this.effect.call(this,t)}}}(te.fn.show),hide:function(n){return function(e){if(E(e))return n.apply(this,arguments);else{var t=O.apply(this,arguments);t.mode="hide";return this.effect.call(this,t)}}}(te.fn.hide),toggle:function(n){return function(e){if(E(e)||typeof e==="boolean")return n.apply(this,arguments);else{var t=O.apply(this,arguments);t.mode="toggle";return this.effect.call(this,t)}}}(te.fn.toggle),cssUnit:function(e){var n=this.css(e),r=[];te.each(["em","px","%","pt"],function(e,t){if(n.indexOf(t)>0)r=[parseFloat(n),t]});return r},cssClip:function(e){if(e)return this.css("clip","rect("+e.top+"px "+e.right+"px "+e.bottom+"px "+e.left+"px)");return Q(this.css("clip"),this)},transfer:function(e,t){var n=te(this),r=te(e.to),i=r.css("position")==="fixed",o=te("body"),s=i?o.scrollTop():0,a=i?o.scrollLeft():0,l=r.offset(),c={top:l.top-s,left:l.left-a,height:r.innerHeight(),width:r.innerWidth()},u=n.offset(),d=te("
");d.appendTo("body").addClass(e.className).css({top:u.top-s,left:u.left-a,height:n.innerHeight(),width:n.innerWidth(),position:i?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove();if(typeof t==="function")t()})}}),te.fx.step.clip=function(e){if(!e.clipInit){e.start=te(e.elem).cssClip();if(typeof e.end==="string")e.end=Q(e.end,e.elem);e.clipInit=true}te(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})};var M={},ee=(te.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,e){M[e]=function(e){return Math.pow(e,t+2)}}),te.extend(M,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return e===0||e===1?e:-Math.pow(2,8*(e-1))*Math.sin(((e-1)*80-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){var t,n=4;while(e<((t=Math.pow(2,--n))-1)/11);return 1/Math.pow(4,3-n)-7.5625*Math.pow((t*3-2)/22-e,2)}}),te.each(M,function(e,t){te.easing["easeIn"+e]=t;te.easing["easeOut"+e]=function(e){return 1-t(1-e)};te.easing["easeInOut"+e]=function(e){return e<.5?t(e*2)/2:1-t(e*-2+2)/2}}),te.effects),ne=te.effects.define("blind","hide",function(e,t){var n={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},r=te(this),i=e.direction||"up",o=r.cssClip(),s={clip:te.extend({},o)},a=te.effects.createPlaceholder(r);s.clip[n[i][0]]=s.clip[n[i][1]];if(e.mode==="show"){r.cssClip(s.clip);if(a)a.css(te.effects.clipToBox(s));s.clip=o}if(a)a.animate(te.effects.clipToBox(s),e.duration,e.easing);r.animate(s,{queue:false,duration:e.duration,easing:e.easing,complete:t})}),re=te.effects.define("bounce",function(e,t){var n,r,i,o=te(this),s=e.mode,a=s==="hide",l=s==="show",c=e.direction||"up",u=e.distance,d=e.times||5,h=d*2+(l||a?1:0),f=e.duration/h,p=e.easing,m=c==="up"||c==="down"?"top":"left",g=c==="up"||c==="left",v=0,b=o.queue().length;te.effects.createPlaceholder(o);i=o.css(m);if(!u)u=o[m==="top"?"outerHeight":"outerWidth"]()/3;if(l){r={opacity:1};r[m]=i;o.css("opacity",0).css(m,g?-u*2:u*2).animate(r,f,p)}if(a)u=u/Math.pow(2,d-1);r={};r[m]=i;for(;v
").css({position:"absolute",visibility:"visible",left:-r*p,top:-n*m}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:m,left:i+(h?s*p:0),top:o+(h?a*m:0),opacity:h?0:1}).animate({left:i+(h?0:s*p),top:o+(h?0:a*m),opacity:h?1:0},e.duration||500,e.easing,v)}}function b(){u.css({visibility:"visible"});te(g).remove();t()}}),ae=te.effects.define("fade","toggle",function(e,t){var n=e.mode==="show";te(this).css("opacity",n?0:1).animate({opacity:n?1:0},{queue:false,duration:e.duration,easing:e.easing,complete:t})}),le=te.effects.define("fold","hide",function(t,e){var n=te(this),r=t.mode,i=r==="show",o=r==="hide",s=t.size||15,a=/([0-9]+)%/.exec(s),l=!!t.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=t.duration/2,d=te.effects.createPlaceholder(n),h=n.cssClip(),f={clip:te.extend({},h)},p={clip:te.extend({},h)},m=[h[c[0]],h[c[1]]],g=n.queue().length;if(a)s=parseInt(a[1],10)/100*m[o?0:1];f.clip[c[0]]=s;p.clip[c[0]]=s;p.clip[c[1]]=0;if(i){n.cssClip(p.clip);if(d)d.css(te.effects.clipToBox(p));p.clip=h}n.queue(function(e){if(d)d.animate(te.effects.clipToBox(f),u,t.easing).animate(te.effects.clipToBox(p),u,t.easing);e()}).animate(f,u,t.easing).animate(p,u,t.easing).queue(e);te.effects.unshift(n,g,4)}),ce=te.effects.define("highlight","show",function(e,t){var n=te(this),r={backgroundColor:n.css("backgroundColor")};if(e.mode==="hide")r.opacity=0;te.effects.saveStyle(n);n.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(r,{queue:false,duration:e.duration,easing:e.easing,complete:t})}),ue=te.effects.define("size",function(i,t){var e,o,n,r=te(this),s=["fontSize"],a=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=i.mode,u=c!=="effect",d=i.scale||"both",h=i.origin||["middle","center"],f=r.css("position"),p=r.position(),m=te.effects.scaledDimensions(r),g=i.from||m,v=i.to||te.effects.scaledDimensions(r,0);te.effects.createPlaceholder(r);if(c==="show"){n=g;g=v;v=n}o={from:{y:g.height/m.height,x:g.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}};if(d==="box"||d==="both"){if(o.from.y!==o.to.y){g=te.effects.setTransition(r,a,o.from.y,g);v=te.effects.setTransition(r,a,o.to.y,v)}if(o.from.x!==o.to.x){g=te.effects.setTransition(r,l,o.from.x,g);v=te.effects.setTransition(r,l,o.to.x,v)}}if(d==="content"||d==="both")if(o.from.y!==o.to.y){g=te.effects.setTransition(r,s,o.from.y,g);v=te.effects.setTransition(r,s,o.to.y,v)}if(h){e=te.effects.getBaseline(h,m);g.top=(m.outerHeight-g.outerHeight)*e.y+p.top;g.left=(m.outerWidth-g.outerWidth)*e.x+p.left;v.top=(m.outerHeight-v.outerHeight)*e.y+p.top;v.left=(m.outerWidth-v.outerWidth)*e.x+p.left}delete g.outerHeight;delete g.outerWidth;r.css(g);if(d==="content"||d==="both"){a=a.concat(["marginTop","marginBottom"]).concat(s);l=l.concat(["marginLeft","marginRight"]);r.find("*[width]").each(function(){var e=te(this),t=te.effects.scaledDimensions(e),n={height:t.height*o.from.y,width:t.width*o.from.x,outerHeight:t.outerHeight*o.from.y,outerWidth:t.outerWidth*o.from.x},r={height:t.height*o.to.y,width:t.width*o.to.x,outerHeight:t.height*o.to.y,outerWidth:t.width*o.to.x};if(o.from.y!==o.to.y){n=te.effects.setTransition(e,a,o.from.y,n);r=te.effects.setTransition(e,a,o.to.y,r)}if(o.from.x!==o.to.x){n=te.effects.setTransition(e,l,o.from.x,n);r=te.effects.setTransition(e,l,o.to.x,r)}if(u)te.effects.saveStyle(e);e.css(n);e.animate(r,i.duration,i.easing,function(){if(u)te.effects.restoreStyle(e)})})}r.animate(v,{queue:false,duration:i.duration,easing:i.easing,complete:function(){var e=r.offset();if(v.opacity===0)r.css("opacity",g.opacity);if(!u){r.css("position",f==="static"?"relative":f).offset(e);te.effects.saveStyle(r)}t()}})}),de=te.effects.define("scale",function(e,t){var n=te(this),r=e.mode,i=parseInt(e.percent,10)||(parseInt(e.percent,10)===0?0:r!=="effect"?0:100),o=te.extend(true,{from:te.effects.scaledDimensions(n),to:te.effects.scaledDimensions(n,i,e.direction||"both"),origin:e.origin||["middle","center"]},e);if(e.fade){o.from.opacity=1;o.to.opacity=0}te.effects.effect.size.call(this,o,t)}),he=te.effects.define("puff","hide",function(e,t){var n=te.extend(true,{},e,{fade:true,percent:parseInt(e.percent,10)||150});te.effects.effect.scale.call(this,n,t)}),fe=te.effects.define("pulsate","show",function(e,t){var n=te(this),r=e.mode,i=r==="show",o=r==="hide",s=i||o,a=(e.times||5)*2+(s?1:0),l=e.duration/a,c=0,u=1,d=n.queue().length;if(i||!n.is(":visible")){n.css("opacity",0).show();c=1}for(;u0&&i.is(":visible")}if(/^(input|select|textarea|button|object)$/.test(a)){o=!e.disabled;if(o){s=te(e).closest("fieldset")[0];if(s)o=!s.disabled}}else if("a"===a)o=e.href||t;else o=t;return o&&te(e).is(":visible")&&ve(te(e))},te.extend(te.expr.pseudos,{focusable:function(e){return te.ui.focusable(e,te.attr(e,"tabindex")!=null)}});var be=te.ui.focusable,ye=te.fn._form=function(){return typeof this[0].form==="string"?this.closest("form"):te(this[0].form)},_e=te.ui.formResetMixin={_formResetHandler:function(){var t=te(this);setTimeout(function(){var e=t.data("ui-form-reset-instances");te.each(e,function(){this.refresh()})})},_bindFormResetHandler:function(){this.form=this.element._form();if(!this.form.length)return;var e=this.form.data("ui-form-reset-instances")||[];if(!e.length)this.form.on("reset.ui-form-reset",this._formResetHandler);e.push(this);this.form.data("ui-form-reset-instances",e)},_unbindFormResetHandler:function(){if(!this.form.length)return;var e=this.form.data("ui-form-reset-instances");e.splice(te.inArray(this,e),1);if(e.length)this.form.data("ui-form-reset-instances",e);else this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}};if(!te.expr.pseudos)te.expr.pseudos=te.expr[":"];if(!te.uniqueSort)te.uniqueSort=te.unique;if(!te.escapeSelector){var we=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;var xe=function(e,t){if(t){if(e==="\0")return"�";return e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" "}return"\\"+e};te.escapeSelector=function(e){return(e+"").replace(we,xe)}}if(!te.fn.even||!te.fn.odd)te.fn.extend({even:function(){return this.filter(function(e){return e%2===0})},odd:function(){return this.filter(function(e){return e%2===1})}});var Ce=te.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},ke=te.fn.labels=function(){var e,t,n,r,i;if(!this.length)return this.pushStack([]);if(this[0].labels&&this[0].labels.length)return this.pushStack(this[0].labels);r=this.eq(0).parents("label");n=this.attr("id");if(n){e=this.eq(0).parents().last();i=e.add(e.length?e.siblings():this.siblings());t="label[for='"+te.escapeSelector(n)+"']";r=r.add(i.find(t).addBack(t))}return this.pushStack(r)},Se=te.fn.scrollParent=function(e){var t=this.css("position"),n=t==="absolute",r=e?/(auto|scroll|hidden)/:/(auto|scroll)/,i=this.parents().filter(function(){var e=te(this);if(n&&e.css("position")==="static")return false;return r.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return t==="fixed"||!i.length?te(this[0].ownerDocument||document):i},De=te.extend(te.expr.pseudos,{tabbable:function(e){var t=te.attr(e,"tabindex"),n=t!=null;return(!n||t>=0)&&te.ui.focusable(e,n)}}),Te=te.fn.extend({uniqueId:function(){var e=0;return function(){return this.each(function(){if(!this.id)this.id="ui-id-"+ ++e})}}(),removeUniqueId:function(){return this.each(function(){if(/^ui-id-\d+$/.test(this.id))te(this).removeAttr("id")})}}),Oe=te.widget("ui.accordion",{version:"1.13.2",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:false,event:"click",header:function(e){return e.find("> li > :first-child").add(e.find("> :not(li)").even())},heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=te();this._addClass("ui-accordion","ui-widget ui-helper-reset");this.element.attr("role","tablist");if(!e.collapsible&&(e.active===false||e.active==null))e.active=0;this._processPanels();if(e.active<0)e.active+=this.headers.length;this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:!this.active.length?te():this.active.next()}},_createIcons:function(){var e,t,n=this.options.icons;if(n){e=te("");this._addClass(e,"ui-accordion-header-icon","ui-icon "+n.header);e.prependTo(this.headers);t=this.active.children(".ui-accordion-header-icon");this._removeClass(t,n.header)._addClass(t,null,n.activeHeader)._addClass(this.headers,"ui-accordion-icons")}},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons");this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeAttr("role");this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId();this._destroyIcons();e=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId();if(this.options.heightStyle!=="content")e.css("height","")},_setOption:function(e,t){if(e==="active"){this._activate(t);return}if(e==="event"){if(this.options.event)this._off(this.headers,this.options.event);this._setupEvents(t)}this._super(e,t);if(e==="collapsible"&&!t&&this.options.active===false)this._activate(0);if(e==="icons"){this._destroyIcons();if(t)this._createIcons()}},_setOptionDisabled:function(e){this._super(e);this.element.attr("aria-disabled",e);this._toggleClass(null,"ui-state-disabled",!!e);this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!e)},_keydown:function(e){if(e.altKey||e.ctrlKey)return;var t=te.ui.keyCode,n=this.headers.length,r=this.headers.index(e.target),i=false;switch(e.keyCode){case t.RIGHT:case t.DOWN:i=this.headers[(r+1)%n];break;case t.LEFT:case t.UP:i=this.headers[(r-1+n)%n];break;case t.SPACE:case t.ENTER:this._eventHandler(e);break;case t.HOME:i=this.headers[0];break;case t.END:i=this.headers[n-1];break}if(i){te(e.target).attr("tabIndex",-1);te(i).attr("tabIndex",0);te(i).trigger("focus");e.preventDefault()}},_panelKeyDown:function(e){if(e.keyCode===te.ui.keyCode.UP&&e.ctrlKey)te(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels();if(e.active===false&&e.collapsible===true||!this.headers.length){e.active=false;this.active=te()}else if(e.active===false)this._activate(0);else if(this.active.length&&!te.contains(this.element[0],this.active[0]))if(this.headers.length===this.headers.find(".ui-state-disabled").length){e.active=false;this.active=te()}else this._activate(Math.max(0,e.active-1));else e.active=this.headers.index(this.active);this._destroyIcons();this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;if(typeof this.options.header==="function")this.headers=this.options.header(this.element);else this.headers=this.element.find(this.options.header);this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default");this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide();this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content");if(t){this._off(e.not(this.headers));this._off(t.not(this.panels))}},_refresh:function(){var n,e=this.options,t=e.heightStyle,r=this.element.parent();this.active=this._findActive(e.active);this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed");this._addClass(this.active.next(),"ui-accordion-content-active");this.active.next().show();this.headers.attr("role","tab").each(function(){var e=te(this),t=e.uniqueId().attr("id"),n=e.next(),r=n.uniqueId().attr("id");e.attr("aria-controls",r);n.attr("aria-labelledby",t)}).next().attr("role","tabpanel");this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide();if(!this.active.length)this.headers.eq(0).attr("tabIndex",0);else this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"});this._createIcons();this._setupEvents(e.event);if(t==="fill"){n=r.height();this.element.siblings(":visible").each(function(){var e=te(this),t=e.css("position");if(t==="absolute"||t==="fixed")return;n-=e.outerHeight(true)});this.headers.each(function(){n-=te(this).outerHeight(true)});this.headers.next().each(function(){te(this).height(Math.max(0,n-te(this).innerHeight()+te(this).height()))}).css("overflow","auto")}else if(t==="auto"){n=0;this.headers.next().each(function(){var e=te(this).is(":visible");if(!e)te(this).show();n=Math.max(n,te(this).css("height","").height());if(!e)te(this).hide()}).height(n)}},_activate:function(e){var t=this._findActive(e)[0];if(t===this.active[0])return;t=t||this.active[0];this._eventHandler({target:t,currentTarget:t,preventDefault:te.noop})},_findActive:function(e){return typeof e==="number"?this.headers.eq(e):te()},_setupEvents:function(e){var n={keydown:"_keydown"};if(e)te.each(e.split(" "),function(e,t){n[t]="_eventHandler"});this._off(this.headers.add(this.headers.next()));this._on(this.headers,n);this._on(this.headers.next(),{keydown:"_panelKeyDown"});this._hoverable(this.headers);this._focusable(this.headers)},_eventHandler:function(e){var t,n,r=this.options,i=this.active,o=te(e.currentTarget),s=o[0]===i[0],a=s&&r.collapsible,l=a?te():o.next(),c=i.next(),u={oldHeader:i,oldPanel:c,newHeader:a?te():o,newPanel:l};e.preventDefault();if(s&&!r.collapsible||this._trigger("beforeActivate",e,u)===false)return;r.active=a?false:this.headers.index(o);this.active=s?te():o;this._toggle(u);this._removeClass(i,"ui-accordion-header-active","ui-state-active");if(r.icons){t=i.children(".ui-accordion-header-icon");this._removeClass(t,null,r.icons.activeHeader)._addClass(t,null,r.icons.header)}if(!s){this._removeClass(o,"ui-accordion-header-collapsed")._addClass(o,"ui-accordion-header-active","ui-state-active");if(r.icons){n=o.children(".ui-accordion-header-icon");this._removeClass(n,null,r.icons.header)._addClass(n,null,r.icons.activeHeader)}this._addClass(o.next(),"ui-accordion-content-active")}},_toggle:function(e){var t=e.newPanel,n=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(true,true);this.prevShow=t;this.prevHide=n;if(this.options.animate)this._animate(t,n,e);else{n.hide();t.show();this._toggleComplete(e)}n.attr({"aria-hidden":"true"});n.prev().attr({"aria-selected":"false","aria-expanded":"false"});if(t.length&&n.length)n.prev().attr({tabIndex:-1,"aria-expanded":"false"});else if(t.length)this.headers.filter(function(){return parseInt(te(this).attr("tabIndex"),10)===0}).attr("tabIndex",-1);t.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,n,t){var r,i,o,s=this,a=0,l=e.css("box-sizing"),c=e.length&&(!n.length||e.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element;this.mouseHandled=false;this.lastMousePosition={x:null,y:null};this.element.uniqueId().attr({role:this.options.role,tabIndex:0});this._addClass("ui-menu","ui-widget ui-widget-content");this._on({"mousedown .ui-menu-item":function(e){e.preventDefault();this._activateItem(e)},"click .ui-menu-item":function(e){var t=te(e.target);var n=te(te.ui.safeActiveElement(this.document[0]));if(!this.mouseHandled&&t.not(".ui-state-disabled").length){this.select(e);if(!e.isPropagationStopped())this.mouseHandled=true;if(t.has(".ui-menu").length)this.expand(e);else if(!this.element.is(":focus")&&n.closest(".ui-menu").length){this.element.trigger("focus",[true]);if(this.active&&this.active.parents(".ui-menu").length===1)clearTimeout(this.timer)}}},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var n=this.active||this._menuItems().first();if(!t)this.focus(e,n)},blur:function(t){this._delay(function(){var e=!te.contains(this.element[0],te.ui.safeActiveElement(this.document[0]));if(e)this.collapseAll(t)})},keydown:"_keydown"});this.refresh();this._on(this.document,{click:function(e){if(this._closeOnDocumentClick(e))this.collapseAll(e,true);this.mouseHandled=false}})},_activateItem:function(e){if(this.previousFilter)return;if(e.clientX===this.lastMousePosition.x&&e.clientY===this.lastMousePosition.y)return;this.lastMousePosition={x:e.clientX,y:e.clientY};var t=te(e.target).closest(".ui-menu-item"),n=te(e.currentTarget);if(t[0]!==n[0])return;if(n.is(".ui-state-active"))return;this._removeClass(n.siblings().children(".ui-state-active"),null,"ui-state-active");this.focus(e,n)},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),t=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled "+"tabIndex").removeUniqueId().show();t.children().each(function(){var e=te(this);if(e.data("ui-menu-submenu-caret"))e.remove()})},_keydown:function(e){var t,n,r,i,o=true;switch(e.keyCode){case te.ui.keyCode.PAGE_UP:this.previousPage(e);break;case te.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case te.ui.keyCode.HOME:this._move("first","first",e);break;case te.ui.keyCode.END:this._move("last","last",e);break;case te.ui.keyCode.UP:this.previous(e);break;case te.ui.keyCode.DOWN:this.next(e);break;case te.ui.keyCode.LEFT:this.collapse(e);break;case te.ui.keyCode.RIGHT:if(this.active&&!this.active.is(".ui-state-disabled"))this.expand(e);break;case te.ui.keyCode.ENTER:case te.ui.keyCode.SPACE:this._activate(e);break;case te.ui.keyCode.ESCAPE:this.collapse(e);break;default:o=false;n=this.previousFilter||"";i=false;r=e.keyCode>=96&&e.keyCode<=105?(e.keyCode-96).toString():String.fromCharCode(e.keyCode);clearTimeout(this.filterTimer);if(r===n)i=true;else r=n+r;t=this._filterMenuItems(r);t=i&&t.index(this.active.next())!==-1?this.active.nextAll(".ui-menu-item"):t;if(!t.length){r=String.fromCharCode(e.keyCode);t=this._filterMenuItems(r)}if(t.length){this.focus(e,t);this.previousFilter=r;this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)}else delete this.previousFilter}if(o)e.preventDefault()},_activate:function(e){if(this.active&&!this.active.is(".ui-state-disabled"))if(this.active.children("[aria-haspopup='true']").length)this.expand(e);else this.select(e)},refresh:function(){var e,t,n,r,i,o=this,s=this.options.icons.submenu,a=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length);n=a.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=te(this),t=e.prev(),n=te("").data("ui-menu-submenu-caret",true);o._addClass(n,"ui-menu-icon","ui-icon "+s);t.attr("aria-haspopup","true").prepend(n);e.attr("aria-labelledby",t.attr("id"))});this._addClass(n,"ui-menu","ui-widget ui-widget-content ui-front");e=a.add(this.element);t=e.find(this.options.items);t.not(".ui-menu-item").each(function(){var e=te(this);if(o._isDivider(e))o._addClass(e,"ui-menu-divider","ui-widget-content")});r=t.not(".ui-menu-item, .ui-menu-divider");i=r.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()});this._addClass(r,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper");t.filter(".ui-state-disabled").attr("aria-disabled","true");if(this.active&&!te.contains(this.element[0],this.active[0]))this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){if(e==="icons"){var n=this.element.find(".ui-menu-icon");this._removeClass(n,null,this.options.icons.submenu)._addClass(n,null,t.submenu)}this._super(e,t)},_setOptionDisabled:function(e){this._super(e);this.element.attr("aria-disabled",String(e));this._toggleClass(null,"ui-state-disabled",!!e)},focus:function(e,t){var n,r,i;this.blur(e,e&&e.type==="focus");this._scrollIntoView(t);this.active=t.first();r=this.active.children(".ui-menu-item-wrapper");this._addClass(r,null,"ui-state-active");if(this.options.role)this.element.attr("aria-activedescendant",r.attr("id"));i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper");this._addClass(i,null,"ui-state-active");if(e&&e.type==="keydown")this._close();else this.timer=this._delay(function(){this._close()},this.delay);n=t.children(".ui-menu");if(n.length&&e&&/^mouse/.test(e.type))this._startOpening(n);this.activeMenu=t.parent();this._trigger("focus",e,{item:t})},_scrollIntoView:function(e){var t,n,r,i,o,s;if(this._hasScroll()){t=parseFloat(te.css(this.activeMenu[0],"borderTopWidth"))||0;n=parseFloat(te.css(this.activeMenu[0],"paddingTop"))||0;r=e.offset().top-this.activeMenu.offset().top-t-n;i=this.activeMenu.scrollTop();o=this.activeMenu.height();s=e.outerHeight();if(r<0)this.activeMenu.scrollTop(i+r);else if(r+s>o)this.activeMenu.scrollTop(i+r-o+s)}},blur:function(e,t){if(!t)clearTimeout(this.timer);if(!this.active)return;this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active");this._trigger("blur",e,{item:this.active});this.active=null},_startOpening:function(e){clearTimeout(this.timer);if(e.attr("aria-hidden")!=="true")return;this.timer=this._delay(function(){this._close();this._open(e)},this.delay)},_open:function(e){var t=te.extend({of:this.active},this.options.position);clearTimeout(this.timer);this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true");e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(t)},collapseAll:function(t,n){clearTimeout(this.timer);this.timer=this._delay(function(){var e=n?this.element:te(t&&t.target).closest(this.element.find(".ui-menu"));if(!e.length)e=this.element;this._close(e);this.blur(t);this._removeClass(e.find(".ui-state-active"),null,"ui-state-active");this.activeMenu=e},n?0:this.delay)},_close:function(e){if(!e)e=this.active?this.active.parent():this.element;e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!te(e.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);if(t&&t.length){this._close();this.focus(e,t)}},expand:function(e){var t=this.active&&this._menuItems(this.active.children(".ui-menu")).first();if(t&&t.length){this._open(t.parent());this._delay(function(){this.focus(e,t)})}},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_menuItems:function(e){return(e||this.element).find(this.options.items).filter(".ui-menu-item")},_move:function(e,t,n){var r;if(this.active)if(e==="first"||e==="last")r=this.active[e==="first"?"prevAll":"nextAll"](".ui-menu-item").last();else r=this.active[e+"All"](".ui-menu-item").first();if(!r||!r.length||!this.active)r=this._menuItems(this.activeMenu)[t]();this.focus(n,r)},nextPage:function(e){var t,n,r;if(!this.active){this.next(e);return}if(this.isLastItem())return;if(this._hasScroll()){n=this.active.offset().top;r=this.element.innerHeight();if(te.fn.jquery.indexOf("3.2.")===0)r+=this.element[0].offsetHeight-this.element.outerHeight();this.active.nextAll(".ui-menu-item").each(function(){t=te(this);return t.offset().top-n-r<0});this.focus(e,t)}else this.focus(e,this._menuItems(this.activeMenu)[!this.active?"first":"last"]())},previousPage:function(e){var t,n,r;if(!this.active){this.next(e);return}if(this.isFirstItem())return;if(this._hasScroll()){n=this.active.offset().top;r=this.element.innerHeight();if(te.fn.jquery.indexOf("3.2.")===0)r+=this.element[0].offsetHeight-this.element.outerHeight();this.active.prevAll(".ui-menu-item").each(function(){t=te(this);return t.offset().top-n+r>0});this.focus(e,t)}else this.focus(e,this._menuItems(this.activeMenu).first())},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var n,r,i,e=this.element[0].nodeName.toLowerCase(),t=e==="textarea",o=e==="input";this.isMultiLine=t||!o&&this._isContentEditable(this.element);this.valueMethod=this.element[t||o?"val":"text"];this.isNewMenu=true;this._addClass("ui-autocomplete-input");this.element.attr("autocomplete","off");this._on(this.element,{keydown:function(e){if(this.element.prop("readOnly")){n=true;i=true;r=true;return}n=false;i=false;r=false;var t=te.ui.keyCode;switch(e.keyCode){case t.PAGE_UP:n=true;this._move("previousPage",e);break;case t.PAGE_DOWN:n=true;this._move("nextPage",e);break;case t.UP:n=true;this._keyEvent("previous",e);break;case t.DOWN:n=true;this._keyEvent("next",e);break;case t.ENTER:if(this.menu.active){n=true;e.preventDefault();this.menu.select(e)}break;case t.TAB:if(this.menu.active)this.menu.select(e);break;case t.ESCAPE:if(this.menu.element.is(":visible")){if(!this.isMultiLine)this._value(this.term);this.close(e);e.preventDefault()}break;default:r=true;this._searchTimeout(e);break}},keypress:function(e){if(n){n=false;if(!this.isMultiLine||this.menu.element.is(":visible"))e.preventDefault();return}if(r)return;var t=te.ui.keyCode;switch(e.keyCode){case t.PAGE_UP:this._move("previousPage",e);break;case t.PAGE_DOWN:this._move("nextPage",e);break;case t.UP:this._keyEvent("previous",e);break;case t.DOWN:this._keyEvent("next",e);break}},input:function(e){if(i){i=false;e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null;this.previous=this._value()},blur:function(e){clearTimeout(this.searching);this.close(e);this._change(e)}});this._initSource();this.menu=te("