From 20801851929b8c14ef7ee331215ddba510eca4a0 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Tue, 4 Dec 2018 16:15:22 -0200
Subject: [PATCH 001/222] HOTFIX - materia do expediente sem observacao no
resumo
---
sapl/sessao/views.py | 3 ++-
sapl/templates/sessao/blocos_resumo/materias_expediente.html | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 2f93b7056..6082be290 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -1403,7 +1403,8 @@ class ResumoView(DetailView):
'resultado_observacao': resultado_observacao,
'autor': autor,
'numero_protocolo': m.materia.numero_protocolo,
- 'numero_processo': m.materia.numeracao_set.last()
+ 'numero_processo': m.materia.numeracao_set.last(),
+ 'observacao': m.observacao
}
materias_expediente.append(mat)
diff --git a/sapl/templates/sessao/blocos_resumo/materias_expediente.html b/sapl/templates/sessao/blocos_resumo/materias_expediente.html
index 556b53039..48dcf9c14 100644
--- a/sapl/templates/sessao/blocos_resumo/materias_expediente.html
+++ b/sapl/templates/sessao/blocos_resumo/materias_expediente.html
@@ -33,7 +33,7 @@
Processo: {{ m.numero_processo }}
{% endif %}
- {{m.ementa|safe}}
+ {{m.ementa|safe}} {{m.observacao}}
{{m.resultado}} {{m.resultado_observacao}}
{% endfor %}
From d0efd37c697d0b6f4d554e1188a1b01f7f240784 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Tue, 11 Dec 2018 15:02:37 -0200
Subject: [PATCH 002/222] HOTFIX - observacao da ementa das materias nao
aparecia na pauta da sessao
---
sapl/sessao/views.py | 2 ++
sapl/templates/sessao/pauta_sessao_detail.html | 4 ++--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 6082be290..98ca3815c 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -2766,6 +2766,7 @@ class PautaSessaoDetailView(DetailView):
mat = {'id': m.materia_id,
'ementa': ementa,
+ 'observacao': m.observacao,
'titulo': titulo,
'numero': numero,
'resultado': resultado,
@@ -2829,6 +2830,7 @@ class PautaSessaoDetailView(DetailView):
mat = {'id': o.materia_id,
'ementa': ementa,
+ 'observacao': o.observacao,
'titulo': titulo,
'numero': numero,
'resultado': resultado,
diff --git a/sapl/templates/sessao/pauta_sessao_detail.html b/sapl/templates/sessao/pauta_sessao_detail.html
index 8cf784b86..cd779a78a 100644
--- a/sapl/templates/sessao/pauta_sessao_detail.html
+++ b/sapl/templates/sessao/pauta_sessao_detail.html
@@ -34,7 +34,7 @@
Autor{{ m.autor|length|pluralize:"es" }} : {{ m.autor|join:', ' }}
- {{m.ementa|safe}}
+ {{m.ementa|safe}} {{m.observacao|safe}}
{{m.situacao}}
{% endfor %}
@@ -62,7 +62,7 @@
Autor{{ m.autor|length|pluralize:"es" }} : {{ m.autor|join:', ' }}
- {{m.ementa|safe}}
+ {{m.ementa|safe}} {{m.observacao|safe}}
{{m.situacao}}
{% endfor %}
From dff82278a978ddf7689a7683715f9feafaea5333 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 12 Dec 2018 12:46:49 -0200
Subject: [PATCH 003/222] =?UTF-8?q?HOT-FIX:=20adiciona=20logging=20de=20er?=
=?UTF-8?q?ros=20n=C3=A3o=20tratados?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/settings.py | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/sapl/settings.py b/sapl/settings.py
index 0c3f9935e..d30b4df3c 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -15,6 +15,7 @@ See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
"""
import logging
import socket
+import sys
from decouple import config
from dj_database_url import parse as db_url
@@ -335,12 +336,16 @@ LOGGING = {
}
-def excepthook(*args):
- logging.getLogger(BASE_DIR.name).error(
- 'Uncaught exception:', exc_info=args)
+def uncaught_exceptions(type, value, error_traceback):
+ import traceback
+ logger = logging.getLogger(__name__)
+ error_msg = ''.join(traceback.format_tb(error_traceback))
+ logger.error(error_msg)
+ print(error_msg)
-# sys.excepthook = excepthook"""
+# captura exceções que não foram tratadas
+sys.excepthook = uncaught_exceptions
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.PBKDF2PasswordHasher', # default
From 789d67ddacb9cedf4fea6a1bd1de92cd1c18ce1a Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 12 Dec 2018 14:58:48 -0200
Subject: [PATCH 004/222] =?UTF-8?q?HOT-FIX:=20diminui=20o=20n=C3=ADvel=20d?=
=?UTF-8?q?o=20logging?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/parlamentares/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index f9a37b373..ce32475f0 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -574,7 +574,7 @@ class ParlamentarCrud(Crud):
# Caso encontre UMA filiação nessas condições
else:
- self.logger.info("user=" + username + ". Filiação encontrada com sucesso.")
+ self.logger.debug("user=" + username + ". Filiação encontrada com sucesso.")
row[1] = (filiacao.partido.sigla, None, None)
return context
From 68e8df3a77c5071d623000ce356944627ae3a79f Mon Sep 17 00:00:00 2001
From: Edward
Date: Wed, 12 Dec 2018 18:57:37 -0200
Subject: [PATCH 005/222] Fixes #2422 (#2423)
---
sapl/templates/protocoloadm/comprovante.html | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html
index 9dcf9a638..d285b4e4f 100644
--- a/sapl/templates/protocoloadm/comprovante.html
+++ b/sapl/templates/protocoloadm/comprovante.html
@@ -14,15 +14,21 @@
th, td {
padding: 5px;
}
+ @media print {
+ .hide-print {
+ display : none;
+ }
+ }
+ @page {
+ size: auto; /* auto is the initial value */
+ margin: 0mm; /* this affects the margin in the printer settings */
+ }
-
-
+
+
-
-
-
Date: Wed, 12 Dec 2018 19:02:47 -0200
Subject: [PATCH 006/222] Fixes #2420 (#2424)
---
.../migrations/0010_auto_20181212_1900.py | 20 +++++++++++++++++++
sapl/protocoloadm/models.py | 2 +-
2 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 sapl/protocoloadm/migrations/0010_auto_20181212_1900.py
diff --git a/sapl/protocoloadm/migrations/0010_auto_20181212_1900.py b/sapl/protocoloadm/migrations/0010_auto_20181212_1900.py
new file mode 100644
index 000000000..df5d6c078
--- /dev/null
+++ b/sapl/protocoloadm/migrations/0010_auto_20181212_1900.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-12-12 21:00
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('protocoloadm', '0009_merge'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='protocolo',
+ name='justificativa_anulacao',
+ field=models.CharField(blank=True, max_length=260, verbose_name='Motivo'),
+ ),
+ ]
diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py
index aa4e7c0c2..1b061fa18 100644
--- a/sapl/protocoloadm/models.py
+++ b/sapl/protocoloadm/models.py
@@ -93,7 +93,7 @@ class Protocolo(models.Model):
user_anulacao = models.CharField(max_length=20, blank=True)
ip_anulacao = models.CharField(max_length=15, blank=True)
justificativa_anulacao = models.CharField(
- max_length=60, blank=True, verbose_name=_('Motivo'))
+ max_length=260, blank=True, verbose_name=_('Motivo'))
timestamp_anulacao = models.DateTimeField(blank=True, null=True)
class Meta:
From 847ae35b2756e036568182a50eb50940bf063ea6 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 13 Dec 2018 14:06:54 -0200
Subject: [PATCH 007/222] =?UTF-8?q?add=20condi=C3=A7=C3=A3o=20em=20gera?=
=?UTF-8?q?=C3=A7=C3=A3o=20de=20notas=20de=20compila=C3=A7=C3=A3o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/compilacao/views.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index a82f63556..7d28f619a 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -1319,6 +1319,9 @@ class TextEditView(CompMixin, TemplateView):
if dispositivo.ta_publicado_id:
d = dispositivo.dispositivo_atualizador.dispositivo_pai
+ if d.auto_inserido:
+ d = d.dispositivo_pai
+
ta_publicado = lista_ta_publicado[dispositivo.ta_publicado_id] if\
lista_ta_publicado else dispositivo.ta_publicado
From 75ec305d929a8d181a65d6eb9132ea30d55fee28 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 13 Dec 2018 14:35:39 -0200
Subject: [PATCH 008/222] =?UTF-8?q?adequa=20tag=20de=20nota=20de=20compila?=
=?UTF-8?q?=C3=A7=C3=A3o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/compilacao/templatetags/compilacao_filters.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py
index e56478bae..a7fb2eada 100644
--- a/sapl/compilacao/templatetags/compilacao_filters.py
+++ b/sapl/compilacao/templatetags/compilacao_filters.py
@@ -83,6 +83,9 @@ def nota_automatica(dispositivo, ta_pub_list):
if dispositivo.ta_publicado:
d = dispositivo.dispositivo_atualizador.dispositivo_pai
+ if d.auto_inserido:
+ d = d.dispositivo_pai
+
ta_publicado = ta_pub_list[dispositivo.ta_publicado_id] if\
ta_pub_list else dispositivo.ta_publicado
From de9abc05ebcae1be8e37800c966e93e38d5b1700 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Thu, 13 Dec 2018 18:10:49 -0200
Subject: [PATCH 009/222] =?UTF-8?q?HOT-FIX:=20muda=20hera=C3=A7=C3=A3o=20d?=
=?UTF-8?q?e=20FrenteCrud?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/parlamentares/views.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index ce32475f0..c47d36566 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -288,7 +288,7 @@ def parlamentares_frente_selected(request):
return JsonResponse({'id_list': list(lista_parlamentar_id)})
-class FrenteCrud(CrudAux):
+class FrenteCrud(Crud):
model = Frente
help_topic = 'tipo_situa_militar'
public = [RP_DETAIL, RP_LIST]
From 21015c43853f7ce4151d867ff1d30514917f82d1 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Fri, 14 Dec 2018 11:56:47 -0200
Subject: [PATCH 010/222] fix #2344 (#2417)
* Faltando form seleciona e view e html
* fix #2344
---
sapl/materia/urls.py | 7 ++
sapl/protocoloadm/forms.py | 77 +++++++++++++
sapl/protocoloadm/views.py | 98 +++++++++++++++-
.../materia/impressos/ficha_adm_pdf.html | 107 ++++++++++++++++++
.../materia/impressos/impressos.html | 6 +-
5 files changed, 293 insertions(+), 2 deletions(-)
create mode 100644 sapl/templates/materia/impressos/ficha_adm_pdf.html
diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py
index 030e5386e..e446e6a64 100644
--- a/sapl/materia/urls.py
+++ b/sapl/materia/urls.py
@@ -26,6 +26,7 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
proposicao_texto, recuperar_materia,
ExcluirTramitacaoEmLoteView, RetornarProposicao)
from sapl.norma.views import NormaPesquisaSimplesView
+from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView)
from .apps import AppConfig
@@ -47,6 +48,12 @@ urlpatterns_impressos = [
url(r'^materia/impressos/norma-pesquisa/$',
NormaPesquisaSimplesView.as_view(),
name='impressos_norma_pesquisa'),
+ url(r'^materia/impressos/ficha-pesquisa-adm/$',
+ FichaPesquisaAdmView.as_view(),
+ name= 'impressos_ficha_pesquisa_adm'),
+ url(r'^materia/impressos/ficha-seleciona-adm/$',
+ FichaSelecionaAdmView.as_view(),
+ name= 'impressos_ficha_seleciona_adm'),
]
urlpatterns_materia = [
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index a621754b7..0edd63a34 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -1000,3 +1000,80 @@ def filtra_tramitacao_adm_destino_and_status(status, destino):
status=status,
unidade_tramitacao_destino=destino).distinct().values_list(
'documento_id', flat=True)
+
+class FichaPesquisaAdmForm(forms.Form):
+
+ logger = logging.getLogger(__name__)
+
+ tipo_documento = forms.ModelChoiceField(
+ label=TipoDocumentoAdministrativo._meta.verbose_name,
+ queryset=TipoDocumentoAdministrativo.objects.all(),
+ empty_label='Selecione')
+
+ data_inicial = forms.DateField(
+ label='Data Inicial',
+ widget=forms.DateInput(format='%d/%m/%Y')
+ )
+
+ data_final = forms.DateField(
+ label='Data Final',
+ widget=forms.DateInput(format='%d/%m/%Y')
+ )
+
+ def __init__(self, *args, **kwargs):
+ super(FichaPesquisaAdmForm, self).__init__(*args, **kwargs)
+
+ row1 = to_row(
+ [('tipo_documento', 6),
+ ('data_inicial', 3),
+ ('data_final', 3)])
+
+ self.helper = FormHelper()
+ self.helper.layout = Layout(
+ Fieldset(
+ ('Formulário de Ficha'),
+ row1,
+ form_actions(label='Pesquisar')
+ )
+ )
+
+ def clean(self):
+ super(FichaPesquisaAdmForm, self).clean()
+
+ if not self.is_valid():
+ return self.cleaned_data
+
+ cleaned_data = self.cleaned_data
+
+ if not self.is_valid():
+ return cleaned_data
+
+ if cleaned_data['data_final'] < cleaned_data['data_inicial']:
+ self.logger.error("A Data Final ({}) não pode ser menor que a Data Inicial ({})."
+ .format(cleaned_data['data_final'], cleaned_data['data_inicial']))
+ raise ValidationError(_(
+ 'A Data Final não pode ser menor que a Data Inicial'))
+
+ return cleaned_data
+
+
+class FichaSelecionaAdmForm(forms.Form):
+ documento = forms.ModelChoiceField(
+ widget=forms.RadioSelect,
+ queryset=DocumentoAdministrativo.objects.all(),
+ label='')
+
+ def __init__(self, *args, **kwargs):
+ super(FichaSelecionaAdmForm, self).__init__(*args, **kwargs)
+
+ row1 = to_row(
+ [('documento', 12)])
+
+ self.helper = FormHelper()
+ self.helper.layout = Layout(
+ Fieldset(
+ ('Selecione a ficha que deseja imprimir'),
+ row1,
+ form_actions(label='Gerar Impresso')
+ )
+ )
\ No newline at end of file
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
index 1d68dfce2..8dd7e9e47 100755
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -29,6 +29,7 @@ from sapl.base.signals import tramitacao_signal
from sapl.comissoes.models import Comissao
from sapl.crud.base import Crud, CrudAux, MasterDetailCrud, make_pagination
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
+from sapl.materia.views import gerar_pdf_impressos
from sapl.parlamentares.models import Legislatura, Parlamentar
from sapl.protocoloadm.models import Protocolo
from sapl.utils import (create_barcode, get_base_url, get_client_ip,
@@ -38,7 +39,7 @@ from sapl.utils import (create_barcode, get_base_url, get_client_ip,
from .forms import (AcompanhamentoDocumentoForm, AnularProcoloAdmForm,
DocumentoAcessorioAdministrativoForm,
DocumentoAdministrativoFilterSet,
- DocumentoAdministrativoForm, ProtocoloDocumentForm,
+ DocumentoAdministrativoForm, FichaPesquisaAdmForm, FichaSelecionaAdmForm, ProtocoloDocumentForm,
ProtocoloFilterSet, ProtocoloMateriaForm,
TramitacaoAdmEditForm, TramitacaoAdmForm,
DesvincularDocumentoForm, DesvincularMateriaForm,
@@ -1073,3 +1074,98 @@ class DesvincularMateriaView(PermissionRequiredMixin, FormView):
materia.numero_protocolo = None
materia.save()
return redirect(self.get_success_url())
+
+
+class ImpressosView(PermissionRequiredMixin, TemplateView):
+ template_name = 'materia/impressos/impressos.html'
+ permission_required = ('materia.can_access_impressos', )
+
+
+class FichaPesquisaAdmView(PermissionRequiredMixin, FormView):
+ form_class = FichaPesquisaAdmForm
+ template_name = 'materia/impressos/ficha.html'
+ permission_required = ('materia.can_access_impressos', )
+
+ def form_valid(self, form):
+ tipo_documento = form.data['tipo_documento']
+ data_inicial = form.data['data_inicial']
+ data_final = form.data['data_final']
+
+ url = reverse('sapl.materia:impressos_ficha_seleciona_adm')
+ url = url + '?tipo=%s&data_inicial=%s&data_final=%s' % (
+ tipo_documento, data_inicial, data_final)
+
+ return HttpResponseRedirect(url)
+
+
+class FichaSelecionaAdmView(PermissionRequiredMixin, FormView):
+ logger = logging.getLogger(__name__)
+ form_class = FichaSelecionaAdmForm
+ template_name = 'materia/impressos/ficha_seleciona.html'
+ permission_required = ('materia.can_access_impressos', )
+
+ def get_context_data(self, **kwargs):
+ if ('tipo' not in self.request.GET or
+ 'data_inicial' not in self.request.GET or
+ 'data_final' not in self.request.GET):
+ return HttpResponseRedirect(reverse(
+ 'sapl.materia:impressos_ficha_pesquisa_adm'))
+
+ context = super(FichaSelecionaAdmView, self).get_context_data(
+ **kwargs)
+
+ tipo = self.request.GET['tipo']
+ data_inicial = datetime.strptime(
+ self.request.GET['data_inicial'], "%d/%m/%Y").date()
+ data_final = datetime.strptime(
+ self.request.GET['data_final'], "%d/%m/%Y").date()
+
+ documento_list = DocumentoAdministrativo.objects.filter(
+ tipo=tipo,
+ data__range=(data_inicial, data_final))
+ context['quantidade'] = len(documento_list)
+ documento_list = documento_list[:100]
+
+ context['form'].fields['documento'].choices = [
+ (d.id, str(d)) for d in documento_list]
+
+ username = self.request.user.username
+
+ if context['quantidade'] > 100:
+ self.logger.info('user=' + username + '. Sua pesquisa (tipo={}, data_inicial={}, data_final={}) retornou mais do que '
+ '100 impressos. Por questões de '
+ 'performance, foram retornados '
+ 'apenas os 100 primeiros. Caso '
+ 'queira outros, tente fazer uma '
+ 'pesquisa mais específica'.format(tipo, data_inicial, data_final))
+ messages.info(self.request, _('Sua pesquisa retornou mais do que '
+ '100 impressos. Por questões de '
+ 'performance, foram retornados '
+ 'apenas os 100 primeiros. Caso '
+ 'queira outros, tente fazer uma '
+ 'pesquisa mais específica'))
+
+ return context
+
+ def form_valid(self, form):
+ context = {}
+ username = self.request.user.username
+
+ try:
+ self.logger.debug(
+ "user=" + username + ". Tentando obter objeto DocumentoAdministrativo com id={}".format(form.data['documento']))
+ documento = DocumentoAdministrativo.objects.get(
+ id=form.data['documento'])
+ except ObjectDoesNotExist:
+ self.logger.error(
+ "user=" + username + ". Este DocumentoAdministrativo não existe (id={}).".format(form.data['documento']))
+ mensagem = _('Este Documento Administrativo não existe.')
+ self.messages.add_message(self.request, messages.INFO, mensagem)
+
+ return self.render_to_response(context)
+ if len(documento.assunto) > 301:
+ documento.assunto = documento.assunto[0:300] + '[...]'
+ context['documento'] = documento
+
+ return gerar_pdf_impressos(self.request, context,
+ 'materia/impressos/ficha_adm_pdf.html')
\ No newline at end of file
diff --git a/sapl/templates/materia/impressos/ficha_adm_pdf.html b/sapl/templates/materia/impressos/ficha_adm_pdf.html
new file mode 100644
index 000000000..b5de1e0a9
--- /dev/null
+++ b/sapl/templates/materia/impressos/ficha_adm_pdf.html
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PROCESSO Nº: {{ documento.numero }} / {{documento.ano}}
+
+
+
+
+ {{documento.tipo}}: {{documento.numero}} / {{documento.ano}}
+
+
+
+
+
+
+ Data de entrada: {{documento.data}}
+
+
+
+ {% if documento.protocolo%}
+
+
+
+ Protocolo: {{materia.protocolo}}
+
+
+ {% endif %}
+
+
+
+
+
+ Ementa: {{documento.assunto}}
+
+
+
+
+
+
+
+
+
diff --git a/sapl/templates/materia/impressos/impressos.html b/sapl/templates/materia/impressos/impressos.html
index 71f9f6f6f..5f6001027 100644
--- a/sapl/templates/materia/impressos/impressos.html
+++ b/sapl/templates/materia/impressos/impressos.html
@@ -26,7 +26,11 @@
-
+
+Capa Documento Administrativo
+
{#Guia de Remessa #}
{# #}
From b2786fbed541d8c9c2ff420097c93c9c5db7f5ad Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Fri, 14 Dec 2018 11:56:54 -0200
Subject: [PATCH 011/222] fix #2419 (#2425)
* fix #2419
* edita teste
---
.../migrations/0019_auto_20181214_1023.py | 20 +++++++++++++++++++
sapl/comissoes/models.py | 1 +
sapl/comissoes/tests/test_comissoes.py | 3 +--
3 files changed, 22 insertions(+), 2 deletions(-)
create mode 100644 sapl/comissoes/migrations/0019_auto_20181214_1023.py
diff --git a/sapl/comissoes/migrations/0019_auto_20181214_1023.py b/sapl/comissoes/migrations/0019_auto_20181214_1023.py
new file mode 100644
index 000000000..669ea20c6
--- /dev/null
+++ b/sapl/comissoes/migrations/0019_auto_20181214_1023.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-12-14 12:23
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('comissoes', '0018_auto_20180924_1724'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='reuniao',
+ name='hora_fim',
+ field=models.TimeField(blank=True, null=True, verbose_name='Horário de Término (hh:mm)'),
+ ),
+ ]
diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py
index f9ffa97fa..2792c80d6 100644
--- a/sapl/comissoes/models.py
+++ b/sapl/comissoes/models.py
@@ -221,6 +221,7 @@ class Reuniao(models.Model):
null=True,
verbose_name=_('Horário de Início (hh:mm)'))
hora_fim = models.TimeField(
+ blank=True,
null=True,
verbose_name=_('Horário de Término (hh:mm)'))
local_reuniao = models.CharField(
diff --git a/sapl/comissoes/tests/test_comissoes.py b/sapl/comissoes/tests/test_comissoes.py
index d2f8b0bd1..3b45bf337 100644
--- a/sapl/comissoes/tests/test_comissoes.py
+++ b/sapl/comissoes/tests/test_comissoes.py
@@ -139,7 +139,6 @@ def test_valida_campos_obrigatorios_reuniao_form():
assert errors['nome'] == [_('Este campo é obrigatório.')]
assert errors['data'] == [_('Este campo é obrigatório.')]
assert errors['hora_inicio'] == [_('Este campo é obrigatório.')]
- assert errors['hora_fim'] == [_('Este campo é obrigatório.')]
- assert len(errors) == 7
+ assert len(errors) == 6
From 6d1494647e0b09fcd2ece02359de2bbb48a401cf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rog=C3=A9rio=20Fr=C3=A1?=
Date: Fri, 14 Dec 2018 11:58:12 -0200
Subject: [PATCH 012/222] Retira titulo do extrato da sessao quando nao tem
conteudo (#2414)
---
.../sessao/blocos_ata/expedientes.html | 2 +
.../blocos_ata/identificacao_basica.html | 8 ++--
.../sessao/blocos_ata/lista_presenca.html | 4 ++
.../blocos_ata/lista_presenca_ordem_dia.html | 15 ++++----
.../blocos_ata/materias_expediente.html | 2 +
.../sessao/blocos_ata/materias_ordem_dia.html | 37 ++++++++++---------
.../sessao/blocos_ata/mesa_diretora.html | 2 +
.../blocos_ata/ocorrencias_da_sessao.html | 4 +-
.../blocos_ata/oradores_expediente.html | 2 +
.../blocos_ata/oradores_explicacoes.html | 10 +++--
10 files changed, 52 insertions(+), 34 deletions(-)
diff --git a/sapl/templates/sessao/blocos_ata/expedientes.html b/sapl/templates/sessao/blocos_ata/expedientes.html
index 6d199bab3..55df4e9d9 100644
--- a/sapl/templates/sessao/blocos_ata/expedientes.html
+++ b/sapl/templates/sessao/blocos_ata/expedientes.html
@@ -1,9 +1,11 @@
+ {% if expedientes %}
Expedientes:
{% for e in expedientes %}
{{e.tipo}} :
{{e.conteudo|striptags|safe}}
{% endfor %}
+ {% endif %}
diff --git a/sapl/templates/sessao/blocos_ata/identificacao_basica.html b/sapl/templates/sessao/blocos_ata/identificacao_basica.html
index da0a67b42..a6ec9c8c0 100644
--- a/sapl/templates/sessao/blocos_ata/identificacao_basica.html
+++ b/sapl/templates/sessao/blocos_ata/identificacao_basica.html
@@ -1,8 +1,8 @@
- Identificação Básica:
- {% for b in basica %}
- {{b}} ;
- {% endfor %}
+ Identificação Básica:
+ {% for b in basica %}
+ {{b}} ;
+ {% endfor %}
\ No newline at end of file
diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca.html b/sapl/templates/sessao/blocos_ata/lista_presenca.html
index 621a4783c..68e869cb5 100644
--- a/sapl/templates/sessao/blocos_ata/lista_presenca.html
+++ b/sapl/templates/sessao/blocos_ata/lista_presenca.html
@@ -2,15 +2,19 @@
+ {% if presenca_sessao %}
Lista de Presença na Sessão:
{% for p in presenca_sessao %}
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
{% endfor %}
+ {% endif %}
+ {% if justificativa_ausencia %}
Justificativas de Ausências na Sessão:
{% for j in justificativa_ausencia %}
{{j.parlamentar}} / {{ j.tipo_ausencia }} ;
{% endfor %}
+ {% endif %}
diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
index b118ebe6e..685ffd2bd 100644
--- a/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
+++ b/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
@@ -1,11 +1,12 @@
{% load common_tags %}
-
- Lista de Presença na Ordem do Dia:
- {% for p in presenca_ordem %}
- {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
- {% endfor %}
-
-
+
+ {% if presenca_ordem %}
+ Lista de Presença na Ordem do Dia:
+ {% for p in presenca_ordem %}
+ {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
+ {% endfor %}
+ {% endif %}
+
diff --git a/sapl/templates/sessao/blocos_ata/materias_expediente.html b/sapl/templates/sessao/blocos_ata/materias_expediente.html
index 395abf0cc..7613448fc 100644
--- a/sapl/templates/sessao/blocos_ata/materias_expediente.html
+++ b/sapl/templates/sessao/blocos_ata/materias_expediente.html
@@ -1,5 +1,6 @@
+ {% if materia_expediente %}
Matérias do Expediente:
{% for m in materia_expediente %}
{{m.numero}} - {{m.titulo}}
@@ -21,5 +22,6 @@
{{m.ementa|safe}}
{{m.resultado}} {{m.resultado_observacao}}
{% endfor %}
+ {% endif %}
\ 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 6b09fa37a..c5ffd15df 100644
--- a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html
+++ b/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html
@@ -1,23 +1,24 @@
-
-
- Matérias da Ordem do Dia:
- {% for m in materias_ordem %}
- {{m.numero}} - {{m.titulo}}
- {% if m.turno %}
- Turno:{{m.turno}}
- {% endif %}
- Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }}
- {% if m.numero_protocolo %}
- Número de Protocolo: {{ m.numero_protocolo }}
- {% endif %}
- {% if m.numero_processo %}
- Processo: {{ m.numero_processo }}
- {% endif %}
- {{m.ementa|safe}}
- {{m.resultado}} {{m.resultado_observacao}}
- {% endfor %}
+
+ {% if materias_ordem %}
+ Matérias da Ordem do Dia:
+ {% for m in materias_ordem %}
+ {{m.numero}} - {{m.titulo}}
+ {% if m.turno %}
+ Turno:{{m.turno}}
+ {% endif %}
+ Autor{{ m.autor|length|pluralize:"es" }}: {{ m.autor|join:', ' }}
+ {% if m.numero_protocolo %}
+ Número de Protocolo: {{ m.numero_protocolo }}
+ {% endif %}
+ {% if m.numero_processo %}
+ Processo: {{ m.numero_processo }}
+ {% endif %}
+ {{m.ementa|safe}}
+ {{m.resultado}} {{m.resultado_observacao}}
+ {% endfor %}
+ {% endif %}
\ No newline at end of file
diff --git a/sapl/templates/sessao/blocos_ata/mesa_diretora.html b/sapl/templates/sessao/blocos_ata/mesa_diretora.html
index 3d58adc62..f09e9b8e0 100644
--- a/sapl/templates/sessao/blocos_ata/mesa_diretora.html
+++ b/sapl/templates/sessao/blocos_ata/mesa_diretora.html
@@ -1,10 +1,12 @@
+ {% if mesa %}
Mesa Diretora:
{% for m in mesa %}
{{m.cargo}}:
{{m.parlamentar.nome_parlamentar}} / {{ m.parlamentar.filiacao_atual }} ;
{% endfor %}
+ {% endif %}
\ No newline at end of file
diff --git a/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html b/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html
index 9b65733f9..0896cd9b0 100644
--- a/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html
+++ b/sapl/templates/sessao/blocos_ata/ocorrencias_da_sessao.html
@@ -1,6 +1,8 @@
+ {% if object.ocorrenciasessao.conteudo %}
Ocorrências da Sessão:
{{object.ocorrenciasessao.conteudo|striptags|safe}}
-
+ {% endif %}
+
diff --git a/sapl/templates/sessao/blocos_ata/oradores_expediente.html b/sapl/templates/sessao/blocos_ata/oradores_expediente.html
index b8e972eaa..8bc420b3c 100644
--- a/sapl/templates/sessao/blocos_ata/oradores_expediente.html
+++ b/sapl/templates/sessao/blocos_ata/oradores_expediente.html
@@ -1,5 +1,6 @@
+ {% if oradores %}
Oradores do Expediente:
{% for o in oradores %}
{{o.numero_ordem}} - {{o.parlamentar}}
@@ -7,6 +8,7 @@
{{o.observacao}}
{% endfor %}
+ {% endif %}
diff --git a/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html b/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html
index 795a209a2..18ced7b07 100644
--- a/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html
+++ b/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html
@@ -1,9 +1,11 @@
+ {% if oradores_explicacoes %}
Oradores das Explicações Pessoais:
- {% for o in oradores_explicacoes %}
- {{o.numero_ordem}} - {{o.parlamentar.nome_parlamentar}} / {{ o.parlamentar.filiacao_atual }} ;
- {{o.url_discurso}}
- {% endfor %}
+ {% for o in oradores_explicacoes %}
+ {{o.numero_ordem}} - {{o.parlamentar.nome_parlamentar}} / {{ o.parlamentar.filiacao_atual }} ;
+ {{o.url_discurso}}
+ {% endfor %}
+ {% endif %}
\ No newline at end of file
From 62de214057a0d74bde09a3d8ddf932de48810990 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Fri, 14 Dec 2018 13:32:57 -0200
Subject: [PATCH 013/222] fix #2421 (#2426)
---
sapl/materia/forms.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index c3ce1f36f..39dd4c24d 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -127,6 +127,9 @@ class MateriaSimplificadaForm(ModelForm):
'numero_protocolo', 'regime_tramitacao',
'em_tramitacao', 'ementa', 'tipo_apresentacao',
'texto_original']
+ widgets = {
+ 'numero_protocolo': forms.TextInput(attrs={'readonly': True}),
+ }
def __init__(self, *args, **kwargs):
From 039ae58396537ad3ea59e4192456677a4d3ce7da Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Fri, 14 Dec 2018 15:22:00 -0200
Subject: [PATCH 014/222] Release: 3.1.138
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index ac3425c9f..3691de798 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.137
+ image: interlegis/sapl:3.1.138
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index d2f4cca33..0291ef7ba 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.137
+ Release: 3.1.138
diff --git a/setup.py b/setup.py
index daf572e62..fd2490fbf 100644
--- a/setup.py
+++ b/setup.py
@@ -52,7 +52,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.137',
+ version='3.1.138',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 60a96d6d90f812492847f52796c5a827c35986cc Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Mon, 17 Dec 2018 12:43:43 -0200
Subject: [PATCH 015/222] fix #2418 (#2427)
---
sapl/sessao/forms.py | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index 386f123ca..d2e00f47c 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -24,7 +24,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
MateriaPesquisaOrderingFilter, autor_label,
autor_modal, timezone)
from .models import (Bancada, Bloco, ExpedienteMateria, Orador, JustificativaAusencia,
- OradorExpediente, OrdemDia, SessaoPlenaria,
+ OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao,
RetiradaPauta, TipoRetiradaPauta)
@@ -841,7 +841,8 @@ class JustificativaAusenciaForm(ModelForm):
ordens = OrdemDia.objects.filter(q)
expedientes = ExpedienteMateria.objects.filter(q)
legislatura = kwargs['initial']['sessao_plenaria'].legislatura
- mandato = Mandato.objects.filter(legislatura=legislatura)
+ mandato = Mandato.objects.filter(
+ legislatura=legislatura).order_by('parlamentar__nome_parlamentar')
parlamentares = [m.parlamentar for m in mandato]
@@ -850,9 +851,14 @@ class JustificativaAusenciaForm(ModelForm):
presencas = SessaoPlenariaPresenca.objects.filter(
q).order_by('parlamentar__nome_parlamentar')
+ presencas_ordem = PresencaOrdemDia.objects.filter(
+ q).order_by('parlamentar__nome_parlamentar')
presentes = [p.parlamentar for p in presencas]
- setFinal = set(parlamentares) - set(presentes)
+ presentes_ordem = [p.parlamentar for p in presencas_ordem]
+
+ presentes_ambos = set(presentes).intersection(set(presentes_ordem))
+ setFinal = set(parlamentares) - presentes_ambos
self.fields['materias_do_expediente'].choices = [
(e.id, e.materia) for e in expedientes]
From 4d6d7401746c7d4753a14310fa059b87f5252df9 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Mon, 17 Dec 2018 15:17:34 -0200
Subject: [PATCH 016/222] fix #925 (#2428)
---
sapl/templates/protocoloadm/protocolo_filter.html | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html
index 02c0673fa..316003075 100644
--- a/sapl/templates/protocoloadm/protocolo_filter.html
+++ b/sapl/templates/protocoloadm/protocolo_filter.html
@@ -62,6 +62,13 @@
Anulado por: {{ p.user_anulacao }} - IP {{ p.ip_anulacao }}
Motivo Anulação: {{ p.justificativa_anulacao }}
{% endif %}
+ {% if p.tipo_documento and p.documentoadministrativo_set.first %}
+ Documentos vinculados:
+
+ {{ p.documentoadministrativo_set.first.tipo }} - {{ p.documentoadministrativo_set.first.numero }} /
+ {{ p.documentoadministrativo_set.first.ano }}
+
+ {% endif %}
{% endfor %}
From 62e82aefd204ab3d36b59ea665f474ae67888686 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Wed, 19 Dec 2018 12:19:28 -0200
Subject: [PATCH 017/222] =?UTF-8?q?Fix=20#2313=20-=20Gera=C3=A7=C3=A3o=20d?=
=?UTF-8?q?e=20relat=C3=B3rios=20e=20estatisticas=20(#2429)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Colocando opcao de geracao de relatorios em configuracao do sistema
* fix 2313
* HOT-FIX: adiciona logging de erros não tratados
* HOT-FIX: diminui o nível do logging
* inicio do relatorio por mes das normas
* normas por mes concluida e inicio normas vigencia
* relatorio por vigencia em andamento
* adicionadas normas por vigencia
* estatisticas das normas por vigencia por ano
* tela de estatisticas
* adiciona model NormaEstatisticas no map_rules
* correcoes e adicao de opcao no configuracao de aplicacao
* correcao do teste em norma
* retira config relatorio atos que não era utilizado
* migration
---
sapl/base/forms.py | 81 ++++++++-
.../0027_appconfig_relatorios_atos.py | 20 +++
...28_appconfig_estatisticas_acesso_normas.py | 20 +++
.../0029_remove_appconfig_relatorios_atos.py | 19 +++
sapl/base/models.py | 8 +
sapl/base/urls.py | 16 +-
sapl/base/views.py | 159 +++++++++++++++++-
.../migrations/0017_normaestatisticas.py | 25 +++
sapl/norma/models.py | 12 ++
sapl/norma/tests/test_norma.py | 2 +
sapl/norma/views.py | 18 +-
sapl/rules/map_rules.py | 2 +
.../base/EstatisticasAcessoNormas_filter.html | 64 +++++++
.../RelatorioHistoricoTramitacao_filter.html | 2 +-
.../RelatorioMateriasPorAutor_filter.html | 2 +-
.../base/RelatorioNormaMes_filter.html | 67 ++++++++
.../base/RelatorioNormasVigencia_filter.html | 57 +++++++
sapl/templates/base/layouts.yaml | 3 +
sapl/templates/base/relatorios_list.html | 14 ++
19 files changed, 578 insertions(+), 13 deletions(-)
create mode 100644 sapl/base/migrations/0027_appconfig_relatorios_atos.py
create mode 100644 sapl/base/migrations/0028_appconfig_estatisticas_acesso_normas.py
create mode 100644 sapl/base/migrations/0029_remove_appconfig_relatorios_atos.py
create mode 100644 sapl/norma/migrations/0017_normaestatisticas.py
create mode 100644 sapl/templates/base/EstatisticasAcessoNormas_filter.html
create mode 100644 sapl/templates/base/RelatorioNormaMes_filter.html
create mode 100644 sapl/templates/base/RelatorioNormasVigencia_filter.html
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index ccd2c132b..ec69c50d9 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -23,6 +23,7 @@ from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
from sapl.audiencia.models import AudienciaPublica,TipoAudienciaPublica
from sapl.comissoes.models import Reuniao, Comissao
from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
+from sapl.norma.models import (NormaJuridica)
from sapl.parlamentares.models import SessaoLegislativa
from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
@@ -688,6 +689,83 @@ class RelatorioAtasFilterSet(django_filters.FilterSet):
)
+class RelatorioNormasMesFilterSet(django_filters.FilterSet):
+
+ ano = django_filters.ChoiceFilter(required=True,
+ label='Ano da Norma',
+ choices=RANGE_ANOS)
+
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Ano')),
+ 'widget': RangeWidgetOverride}
+ }}
+
+
+ class Meta:
+ model = NormaJuridica
+ fields = ['ano']
+
+ def __init__(self, *args, **kwargs):
+ super(RelatorioNormasMesFilterSet, self).__init__(
+ *args, **kwargs)
+
+ self.filters['ano'].label = 'Ano'
+ self.form.fields['ano'].required = True
+
+ row1 = to_row([('ano', 12)])
+
+ self.form.helper = FormHelper()
+ self.form.helper.form_method = 'GET'
+ self.form.helper.layout = Layout(
+ Fieldset(_('Normas por mês do ano.'),
+ row1, form_actions(label='Pesquisar'))
+ )
+
+ @property
+ def qs(self):
+ parent = super(RelatorioNormasMesFilterSet, self).qs
+ return parent.distinct().order_by('data')
+
+
+class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet):
+
+ ano = django_filters.ChoiceFilter(required=True,
+ label='Ano da Norma',
+ choices=RANGE_ANOS)
+
+ vigencia = forms.ChoiceField(
+ label=_('Vigência'),
+ choices=[(True, "Vigente"), (False, "Não vigente")],
+ widget=forms.RadioSelect(),
+ required=True)
+
+
+ def __init__(self, *args, **kwargs):
+ super(RelatorioNormasVigenciaFilterSet, self).__init__(
+ *args, **kwargs)
+
+ self.filters['ano'].label = 'Ano'
+ self.form.fields['ano'].required = True
+ self.form.fields['vigencia'] = self.vigencia
+
+ row1 = to_row([('ano', 12)])
+ row2 = to_row([('vigencia', 12)])
+
+ self.form.helper = FormHelper()
+ self.form.helper.form_method = 'GET'
+ self.form.helper.layout = Layout(
+ Fieldset(_('Normas por vigência.'),
+ row1, row2,
+ form_actions(label='Pesquisar'))
+ )
+
+ @property
+ def qs(self):
+ return qs_override_django_filter(self)
+
+
class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet):
filter_overrides = {models.DateField: {
@@ -1061,7 +1139,8 @@ class ConfiguracoesAppForm(ModelForm):
'cronometro_consideracoes',
'mostrar_brasao_painel',
'receber_recibo_proposicao',
- 'assinatura_ata']
+ 'assinatura_ata',
+ 'estatisticas_acesso_normas']
def __init__(self, *args, **kwargs):
super(ConfiguracoesAppForm, self).__init__(*args, **kwargs)
diff --git a/sapl/base/migrations/0027_appconfig_relatorios_atos.py b/sapl/base/migrations/0027_appconfig_relatorios_atos.py
new file mode 100644
index 000000000..afd3382e1
--- /dev/null
+++ b/sapl/base/migrations/0027_appconfig_relatorios_atos.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-12-11 20:25
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('base', '0026_auto_20181126_1727'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='appconfig',
+ name='relatorios_atos',
+ field=models.CharField(choices=[('S', 'Sim'), ('N', 'Não')], default='N', max_length=1, verbose_name='Relatórios de atos acessados'),
+ ),
+ ]
diff --git a/sapl/base/migrations/0028_appconfig_estatisticas_acesso_normas.py b/sapl/base/migrations/0028_appconfig_estatisticas_acesso_normas.py
new file mode 100644
index 000000000..7a4af06de
--- /dev/null
+++ b/sapl/base/migrations/0028_appconfig_estatisticas_acesso_normas.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-12-18 17:03
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('base', '0027_appconfig_relatorios_atos'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='appconfig',
+ name='estatisticas_acesso_normas',
+ field=models.CharField(choices=[('S', 'Sim'), ('N', 'Não')], default='N', max_length=1, verbose_name='Estatísticas de acesso a normas'),
+ ),
+ ]
diff --git a/sapl/base/migrations/0029_remove_appconfig_relatorios_atos.py b/sapl/base/migrations/0029_remove_appconfig_relatorios_atos.py
new file mode 100644
index 000000000..fa06b23ac
--- /dev/null
+++ b/sapl/base/migrations/0029_remove_appconfig_relatorios_atos.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-12-18 18:40
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('base', '0028_appconfig_estatisticas_acesso_normas'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='appconfig',
+ name='relatorios_atos',
+ ),
+ ]
diff --git a/sapl/base/models.py b/sapl/base/models.py
index 5caf8b2c0..343a8db9b 100644
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -12,6 +12,9 @@ from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES,
TIPO_DOCUMENTO_ADMINISTRATIVO = (('O', _('Ostensiva')),
('R', _('Restritiva')))
+RELATORIO_ATOS_ACESSADOS = (('S', _('Sim')),
+ ('N', _('Não')))
+
SEQUENCIA_NUMERACAO = (('A', _('Sequencial por ano')),
('L', _('Sequencial por legislatura')),
('U', _('Sequencial único')))
@@ -84,6 +87,11 @@ class AppConfig(models.Model):
verbose_name=_('Visibilidade dos Documentos Administrativos'),
choices=TIPO_DOCUMENTO_ADMINISTRATIVO, default='O')
+ estatisticas_acesso_normas = models.CharField(
+ max_length=1,
+ verbose_name=_('Estatísticas de acesso a normas'),
+ choices=RELATORIO_ATOS_ACESSADOS, default='N')
+
sequencia_numeracao = models.CharField(
max_length=1,
verbose_name=_('Sequência de numeração'),
diff --git a/sapl/base/urls.py b/sapl/base/urls.py
index 93a5b1cd3..ae4add258 100644
--- a/sapl/base/urls.py
+++ b/sapl/base/urls.py
@@ -23,7 +23,11 @@ from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud,
RelatorioMateriasPorAutorView,
RelatorioMateriasTramitacaoView,
RelatorioPresencaSessaoView,
- RelatorioReuniaoView, SaplSearchView)
+ RelatorioReuniaoView, SaplSearchView,
+ RelatorioNormasPublicadasMesView,
+ RelatorioNormasVigenciaView,
+ EstatisticasAcessoNormas,
+ RelatoriosListView)
app_name = AppConfig.name
@@ -84,10 +88,16 @@ urlpatterns = [
url(r'^sistema/app-config/', include(AppConfigCrud.get_urls())),
# TODO mover estas telas para a app 'relatorios'
- url(r'^sistema/relatorios/$', TemplateView.as_view(
- template_name='base/relatorios_list.html'), name='relatorios_list'),
+ url(r'^sistema/relatorios/$',
+ RelatoriosListView.as_view(), name='relatorios_list'),
url(r'^sistema/relatorios/materia-por-autor$',
RelatorioMateriasPorAutorView.as_view(), name='materia_por_autor'),
+ url(r'^sistema/relatorios/relatorio-por-mes$',
+ RelatorioNormasPublicadasMesView.as_view(), name='normas_por_mes'),
+ url(r'^sistema/relatorios/relatorio-por-vigencia$',
+ RelatorioNormasVigenciaView.as_view(), name='normas_por_vigencia'),
+ url(r'^sistema/relatorios/estatisticas-acesso$',
+ EstatisticasAcessoNormas.as_view(), name='estatisticas_acesso'),
url(r'^sistema/relatorios/materia-por-ano-autor-tipo$',
RelatorioMateriasPorAnoAutorTipoView.as_view(),
name='materia_por_ano_autor_tipo'),
diff --git a/sapl/base/views.py b/sapl/base/views.py
index ca122ce9f..599d6b05f 100644
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -1,3 +1,5 @@
+import collections
+import datetime
import logging
import os
@@ -30,6 +32,7 @@ from sapl.comissoes.models import Reuniao, Comissao
from sapl.crud.base import CrudAux, make_pagination
from sapl.materia.models import (Autoria, MateriaLegislativa,
TipoMateriaLegislativa, StatusTramitacao, UnidadeTramitacao)
+from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.sessao.models import (PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca)
from sapl.utils import (parlamentares_ativos,
@@ -45,7 +48,8 @@ from .forms import (AlterarSenhaForm, CasaLegislativaForm,
RelatorioMateriasTramitacaoilterSet,
RelatorioPresencaSessaoFilterSet,
RelatorioReuniaoFilterSet, UsuarioCreateForm,
- UsuarioEditForm)
+ UsuarioEditForm, RelatorioNormasMesFilterSet,
+ RelatorioNormasVigenciaFilterSet)
from .models import AppConfig, CasaLegislativa
@@ -276,6 +280,20 @@ class AutorCrud(CrudAux):
return url_reverse
+class RelatoriosListView(TemplateView):
+ template_name='base/relatorios_list.html'
+
+ def get_context_data(self, **kwargs):
+ context = super(TemplateView, self).get_context_data(**kwargs)
+ estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas
+ if estatisticas_acesso_normas == 'S':
+ context['estatisticas_acesso_normas'] = True
+ else:
+ context['estatisticas_acesso_normas'] = False
+
+ return context
+
+
class RelatorioAtasView(FilterView):
model = SessaoPlenaria
filterset_class = RelatorioAtasFilterSet
@@ -744,6 +762,145 @@ class RelatorioMateriasPorAutorView(FilterView):
return context
+class RelatorioNormasPublicadasMesView(FilterView):
+ model = NormaJuridica
+ filterset_class = RelatorioNormasMesFilterSet
+ template_name = 'base/RelatorioNormaMes_filter.html'
+
+ def get_context_data(self, **kwargs):
+ context = super(RelatorioNormasPublicadasMesView,
+ self).get_context_data(**kwargs)
+ context['title'] = _('Normas')
+
+ # Verifica se os campos foram preenchidos
+ if not self.filterset.form.is_valid():
+ return context
+
+ qr = self.request.GET.copy()
+ context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
+
+ context['show_results'] = show_results_filter_set(qr)
+ context['ano'] = self.request.GET['ano']
+
+ normas_mes = collections.OrderedDict()
+ meses = {1: 'Janeiro', 2: 'Fevereiro', 3:'Março', 4: 'Abril', 5: 'Maio', 6:'Junho',
+ 7: 'Julho', 8: 'Agosto', 9:'Setembro', 10:'Outubro', 11:'Novembro', 12:'Dezembro'}
+ for norma in context['object_list']:
+ if not meses[norma.data.month] in normas_mes:
+ normas_mes[meses[norma.data.month]] = []
+ normas_mes[meses[norma.data.month]].append(norma)
+
+ context['normas_mes'] = normas_mes
+
+ quant_normas_mes = {}
+ for key in normas_mes.keys():
+ quant_normas_mes[key] = len(normas_mes[key])
+
+ context['quant_normas_mes'] = quant_normas_mes
+
+ return context
+
+
+class RelatorioNormasVigenciaView(FilterView):
+ model = NormaJuridica
+ filterset_class = RelatorioNormasVigenciaFilterSet
+ template_name = 'base/RelatorioNormasVigencia_filter.html'
+
+ def get_filterset_kwargs(self, filterset_class):
+ super(RelatorioNormasVigenciaView,
+ self).get_filterset_kwargs(filterset_class)
+
+ kwargs = {'data': self.request.GET or None}
+ qs = self.get_queryset().order_by('data').distinct()
+ if kwargs['data']:
+ ano = kwargs['data']['ano']
+ vigencia = kwargs['data']['vigencia']
+ qs = qs.filter(ano=ano)
+ if vigencia == 'True':
+ qs_dt_not_null = qs.filter(data_vigencia__isnull=True)
+ qs = (qs_dt_not_null | qs.filter(data_vigencia__gte=datetime.datetime.now().date())).distinct()
+ else:
+ qs = qs.filter(data_vigencia__lt=datetime.datetime.now().date())
+
+ kwargs.update({
+ 'queryset': qs
+ })
+ return kwargs
+
+
+ def get_context_data(self, **kwargs):
+ context = super(RelatorioNormasVigenciaView,
+ self).get_context_data(**kwargs)
+ context['title'] = _('Normas por vigência')
+
+ # Verifica se os campos foram preenchidos
+ if not self.filterset.form.is_valid():
+ return context
+
+ normas_totais = NormaJuridica.objects.filter(ano=self.request.GET['ano'])
+
+ context['quant_total'] = len(normas_totais)
+ if self.request.GET['vigencia'] == 'True':
+ context['vigencia'] = 'Vigente'
+ context['quant_vigente'] = len(context['object_list'])
+ context['quant_nao_vigente'] = context['quant_total'] - context['quant_vigente']
+ else:
+ context['vigencia'] = 'Não vigente'
+ context['quant_nao_vigente'] = len(context['object_list'])
+ context['quant_vigente'] = context['quant_total'] - context['quant_nao_vigente']
+
+ qr = self.request.GET.copy()
+ context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
+
+ context['show_results'] = show_results_filter_set(qr)
+ context['ano'] = self.request.GET['ano']
+
+ return context
+
+
+class EstatisticasAcessoNormas(FilterView):
+ model = NormaJuridica
+ filterset_class = RelatorioNormasMesFilterSet
+ template_name = 'base/EstatisticasAcessoNormas_filter.html'
+
+ def get_context_data(self, **kwargs):
+ context = super(EstatisticasAcessoNormas,
+ self).get_context_data(**kwargs)
+ context['title'] = _('Normas')
+
+ # Verifica se os campos foram preenchidos
+ if not self.filterset.form.is_valid():
+ return context
+
+ qr = self.request.GET.copy()
+ context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
+
+ context['show_results'] = show_results_filter_set(qr)
+ context['ano'] = self.request.GET['ano']
+
+ normas_mes = collections.OrderedDict()
+ meses = {1: 'Janeiro', 2: 'Fevereiro', 3:'Março', 4: 'Abril', 5: 'Maio', 6:'Junho',
+ 7: 'Julho', 8: 'Agosto', 9:'Setembro', 10:'Outubro', 11:'Novembro', 12:'Dezembro'}
+ for norma in context['object_list']:
+ if not meses[norma.data.month] in normas_mes:
+ normas_mes[meses[norma.data.month]] = []
+ norma_est = [norma, len(NormaEstatisticas.objects.filter(norma=norma))]
+ normas_mes[meses[norma.data.month]].append(norma_est)
+
+ meses_sem_acesso = []
+ # Ordena por acesso e limita em 5
+ for n in normas_mes:
+ sorted_by_value = sorted(normas_mes[n], key=lambda kv: kv[1], reverse=True)
+ normas_mes[n] = sorted_by_value[0:5]
+ if all(v[1]==0 for v in normas_mes[n]):
+ meses_sem_acesso.append(n)
+
+ context['normas_mes'] = normas_mes
+ context['meses_sem_acesso'] = meses_sem_acesso
+
+ return context
+
+
class ListarUsuarioView(PermissionRequiredMixin, ListView):
model = get_user_model()
template_name = 'auth/user_list.html'
diff --git a/sapl/norma/migrations/0017_normaestatisticas.py b/sapl/norma/migrations/0017_normaestatisticas.py
new file mode 100644
index 000000000..03009eeec
--- /dev/null
+++ b/sapl/norma/migrations/0017_normaestatisticas.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2018-12-17 18:44
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('norma', '0016_tipovinculonormajuridica_revoga_integramente'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='NormaEstatisticas',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('usuario', models.CharField(max_length=50)),
+ ('horario_acesso', models.DateTimeField(auto_now=True, null=True)),
+ ('norma', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='norma.NormaJuridica')),
+ ],
+ ),
+ ]
diff --git a/sapl/norma/models.py b/sapl/norma/models.py
index 6565304ee..80075f113 100644
--- a/sapl/norma/models.py
+++ b/sapl/norma/models.py
@@ -191,6 +191,18 @@ class NormaJuridica(models.Model):
update_fields=update_fields)
+class NormaEstatisticas(models.Model):
+ usuario = models.CharField(max_length=50)
+ horario_acesso = models.DateTimeField(
+ blank=True, null=True,
+ auto_now=True)
+ norma = models.ForeignKey(NormaJuridica,
+ on_delete=models.CASCADE)
+ def __str__(self):
+ return _('Usuário: %(usuario)s, Norma: %(norma)s') % {
+ 'usuario': self.usuario, 'norma': self.norma}
+
+
@reversion.register()
class AutoriaNorma(models.Model):
autor = models.ForeignKey(Autor,
diff --git a/sapl/norma/tests/test_norma.py b/sapl/norma/tests/test_norma.py
index 6603d7167..5c2a76a6a 100644
--- a/sapl/norma/tests/test_norma.py
+++ b/sapl/norma/tests/test_norma.py
@@ -7,6 +7,7 @@ from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.norma.forms import (NormaJuridicaForm, NormaPesquisaSimplesForm,
NormaRelacionadaForm)
from sapl.norma.models import NormaJuridica, TipoNormaJuridica
+from sapl.base.models import AppConfig
@pytest.mark.django_db(transaction=False)
@@ -15,6 +16,7 @@ def test_incluir_norma_submit(admin_client):
tipo = mommy.make(TipoNormaJuridica,
sigla='T',
descricao='Teste')
+ config = mommy.make(AppConfig)
# Testa POST
response = admin_client.post(reverse('sapl.norma:normajuridica_create'),
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
index f2dfb6f2e..f7800c42f 100644
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -1,6 +1,8 @@
-import re
import logging
+import re
+import sapl
+import weasyprint
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import ObjectDoesNotExist
@@ -13,8 +15,6 @@ from django.views.generic import TemplateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
-import weasyprint
-import sapl
from sapl.base.models import AppConfig
from sapl.compilacao.views import IntegracaoTaView
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
@@ -24,7 +24,7 @@ from sapl.utils import show_results_filter_set
from .forms import (AnexoNormaJuridicaForm, NormaFilterSet, NormaJuridicaForm,
NormaPesquisaSimplesForm, NormaRelacionadaForm, AutoriaNormaForm)
from .models import (AnexoNormaJuridica, AssuntoNorma, NormaJuridica, NormaRelacionada,
- TipoNormaJuridica, TipoVinculoNormaJuridica, AutoriaNorma)
+ TipoNormaJuridica, TipoVinculoNormaJuridica, AutoriaNorma, NormaEstatisticas)
# LegislacaoCitadaCrud = Crud.build(LegislacaoCitada, '')
@@ -190,7 +190,13 @@ class NormaCrud(Crud):
return reverse('%s:%s' % (namespace, 'norma_pesquisa'))
class DetailView(Crud.DetailView):
- pass
+ def get(self, request, *args, **kwargs):
+ estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas
+ if estatisticas_acesso_normas == 'S':
+ NormaEstatisticas.objects.create(usuario=str(self.request.user),
+ norma_id=kwargs['pk'])
+ return super().get(request, *args, **kwargs)
+
class DeleteView(Crud.DeleteView):
@@ -225,7 +231,7 @@ class NormaCrud(Crud):
class ListView(Crud.ListView, RedirectView):
def get_redirect_url(self, *args, **kwargs):
- namespace = self.model._meta.app_config.name
+ namespace = self.model._meta.app_config.name
return reverse('%s:%s' % (namespace, 'norma_pesquisa'))
def get(self, request, *args, **kwargs):
diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py
index aa691da5e..f9b63fd4b 100644
--- a/sapl/rules/map_rules.py
+++ b/sapl/rules/map_rules.py
@@ -139,6 +139,7 @@ rules_group_norma = {
(norma.NormaRelacionada, __base__),
(norma.AnexoNormaJuridica, __base__),
(norma.AutoriaNorma, __base__),
+ (norma.NormaEstatisticas, __base__),
# Publicacao está com permissão apenas para norma e não para matéria
# e proposições apenas por análise do contexto, não é uma limitação
@@ -242,6 +243,7 @@ rules_group_geral = {
(norma.AssuntoNorma, __base__),
(norma.TipoNormaJuridica, __base__),
(norma.TipoVinculoNormaJuridica, __base__),
+ (norma.NormaEstatisticas, __base__),
(parlamentares.Legislatura, __base__),
(parlamentares.SessaoLegislativa, __base__),
diff --git a/sapl/templates/base/EstatisticasAcessoNormas_filter.html b/sapl/templates/base/EstatisticasAcessoNormas_filter.html
new file mode 100644
index 000000000..a8246e22d
--- /dev/null
+++ b/sapl/templates/base/EstatisticasAcessoNormas_filter.html
@@ -0,0 +1,64 @@
+{% extends "crud/list.html" %}
+{% load i18n %}
+{% load crispy_forms_tags %}
+
+{% block base_content %}
+ {% if not show_results %}
+ {% crispy filter.form %}
+ {% endif %}
+ {% if show_results %}
+
+
+ PARÂMETROS DE PESQUISA:
+ Ano: {{ ano }}
+
+ {% if normas_mes|length == 0 %}
+
+ {% trans 'Não foi encontrada nenhuma norma com os parâmetros buscados.'%}
+ {% elif normas_mes|length == meses_sem_acesso|length %}
+
+ {% trans 'Nenhuma norma teve acesso neste ano.'%}
+ {% else %}
+ {% for mes, normas in normas_mes.items %}
+
+
+
+
+ Mês: {{ mes }}
+
+
+
+ {% if not mes in meses_sem_acesso %}
+
+ {% else %}
+
{% trans 'Nenhuma norma deste mês teve acessos.'%}
+
+ {% endif %}
+
+ {% endfor %}
+ {% endif %}
+ {% endif %}
+{% endblock base_content %}
diff --git a/sapl/templates/base/RelatorioHistoricoTramitacao_filter.html b/sapl/templates/base/RelatorioHistoricoTramitacao_filter.html
index cca46d3ad..1151cd094 100644
--- a/sapl/templates/base/RelatorioHistoricoTramitacao_filter.html
+++ b/sapl/templates/base/RelatorioHistoricoTramitacao_filter.html
@@ -30,7 +30,7 @@
{{materia.tipo.descricao}} - {{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}}
- {{materia.ementa}}
+ {{materia.ementa}} {{materia.observacao}}
{% endfor %}
diff --git a/sapl/templates/base/RelatorioMateriasPorAutor_filter.html b/sapl/templates/base/RelatorioMateriasPorAutor_filter.html
index 6a8ed41a8..35e9aa50c 100644
--- a/sapl/templates/base/RelatorioMateriasPorAutor_filter.html
+++ b/sapl/templates/base/RelatorioMateriasPorAutor_filter.html
@@ -51,7 +51,7 @@
{{materia.tipo.sigla}} {{materia.numero}}/{{materia.ano}}
- {% autoescape off %}{{materia.ementa}}{% endautoescape %}
+ {% autoescape off %}{{materia.ementa}} {{materia.observacao}}{% endautoescape %}
{% if materia.autoria_set.first != materia.autoria_set.last %}
{% for autor in materia.autoria_set.all %}
diff --git a/sapl/templates/base/RelatorioNormaMes_filter.html b/sapl/templates/base/RelatorioNormaMes_filter.html
new file mode 100644
index 000000000..d4f8d5b30
--- /dev/null
+++ b/sapl/templates/base/RelatorioNormaMes_filter.html
@@ -0,0 +1,67 @@
+{% extends "crud/list.html" %}
+{% load i18n %}
+{% load crispy_forms_tags %}
+
+{% block base_content %}
+ {% if not show_results %}
+ {% crispy filter.form %}
+ {% endif %}
+
+ {% if show_results %}
+
+
+ PARÂMETROS DE PESQUISA:
+ Ano: {{ ano }}
+
+ {% if normas_mes|length == 0 %}
+
+ {% trans 'Não foi encontrada nenhuma norma com os parâmetros buscados.'%}
+ {% endif %}
+ {% for mes, normas in normas_mes.items %}
+
+
+
+
+ Mês: {{ mes }}
+
+
+
+
+
+
+ {% for k, v in quant_normas_mes.items %}
+ {% if k == mes %}
+ {% if v > 1 %}
+ Quantidade encontrada no mês: {{ v }} normas.
+ {% else %}
+ Quantidade encontrada no mês: 1 norma.
+ {% endif %}
+ {% endif %}
+ {% endfor %}
+
+
+
+
+
+ {% endfor %}
+ {% endif %}
+{% endblock base_content %}
diff --git a/sapl/templates/base/RelatorioNormasVigencia_filter.html b/sapl/templates/base/RelatorioNormasVigencia_filter.html
new file mode 100644
index 000000000..6412b5b20
--- /dev/null
+++ b/sapl/templates/base/RelatorioNormasVigencia_filter.html
@@ -0,0 +1,57 @@
+{% extends "crud/list.html" %}
+{% load i18n %}
+{% load crispy_forms_tags %}
+
+{% block base_content %}
+ {% if not show_results %}
+ {% crispy filter.form %}
+ {% endif %}
+
+ {% if show_results %}
+
+
+ PARÂMETROS DE PESQUISA:
+ Ano: {{ ano }}
+ Vigência: {{ vigencia }}
+ {% if object_list %}
+
+ {% if object_list|length > 1 %}
+ Foram encontradas {{object_list|length}} normas.
+ {% else %}
+ Foi encontrada 1 norma.
+ {% endif %}
+
+
+ {% else %}
+
+
+
+ Não foi encontrada nenhuma norma com os parâmetros buscados.
+
+
+
+ {% endif %}
+
+ Estatísticas das normas do ano:
+ {{quant_vigente}} vigente(s) / {{quant_nao_vigente}} não vigente(s)
+ {% endif %}
+{% endblock base_content %}
diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml
index ef1e53d2a..4f6bbd45d 100644
--- a/sapl/templates/base/layouts.yaml
+++ b/sapl/templates/base/layouts.yaml
@@ -23,6 +23,9 @@ AppConfig:
{% trans 'Textos Articulados' %}:
- texto_articulado_proposicao texto_articulado_materia texto_articulado_norma
+ {% trans 'Estatísticas de acesso' %}:
+ - estatisticas_acesso_normas
+
{% trans 'Assinaturas' %}:
- assinatura_ata
diff --git a/sapl/templates/base/relatorios_list.html b/sapl/templates/base/relatorios_list.html
index 78192855a..87f8933be 100644
--- a/sapl/templates/base/relatorios_list.html
+++ b/sapl/templates/base/relatorios_list.html
@@ -48,6 +48,20 @@
Audiência Pública
Audiência Pública com o tipo.
+
+ Normas por mês
+ Normas publicadas por mês.
+
+
+ Normas por vigência
+ Normas vigentes ou não vigentes.
+
+ {% if estatisticas_acesso_normas %}
+
+ Estatísticas de acesso de Normas.
+ Normas por acesso.
+
+ {% endif %}
From baf2bbd8985dd1fe5df0d1f99ff0f4139f41f111 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Wed, 19 Dec 2018 12:20:08 -0200
Subject: [PATCH 018/222] fix #2430 (#2431)
* fix #2430
* Corrige pep8
* minor fix
---
requirements/requirements.txt | 2 +-
sapl/api/forms.py | 26 +++++++-------
sapl/base/forms.py | 65 ++++++++++++++++-------------------
sapl/materia/forms.py | 52 +++++++++++++---------------
sapl/norma/forms.py | 13 ++++---
sapl/protocoloadm/forms.py | 26 +++++++-------
6 files changed, 86 insertions(+), 98 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 556c5d112..bb93e9f0e 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -9,7 +9,7 @@ django-compressor==2.0
django-crispy-forms==1.6.1
django-extensions==1.9.8
django-extra-views==0.11.0
-django-filter==0.15.3
+django-filter==1.0.0
django-floppyforms==1.6.2
django-model-utils==3.1.1
django-sass-processor==0.5.8
diff --git a/sapl/api/forms.py b/sapl/api/forms.py
index c36a0c11f..b9ad11aca 100644
--- a/sapl/api/forms.py
+++ b/sapl/api/forms.py
@@ -5,9 +5,8 @@ from django.forms.fields import CharField, MultiValueField
from django.forms.widgets import MultiWidget, TextInput
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
-from django_filters.filters import DateFilter, MethodFilter, ModelChoiceFilter
+from django_filters.filters import CharFilter, ModelChoiceFilter, DateFilter
from rest_framework import serializers
-from rest_framework.compat import django_filters
from rest_framework.filters import FilterSet
from sapl.base.models import Autor, TipoAutor
@@ -16,9 +15,9 @@ from sapl.utils import generic_relations_for_model
class SaplGenericRelationSearchFilterSet(FilterSet):
- q = MethodFilter()
+ q = CharFilter(method='filter_q')
- def filter_q(self, queryset, value):
+ def filter_q(self, queryset, name, value):
query = value.split(' ')
if query:
@@ -87,12 +86,12 @@ class SearchForFieldField(MultiValueField):
return None
-class SearchForFieldFilter(django_filters.filters.MethodFilter):
+class SearchForFieldFilter(CharFilter):
field_class = SearchForFieldField
class AutorChoiceFilterSet(SaplGenericRelationSearchFilterSet):
- q = MethodFilter()
+ q = CharFilter(method='filter_q')
tipo = ModelChoiceFilter(queryset=TipoAutor.objects.all())
class Meta:
@@ -101,18 +100,18 @@ class AutorChoiceFilterSet(SaplGenericRelationSearchFilterSet):
'tipo',
'nome', ]
- def filter_q(self, queryset, value):
+ def filter_q(self, queryset, name,value):
return SaplGenericRelationSearchFilterSet.filter_q(
self, queryset, value).distinct('nome').order_by('nome')
class AutorSearchForFieldFilterSet(AutorChoiceFilterSet):
- q = SearchForFieldFilter()
+ q = SearchForFieldFilter(method='filter_q')
class Meta(AutorChoiceFilterSet.Meta):
pass
- def filter_q(self, queryset, value):
+ def filter_q(self, queryset, name, value):
value[0] = value[0].split(',')
value[1] = value[1].split(',')
@@ -128,7 +127,7 @@ class AutorSearchForFieldFilterSet(AutorChoiceFilterSet):
class AutoresPossiveisFilterSet(FilterSet):
logger = logging.getLogger(__name__)
data_relativa = DateFilter(method='filter_data_relativa')
- tipo = MethodFilter()
+ tipo = CharFilter(method='filter_tipo')
class Meta:
model = Autor
@@ -137,10 +136,11 @@ class AutoresPossiveisFilterSet(FilterSet):
def filter_data_relativa(self, queryset, name, value):
return queryset
- def filter_tipo(self, queryset, value):
-
+ def filter_tipo(self, queryset, name, value):
+
try:
- self.logger.debug("Tentando obter TipoAutor correspondente à pk {}.".format(value))
+ self.logger.debug(
+ "Tentando obter TipoAutor correspondente à pk {}.".format(value))
tipo = TipoAutor.objects.get(pk=value)
except:
self.logger.error("TipoAutor(pk={}) inexistente.".format(value))
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index ec69c50d9..36267dbc3 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -655,14 +655,13 @@ class AutorFormForAdmin(AutorForm):
class RelatorioAtasFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = SessaoPlenaria
fields = ['data_inicio']
@@ -768,14 +767,13 @@ class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet):
class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = SessaoPlenaria
fields = ['data_inicio']
@@ -802,19 +800,18 @@ class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet):
class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
@property
def qs(self):
parent = super(RelatorioHistoricoTramitacaoFilterSet, self).qs
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero')
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['tipo', 'tramitacao__unidade_tramitacao_local',
'tramitacao__status', 'tramitacao__data_tramitacao']
@@ -842,19 +839,18 @@ class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet):
class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
@property
def qs(self):
parent = super(RelatorioDataFimPrazoTramitacaoFilterSet, self).qs
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero')
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['tipo', 'tramitacao__unidade_tramitacao_local',
'tramitacao__status', 'tramitacao__data_fim_prazo']
@@ -1014,13 +1010,6 @@ class RelatorioMateriasPorAnoAutorTipoFilterSet(django_filters.FilterSet):
class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
autoria__autor = django_filters.CharFilter(widget=forms.HiddenInput())
@property
@@ -1030,6 +1019,12 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet):
.order_by('autoria__autor', '-autoria__primeiro_autor', 'tipo', '-ano', '-numero')
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index 39dd4c24d..454cd9890 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -757,13 +757,6 @@ class AnexadaForm(ModelForm):
class MateriaLegislativaFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial Final')),
- 'widget': RangeWidgetOverride}
- }}
-
ano = django_filters.ChoiceFilter(required=False,
label='Ano da Matéria',
choices=ANO_CHOICES)
@@ -794,6 +787,12 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
o = MateriaPesquisaOrderingFilter()
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['numero',
'numero_protocolo',
@@ -1032,14 +1031,13 @@ class AutoriaMultiCreateForm(Form):
class AcessorioEmLoteFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']
@@ -1063,14 +1061,13 @@ class AcessorioEmLoteFilterSet(django_filters.FilterSet):
class PrimeiraTramitacaoEmLoteFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']
@@ -1095,14 +1092,13 @@ class PrimeiraTramitacaoEmLoteFilterSet(django_filters.FilterSet):
class TramitacaoEmLoteFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao', 'tramitacao__status',
'tramitacao__unidade_tramitacao_destino']
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
index 4f6b6a563..7cd8368f7 100644
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -41,13 +41,6 @@ ORDENACAO_CHOICES = [('', '---------'),
class NormaFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
ano = django_filters.ChoiceFilter(required=False,
label='Ano',
choices=ANO_CHOICES)
@@ -63,6 +56,12 @@ class NormaFilterSet(django_filters.FilterSet):
o = NormaPesquisaOrderingFilter()
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = NormaJuridica
fields = ['tipo', 'numero', 'ano', 'data', 'data_vigencia',
'data_publicacao', 'ementa', 'assuntos']
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 0edd63a34..97cab4eee 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -66,13 +66,6 @@ class AcompanhamentoDocumentoForm(ModelForm):
class ProtocoloFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateTimeField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': 'Data (%s)' % (_('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
ano = django_filters.ChoiceFilter(required=False,
label='Ano',
choices=ANO_CHOICES)
@@ -99,6 +92,12 @@ class ProtocoloFilterSet(django_filters.FilterSet):
o = AnoNumeroOrderingFilter()
class Meta:
+ filter_overrides = {models.DateTimeField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': 'Data (%s)' % (_('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = Protocolo
fields = ['numero',
'tipo_documento',
@@ -154,13 +153,6 @@ class ProtocoloFilterSet(django_filters.FilterSet):
class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': 'Data (%s)' % (_('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
-
ano = django_filters.ChoiceFilter(required=False,
label='Ano',
choices=ANO_CHOICES)
@@ -176,6 +168,12 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
o = AnoNumeroOrderingFilter()
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': 'Data (%s)' % (_('Inicial - Final')),
+ 'widget': RangeWidgetOverride}
+ }}
model = DocumentoAdministrativo
fields = ['tipo',
'numero',
From 956e0898e2a749e269de93ab14119c4095b715a0 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Wed, 19 Dec 2018 12:22:34 -0200
Subject: [PATCH 019/222] =?UTF-8?q?Fix=20#2099=20-=20Vota=C3=A7=C3=A3o=20e?=
=?UTF-8?q?m=20bloco=20(#2416)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* votacao em bloco
* votacao em bloco - em andamento
* feita a tela de votacao em bloco
* feita a tela de votacao em bloco
* votacao em bloco- em andamento
* inicio da nova tela da votacao em bloco - em andamento
* inicio da nova tela da votacao em bloco - em andamento
* Tela de votacao em bloco simbolica. Em progresso.
* tela votacao em bloco exibindo as informacoes corretas
* Check all incluso para seleção de ordens desejadas.
* inicio da tela de votacao para votacao em bloco ordem dia
* Alteracoes na votacao em bloco
* adicionado salvamento da votacao
* correcoes na votacao e no checkbox de marcar todos
* adicionada votacao em bloco nominal no expediente
* inicio da votacao nominal em bloco
* Tela votacao em bloco.
* votacao nominal em bloco
* pequenas mudancas
* inicio da correcao de alguns bugs, como formulario invalido
* correcao de erro quando nao ha presentes
* correcoes de erros
* cancelar votacao simbolica
* correcoes diversas e insercao dos menus
* Menu adicionado
* votacao em bloco
* ajusta menu e lança erro se root_pk ou object estiver faltando no contexto
* ajusta contexto para votação em bloco no expediente
---
sapl/base/templatetags/menus.py | 58 +-
sapl/materia/models.py | 1 +
sapl/relatorios/views.py | 1 -
sapl/sessao/forms.py | 126 +-
sapl/sessao/urls.py | 18 +-
sapl/sessao/views.py | 615 ++++++++-
sapl/static/styles/app.css | 503 ++++++++
sapl/static/styles/compilacao.css | 1136 +++++++++++++++++
sapl/templates/auth/user_list.html | 3 +-
sapl/templates/sessao/subnav.yaml | 4 +
sapl/templates/sessao/votacao/nominal.html | 76 +-
.../votacao/votacao_bloco_expediente.html | 173 +++
.../sessao/votacao/votacao_bloco_ordem.html | 174 +++
.../sessao/votacao/votacao_nominal_bloco.html | 149 +++
.../votacao/votacao_simbolica_bloco.html | 80 ++
15 files changed, 3009 insertions(+), 108 deletions(-)
create mode 100644 sapl/static/styles/app.css
create mode 100644 sapl/static/styles/compilacao.css
create mode 100644 sapl/templates/sessao/votacao/votacao_bloco_expediente.html
create mode 100644 sapl/templates/sessao/votacao/votacao_bloco_ordem.html
create mode 100644 sapl/templates/sessao/votacao/votacao_nominal_bloco.html
create mode 100644 sapl/templates/sessao/votacao/votacao_simbolica_bloco.html
diff --git a/sapl/base/templatetags/menus.py b/sapl/base/templatetags/menus.py
index 289cd20e6..5b526002a 100644
--- a/sapl/base/templatetags/menus.py
+++ b/sapl/base/templatetags/menus.py
@@ -1,3 +1,5 @@
+import logging
+
from django import template
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
@@ -6,6 +8,8 @@ import yaml
register = template.Library()
+logger = logging.getLogger(__name__)
+
@register.inclusion_tag('menus/menu.html', takes_context=True)
def menu(context, path=None):
@@ -84,7 +88,7 @@ def nav_run(context, path=None):
menu = yaml.load(rendered)
resolve_urls_inplace(menu, root_pk, rm, context)
except Exception as e:
- print(_("""Erro na conversão do yaml %s. App: %s.
+ raise Exception(_("""Erro na conversão do yaml %s. App: %s.
Erro:
%s
""") % (
@@ -113,25 +117,61 @@ def resolve_urls_inplace(menu, pk, rm, context):
menu['url'] = ''
menu['active'] = ''
else:
- if ':' in url_name:
+ if '/' in url_name:
+ pass
+ elif ':' in url_name:
try:
- menu['url'] = reverse('%s' % menu['url'],
- kwargs={'pk': pk})
+ menu['url'] = reverse('%s' % menu['url'])
except:
try:
- menu['url'] = reverse('%s' % menu['url'])
+ menu['url'] = reverse('%s' % menu['url'],
+ kwargs={'pk': pk})
except:
- pass
+ # tem que ser root_pk pois quando está sendo
+ # renderizado um detail, update, delete
+ # e ainda sim é necessário colocar o menu,
+ # nestes, casos o pk da url é do detail, e não
+ # do master, porém, os menus do subnav, apontam para
+ # outras áreas que as urls destas são construídas
+ # com pk do master, e não do detail... por isso
+ # no contexto deve ter, ou root_pk, ou object
+ # sendo que qualquer um dos dois,deverá ser o
+ # master.
+ # Estes detalhes são relevantes quando usa-se
+ # o menu isolado. Por outro lado, quando usado
+ # conjuntamente com o crud, este configura o contexto
+ # como se deve para o menus.py
+ log = """
+ Erro na construção do Menu:
+ menu: {}
+ url: {}
+ 1) Verifique se a url existe
+ 2) Se existe no contexto um desses itens:
+ - context['root_pk'] pk do master
+ - context['object'] objeto do master
+ """.format(menu['title'], menu['url'])
+ logger.error(log)
+ raise Exception(log)
+
else:
try:
menu['url'] = reverse('%s:%s' % (
- rm.app_name, menu['url']), kwargs={'pk': pk})
+ rm.app_name, menu['url']))
except:
try:
menu['url'] = reverse('%s:%s' % (
- rm.app_name, menu['url']))
+ rm.app_name, menu['url']), kwargs={'pk': pk})
except:
- pass
+ log = """Erro na construção do Menu:
+ menu: {}
+ url: {}
+ 1) Verifique se a url existe
+ 2) Se existe no contexto um desses itens:
+ - context['root_pk'] pk do master
+ - context['object'] objeto do master
+ """.format(menu['title'], menu['url'])
+ logger.error(log)
+ raise Exception(log)
menu['active'] = 'active'\
if context['request'].path == menu['url'] else ''
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
index 6f322c09c..cfcb71ffc 100644
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -16,6 +16,7 @@ from sapl.comissoes.models import Comissao
from sapl.compilacao.models import (PerfilEstruturalTextoArticulado,
TextoArticulado)
from sapl.parlamentares.models import Parlamentar
+#from sapl.protocoloadm.models import Protocolo
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey,
SaplGenericRelation, restringe_tipos_de_arquivo_txt,
texto_upload_path)
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index a8daa645a..0c5dfd377 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -1111,7 +1111,6 @@ def get_pauta_sessao(sessao, casa):
sessao_plenaria=sessao):
materia = MateriaLegislativa.objects.filter(
id=votacao.materia.id).first()
-
dic_votacao = {}
dic_votacao["tipo_materia"] = materia.tipo.sigla + ' - ' + materia.tipo.descricao
dic_votacao["num_ordem"] = votacao.numero_ordem
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index d2e00f47c..5a3cde342 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -1,4 +1,4 @@
-
+from django.contrib import messages
from datetime import datetime
from crispy_forms.helper import FormHelper
@@ -23,11 +23,10 @@ from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato
from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
MateriaPesquisaOrderingFilter, autor_label,
autor_modal, timezone)
-from .models import (Bancada, Bloco, ExpedienteMateria, Orador, JustificativaAusencia,
- OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
- SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao,
- RetiradaPauta, TipoRetiradaPauta)
-
+from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia,
+ Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
+ SessaoPlenariaPresenca, TipoJustificativa, TipoResultadoVotacao,
+ OcorrenciaSessao, RegistroVotacao, RetiradaPauta, TipoRetiradaPauta)
def recupera_anos():
@@ -520,12 +519,43 @@ class OcorrenciaSessaoForm(ModelForm):
class VotacaoForm(forms.Form):
- votos_sim = forms.CharField(label='Sim')
- votos_nao = forms.CharField(label='Não')
- abstencoes = forms.CharField(label='Abstenções')
- total_votos = forms.CharField(required=False, label='total')
+ votos_sim = forms.IntegerField(label='Sim')
+ votos_nao = forms.IntegerField(label='Não')
+ abstencoes = forms.IntegerField(label='Abstenções')
+ total_presentes = forms.IntegerField(required=False, widget=forms.HiddenInput())
+ voto_presidente = forms.IntegerField(label='A totalização inclui o voto do Presidente?')
+ total_votos = forms.IntegerField(required=False, label='total')
+ observacao = forms.CharField(required=False , label='Observação')
resultado_votacao = forms.CharField(label='Resultado da Votação')
+ def clean(self):
+ cleaned_data = super(VotacaoForm, self).clean()
+ if not self.is_valid():
+ return cleaned_data
+
+ votos_sim = cleaned_data['votos_sim']
+ votos_nao = cleaned_data['votos_nao']
+ abstencoes = cleaned_data['abstencoes']
+ qtde_presentes = cleaned_data['total_presentes']
+ qtde_votos = votos_sim + votos_nao + abstencoes
+ voto_presidente = cleaned_data['voto_presidente']
+
+ if not voto_presidente:
+ qtde_presentes -= 1
+
+ if qtde_votos != qtde_presentes:
+ raise ValidationError('O total de votos não corresponde com a quantidade de presentes!')
+
+ return cleaned_data
+
+ # def save(self, commit=False):
+ # #TODO Verificar se esse códido é utilizado
+
+ # votacao = super(VotacaoForm, self).save(commit)
+ # votacao.materia = self.cleaned_data['materia']
+ # votacao.save()
+ # return votacao
+
class VotacaoNominalForm(forms.Form):
resultado_votacao = forms.ModelChoiceField(label='Resultado da Votação',
@@ -891,3 +921,79 @@ class JustificativaAusenciaForm(ModelForm):
justificativa.materias_do_expediente.clear()
justificativa.materias_da_ordem_do_dia.clear()
return justificativa
+
+
+class VotacaoEmBlocoFilterSet(MateriaLegislativaFilterSet):
+
+ o = MateriaPesquisaOrderingFilter()
+ tramitacao__status = django_filters.ModelChoiceFilter(
+ required=True,
+ queryset=StatusTramitacao.objects.all(),
+ label=_('Status da Matéria'))
+
+ class Meta:
+ model = MateriaLegislativa
+ fields = ['tramitacao__status',
+ 'numero',
+ 'numero_protocolo',
+ 'ano',
+ 'tipo',
+ 'data_apresentacao',
+ 'data_publicacao',
+ 'autoria__autor__tipo',
+ # FIXME 'autoria__autor__partido',
+ 'relatoria__parlamentar_id',
+ 'local_origem_externa',
+ 'em_tramitacao',
+ ]
+
+ def __init__(self, *args, **kwargs):
+ super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs)
+
+ self.filters['tipo'].label = 'Tipo de Matéria'
+ self.filters['autoria__autor__tipo'].label = 'Tipo de Autor'
+ # self.filters['autoria__autor__partido'].label = 'Partido do Autor'
+ self.filters['relatoria__parlamentar_id'].label = 'Relatoria'
+
+ row1 = to_row(
+ [('tramitacao__status', 12)])
+ row2 = to_row(
+ [('tipo', 12)])
+ row3 = to_row(
+ [('numero', 4),
+ ('ano', 4),
+ ('numero_protocolo', 4)])
+ row4 = to_row(
+ [('data_apresentacao', 6),
+ ('data_publicacao', 6)])
+ row5 = to_row(
+ [('autoria__autor', 0),
+ (Button('pesquisar',
+ 'Pesquisar Autor',
+ css_class='btn btn-primary btn-sm'), 2),
+ (Button('limpar',
+ 'limpar Autor',
+ css_class='btn btn-primary btn-sm'), 10)])
+ row6 = to_row(
+ [('autoria__autor__tipo', 6),
+ # ('autoria__autor__partido', 6)
+ ])
+ row7 = to_row(
+ [('relatoria__parlamentar_id', 6),
+ ('local_origem_externa', 6)])
+ row8 = to_row(
+ [('em_tramitacao', 6),
+ ('o', 6)])
+ row9 = to_row(
+ [('ementa', 12)])
+
+ self.form.helper = FormHelper()
+ self.form.helper.form_method = 'GET'
+ self.form.helper.layout = Layout(
+ Fieldset(_('Pesquisa de Matéria'),
+ row1, row2, row3,
+ HTML(autor_label),
+ HTML(autor_modal),
+ row4, row5, row6, row7, row8, row9,
+ form_actions(label='Pesquisar'))
+ )
\ No newline at end of file
diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py
index f9b07967d..9bcb414b6 100644
--- a/sapl/sessao/urls.py
+++ b/sapl/sessao/urls.py
@@ -28,7 +28,9 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente,
remove_parlamentar_composicao,
reordernar_materias_expediente,
reordernar_materias_ordem,
- sessao_legislativa_legislatura_ajax)
+ sessao_legislativa_legislatura_ajax,
+ VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente,
+ VotacaoEmBlocoSimbolicaView,VotacaoEmBlocoNominalView)
from .apps import AppConfig
@@ -115,6 +117,16 @@ urlpatterns = [
url(r'^sessao/(?P\d+)/presencaordemdia$',
PresencaOrdemDiaView.as_view(),
name='presencaordemdia'),
+ url(r'^sessao/(?P\d+)/votacao_bloco_ordemdia$',
+ VotacaoEmBlocoOrdemDia.as_view(),
+ name='votacao_bloco_ordemdia'),
+ url(r'^sessao/(?P\d+)/votacao_bloco/votnom$',
+ VotacaoEmBlocoNominalView.as_view(), name='votacaobloconom'),
+ url(r'^sessao/(?P\d+)/votacao_bloco/votsimb$',
+ VotacaoEmBlocoSimbolicaView.as_view(), name='votacaoblocosimb'),
+ url(r'^sessao/(?P\d+)/votacao_bloco_expediente$',
+ VotacaoEmBlocoExpediente.as_view(),
+ name='votacao_bloco_expediente'),
url(r'^sessao/(?P\d+)/resumo$',
ResumoView.as_view(), name='resumo'),
url(r'^sessao/(?P\d+)/resumo_ata$',
@@ -133,6 +145,10 @@ urlpatterns = [
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/votsimbbloco/$',
+ VotacaoView.as_view(), name='votacaosimbolicabloco'),
+
url(r'^sessao/(?P\d+)/matordemdia/votsimb'
'/view/(?P\d+)/(?P\d+)$',
VotacaoEditView.as_view(), name='votacaosimbolicaedit'),
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index 98ca3815c..b705e302f 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -1,6 +1,6 @@
-from operator import itemgetter
import logging
+from operator import itemgetter
from re import sub
from django.contrib import messages
@@ -57,7 +57,8 @@ TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria')
TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente')
TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa')
CargoBancadaCrud = CrudAux.build(CargoBancada, '')
-TipoResultadoVotacaoCrud = CrudAux.build(TipoResultadoVotacao, 'tipo_resultado_votacao')
+TipoResultadoVotacaoCrud = CrudAux.build(
+ TipoResultadoVotacao, 'tipo_resultado_votacao')
TipoRetiradaPautaCrud = CrudAux.build(TipoRetiradaPauta, 'tipo_retirada_pauta')
@@ -87,7 +88,8 @@ def verifica_presenca(request, model, spk):
logger = logging.getLogger(__name__)
if not model.objects.filter(sessao_plenaria_id=spk).exists():
username = request.user.username
- logger.error("user=" + username + ". Votação não pode ser aberta sem presenças (sessao_plenaria_id={}).".format(spk))
+ logger.error("user=" + username +
+ ". Votação não pode ser aberta sem presenças (sessao_plenaria_id={}).".format(spk))
msg = _('Votação não pode ser aberta sem presenças')
messages.add_message(request, messages.ERROR, msg)
return False
@@ -301,7 +303,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
retirada_descricao = retirada.tipo_de_retirada.descricao
retirada_observacao = retirada.observacao
url = reverse('sapl.sessao:retiradapauta_detail',
- kwargs={'pk': retirada.id})
+ kwargs={'pk': retirada.id})
resultado = ('%s %s ' %
(url,
retirada_descricao,
@@ -798,7 +800,8 @@ class PresencaView(FormMixin, PresencaMixin, DetailView):
sessao.parlamentar = Parlamentar.objects.get(id=p)
sessao.save()
username = request.user.username
- self.logger.info("user=" + username + ". SessaoPlenariaPresenca salva com sucesso (parlamentar_id={})!".format(p))
+ self.logger.info(
+ "user=" + username + ". SessaoPlenariaPresenca salva com sucesso (parlamentar_id={})!".format(p))
msg = _('Presença em Sessão salva com sucesso!')
messages.add_message(request, messages.SUCCESS, msg)
@@ -850,7 +853,7 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
cronometro_aparte = cronometro_aparte.seconds
cronometro_ordem = cronometro_ordem.seconds
cronometro_consideracoes = cronometro_consideracoes.seconds
-
+
context = TemplateView.get_context_data(self, **kwargs)
context.update({
'head_title': str(_('Painel Plenário')),
@@ -904,9 +907,10 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView):
ordem.sessao_plenaria = self.object
ordem.parlamentar = Parlamentar.objects.get(id=p)
ordem.save()
+ username = request.user.username
+ self.logger.info(
+ 'user=' + username + '. PresencaOrdemDia (parlamentar com id={}) salva com sucesso!'.format(p))
- username = request.user.username
- self.logger.info('user=' + username + '. PresencaOrdemDia (parlamentar com id={}) salva com sucesso!'.format(p))
msg = _('Presença em Ordem do Dia salva com sucesso!')
messages.add_message(request, messages.SUCCESS, msg)
@@ -1041,11 +1045,13 @@ class MesaView(FormMixin, DetailView):
username = request.user.username
try:
- self.logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}".format(kwargs['pk']))
+ self.logger.debug(
+ "user=" + username + ". Tentando obter SessaoPlenaria com id={}".format(kwargs['pk']))
sessao = SessaoPlenaria.objects.get(
id=kwargs['pk'])
except ObjectDoesNotExist:
- self.logger.error("user=" + username + ". SessaoPlenaria com id={} não existe.".format(kwargs['pk']))
+ self.logger.error(
+ "user=" + username + ". SessaoPlenaria com id={} não existe.".format(kwargs['pk']))
mensagem = _('Esta Sessão Plenária não existe!')
messages.add_message(request, messages.INFO, mensagem)
@@ -1100,11 +1106,13 @@ def atualizar_mesa(request):
logger = logging.getLogger(__name__)
username = request.user.username
try:
- logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(request.GET['sessao']))
+ logger.debug("user=" + username +
+ ". Tentando obter SessaoPlenaria com id={}.".format(request.GET['sessao']))
sessao = SessaoPlenaria.objects.get(
id=int(request.GET['sessao']))
except ObjectDoesNotExist:
- logger.error("user=" + username + ". SessaoPlenaria com id={} inexistente.".format(request.GET['sessao']))
+ logger.error("user=" + username +
+ ". SessaoPlenaria com id={} inexistente.".format(request.GET['sessao']))
return JsonResponse({'msg': ('Sessão Inexistente!', 0)})
# Atualiza os componentes da view após a mudança
@@ -1152,19 +1160,23 @@ def insere_parlamentar_composicao(request):
composicao = IntegranteMesa()
try:
- logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(request.POST['sessao']))
+ logger.debug(
+ "user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(request.POST['sessao']))
composicao.sessao_plenaria = SessaoPlenaria.objects.get(
id=int(request.POST['sessao']))
except MultiValueDictKeyError:
- logger.error("user=" + username + ". SessaoPlenaria com id={} não existe.".format(request.POST['sessao']))
+ logger.error(
+ "user=" + username + ". SessaoPlenaria com id={} não existe.".format(request.POST['sessao']))
return JsonResponse({'msg': ('A Sessão informada não existe!', 0)})
try:
- logger.debug("user=" + username + ". Tentando obter Parlamentar com id={}.".format(request.POST['parlamentar']))
+ logger.debug(
+ "user=" + username + ". Tentando obter Parlamentar com id={}.".format(request.POST['parlamentar']))
composicao.parlamentar = Parlamentar.objects.get(
id=int(request.POST['parlamentar']))
except MultiValueDictKeyError:
- logger.error("user=" + username + ". Parlamentar com id={} não existe.".format(request.POST['parlamentar']))
+ logger.error(
+ "user=" + username + ". Parlamentar com id={} não existe.".format(request.POST['parlamentar']))
return JsonResponse({
'msg': ('Nenhum parlamentar foi inserido!', 0)})
@@ -1183,10 +1195,12 @@ def insere_parlamentar_composicao(request):
composicao.save()
except MultiValueDictKeyError as e:
- logger.error("user=" + username + ". Nenhum cargo foi inserido! " + str(e))
+ logger.error("user=" + username +
+ ". Nenhum cargo foi inserido! " + str(e))
return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)})
- logger.info("user=" + username + ". Parlamentar (id={}) inserido com sucesso na sessao_plenaria(id={}) e cargo(ìd={}).")
+ logger.info("user=" + username +
+ ". Parlamentar (id={}) inserido com sucesso na sessao_plenaria(id={}) e cargo(ìd={}).")
return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)})
else:
@@ -1207,7 +1221,8 @@ def remove_parlamentar_composicao(request):
if 'composicao_mesa' in request.POST:
try:
- logger.debug("user=" + username + ". Tentando remover IntegranteMesa com id={}".format(request.POST['composicao_mesa']))
+ logger.debug("user=" + username + ". Tentando remover IntegranteMesa com id={}".format(
+ request.POST['composicao_mesa']))
IntegranteMesa.objects.get(
id=int(request.POST['composicao_mesa'])).delete()
except ObjectDoesNotExist:
@@ -1217,12 +1232,14 @@ def remove_parlamentar_composicao(request):
{'msg': (
'Composição da Mesa não pôde ser removida!', 0)})
- logger.info("user=" + username + ". IntegranteMesa com id={} removido com sucesso.")
+ logger.info("user=" + username +
+ ". IntegranteMesa com id={} removido com sucesso.")
return JsonResponse(
{'msg': (
'Parlamentar excluido com sucesso!', 1)})
else:
- logger.debug("user=" + username + ". Nenhum parlamentar selecionado para ser excluido!")
+ logger.debug("user=" + username +
+ ". Nenhum parlamentar selecionado para ser excluido!")
return JsonResponse(
{'msg': (
'Selecione algum parlamentar para ser excluido!', 0)})
@@ -1349,7 +1366,6 @@ class ResumoView(DetailView):
context.update({'presenca_sessao': parlamentares_sessao,
'justificativa_ausencia': ausentes_sessao})
-
# =====================================================================
# Expedientes
expediente = ExpedienteSessao.objects.filter(
@@ -1450,13 +1466,16 @@ class ResumoView(DetailView):
config_assinatura_ata = AppsAppConfig.objects.first().assinatura_ata
if config_assinatura_ata == 'T' and parlamentares_ordem:
- context.update({'texto_assinatura': 'Assinatura de Todos os Parlamentares Presentes na Sessão'})
+ context.update(
+ {'texto_assinatura': 'Assinatura de Todos os Parlamentares Presentes na Sessão'})
context.update({'assinatura_presentes': parlamentares_ordem})
elif config_assinatura_ata == 'M' and parlamentares_mesa_dia:
- context.update({'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'})
+ context.update(
+ {'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'})
context.update({'assinatura_presentes': parlamentares_mesa_dia})
elif config_assinatura_ata == 'P' and presidente_dia:
- context.update({'texto_assinatura': 'Assinatura do Presidente da Sessão'})
+ context.update(
+ {'texto_assinatura': 'Assinatura do Presidente da Sessão'})
context.update({'assinatura_presentes': presidente_dia})
# =====================================================================
@@ -1609,7 +1628,8 @@ class ExpedienteView(FormMixin, DetailView):
if 'apagar-expediente' in request.POST:
ExpedienteSessao.objects.filter(
sessao_plenaria_id=self.object.id).delete()
- self.logger.info('user=' + username + '. ExpedienteSessao de sessao_plenaria_id={} deletado.'.format(self.object.id))
+ self.logger.info(
+ 'user=' + username + '. ExpedienteSessao de sessao_plenaria_id={} deletado.'.format(self.object.id))
return self.form_valid(form)
if form.is_valid():
@@ -1635,7 +1655,8 @@ class ExpedienteView(FormMixin, DetailView):
return self.form_valid(form)
else:
- self.logger.error("user=" + username + ". Erro ao salvar registro (sessao_plenaria_id={}).".format(self.object.id))
+ self.logger.error(
+ "user=" + username + ". Erro ao salvar registro (sessao_plenaria_id={}).".format(self.object.id))
msg = _('Erro ao salvar ExpedienteSessao')
messages.add_message(self.request, messages.SUCCESS, msg)
return self.form_invalid(form)
@@ -1705,7 +1726,8 @@ class OcorrenciaSessaoView(FormMixin, DetailView):
messages.add_message(self.request, messages.SUCCESS, msg)
username = self.request.user.username
- self.logger.info('user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id))
+ self.logger.info(
+ 'user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id))
@method_decorator(permission_required('sessao.add_ocorrenciasessao'))
def post(self, request, *args, **kwargs):
@@ -1954,14 +1976,16 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
if RegistroVotacao.objects.filter(ordem_id=ordem_id).exists():
msg = _('Esta matéria já foi votada!')
messages.add_message(request, messages.ERROR, msg)
- self.logger.info('user=' + username + '. Matéria (ordem_id={}) já votada!'.format(ordem_id))
+ self.logger.info(
+ 'user=' + username + '. Matéria (ordem_id={}) já votada!'.format(ordem_id))
return HttpResponseRedirect(reverse(
'sapl.sessao:ordemdia_list', kwargs={'pk': kwargs['pk']}))
try:
ordem = OrdemDia.objects.get(id=ordem_id)
except ObjectDoesNotExist:
- self.logger.error('user=' + username + '. Objeto OrdemDia (pk={}) não existe.'.format(ordem_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto OrdemDia (pk={}) não existe.'.format(ordem_id))
raise Http404()
presentes = PresencaOrdemDia.objects.filter(
@@ -1971,7 +1995,8 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
materia_votacao = ordem
if not ordem.votacao_aberta:
- self.logger.error('user=' + username + '. A votação para esta OrdemDia (id={}) encontra-se fechada!'.format(ordem_id))
+ self.logger.error(
+ 'user=' + username + '. A votação para esta OrdemDia (id={}) encontra-se fechada!'.format(ordem_id))
msg = _('A votação para esta matéria encontra-se fechada!')
messages.add_message(request, messages.ERROR, msg)
return HttpResponseRedirect(reverse(
@@ -1984,7 +2009,8 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
expediente_id = kwargs['oid']
if (RegistroVotacao.objects.filter(
expediente_id=expediente_id).exists()):
- self.logger.error("user=" + username + ". RegistroVotacao (expediente_id={}) já existe.".format(expediente_id))
+ self.logger.error(
+ "user=" + username + ". RegistroVotacao (expediente_id={}) já existe.".format(expediente_id))
msg = _('Esta matéria já foi votada!')
messages.add_message(request, messages.ERROR, msg)
return HttpResponseRedirect(reverse(
@@ -1992,10 +2018,12 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
kwargs={'pk': kwargs['pk']}))
try:
- self.logger.debug("user=" + username + ". Tentando obter Objeto ExpedienteMateria com id={}.".format(expediente_id))
+ self.logger.debug(
+ "user=" + username + ". Tentando obter Objeto ExpedienteMateria com id={}.".format(expediente_id))
expediente = ExpedienteMateria.objects.get(id=expediente_id)
except ObjectDoesNotExist:
- self.logger.error('user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id))
raise Http404()
presentes = SessaoPlenariaPresenca.objects.filter(
@@ -2005,7 +2033,8 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
materia_votacao = expediente
if not expediente.votacao_aberta:
- msg = _('A votação para este ExpedienteMateria (id={}) encontra-se fechada!'.format(expediente_id))
+ msg = _(
+ 'A votação para este ExpedienteMateria (id={}) encontra-se fechada!'.format(expediente_id))
messages.add_message(request, messages.ERROR, msg)
return HttpResponseRedirect(reverse(
'sapl.sessao:expedientemateria_list',
@@ -2033,19 +2062,23 @@ class VotacaoNominalAbstract(SessaoPermissionMixin):
if self.ordem:
ordem_id = kwargs['oid']
try:
- self.logger.debug("user=" + username + ". Tentando obter objeto OrdemDia com id={}.".format(ordem_id))
+ self.logger.debug(
+ "user=" + username + ". Tentando obter objeto OrdemDia com id={}.".format(ordem_id))
materia_votacao = OrdemDia.objects.get(id=ordem_id)
except ObjectDoesNotExist:
- self.logger.error('user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id))
raise Http404()
elif self.expediente:
expediente_id = kwargs['oid']
try:
- self.logger.debug("user=" + username + ". Tentando obter ExpedienteMateria com id={}.".format(expediente_id))
+ self.logger.debug(
+ "user=" + username + ". Tentando obter ExpedienteMateria com id={}.".format(expediente_id))
materia_votacao = ExpedienteMateria.objects.get(
id=expediente_id)
except ObjectDoesNotExist:
- self.logger.error('user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id))
raise Http404()
if form.is_valid():
@@ -2231,7 +2264,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin):
votacao = RegistroVotacao.objects.filter(ordem_id=ordem_id).last()
if not ordem or not votacao:
- self.logger.error('user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format(ordem_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format(ordem_id))
raise Http404()
materia = ordem.materia
@@ -2304,7 +2338,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin):
try:
materia_votacao = OrdemDia.objects.get(id=ordem_id)
except ObjectDoesNotExist:
- self.logger.error('user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id))
raise Http404()
elif self.expediente:
@@ -2314,7 +2349,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin):
materia_votacao = ExpedienteMateria.objects.get(
id=expediente_id)
except ObjectDoesNotExist:
- self.logger.error('user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id))
+ self.logger.error(
+ 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id))
raise Http404()
if(int(request.POST['anular_votacao']) == 1):
@@ -2993,7 +3029,8 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin,
msg = _('%s adicionado(a) com sucesso!'
% MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.SUCCESS, msg)
- self.logger.info("user=" + username + ". MateriaLegislativa de id={} adicionado(a) com sucesso!".format(m))
+ self.logger.info(
+ "user=" + username + ". MateriaLegislativa de id={} adicionado(a) com sucesso!".format(m))
except MultiValueDictKeyError:
msg = _('Formulário Inválido. Você esqueceu de selecionar ' +
'%s' %
@@ -3068,7 +3105,8 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente):
msg = _('%s adicionado(a) com sucesso!'
% MateriaLegislativa.objects.get(id=m))
messages.add_message(request, messages.SUCCESS, msg)
- self.logger.debug('user=' + username + '. MateriaLegislativa de id={} adicionado(a) com sucesso!'.format(m))
+ self.logger.debug(
+ 'user=' + username + '. MateriaLegislativa de id={} adicionado(a) com sucesso!'.format(m))
except MultiValueDictKeyError:
msg = _('Formulário Inválido. Você esqueceu de selecionar ' +
'o tipo de votação de %s' %
@@ -3129,7 +3167,8 @@ def mudar_ordem_materia_sessao(request):
numero_ordem=posicao_inicial)
except ObjectDoesNotExist:
username = request.user.username
- logger.error("user=" + username + ". Materia com sessao_plenaria={} e numero_ordem={}.".format(pk_sessao, posicao_inicial))
+ logger.error("user=" + username +
+ ". Materia com sessao_plenaria={} e numero_ordem={}.".format(pk_sessao, posicao_inicial))
raise # TODO tratar essa exceção
# Se a posição inicial for menor que a final, todos que
@@ -3241,13 +3280,494 @@ class JustificativaAusenciaCrud(MasterDetailCrud):
pass
+class VotacaoEmBlocoExpediente(ListView):
+
+ model = ExpedienteMateria
+ template_name = 'sessao/votacao/votacao_bloco_expediente.html'
+ app_label = AppConfig.label
+ context_object_name = 'expedientes'
+ logger = logging.getLogger(__name__)
+
+ def get_queryset(self):
+ kwargs = self.kwargs
+ return ExpedienteMateria.objects.filter(sessao_plenaria_id=kwargs['pk'],
+ resultado='')
+
+ def get_context_data(self, **kwargs):
+ context = super(VotacaoEmBlocoExpediente,
+ self).get_context_data(**kwargs)
+ context['turno_choices'] = Tramitacao.TURNO_CHOICES
+ context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk'])
+ context['pk'] = self.kwargs['pk']
+ context['root_pk'] = self.kwargs['pk']
+ return context
+
+
+class VotacaoEmBlocoOrdemDia(ListView):
+ model = OrdemDia
+ template_name = 'sessao/votacao/votacao_bloco_ordem.html'
+ app_label = AppConfig.label
+ logger = logging.getLogger(__name__)
+ context_object_name = 'ordem_dia'
+ parent_field = 'sessao_plenaria'
+
+ def get_queryset(self):
+ return OrdemDia.objects.filter(sessao_plenaria_id=self.kwargs['pk'],
+ resultado='')
+
+ def get_context_data(self, **kwargs):
+ context = super(VotacaoEmBlocoOrdemDia,
+ self).get_context_data(**kwargs)
+ context['turno_choices'] = Tramitacao.TURNO_CHOICES
+ context['pk'] = self.kwargs['pk']
+ context['root_pk'] = self.kwargs['pk']
+ context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk'])
+ return context
+
+
+class VotacaoEmBlocoSimbolicaView(TemplateView):
+
+ """
+ Votação Simbólica
+ """
+
+ template_name = 'sessao/votacao/votacao_simbolica_bloco.html'
+ logger = logging.getLogger(__name__)
+
+ def post(self, request, *args, **kwargs):
+
+ if not 'context' in locals():
+ context = {'pk': self.kwargs['pk'],
+ 'root_pk': self.kwargs['pk'],
+ 'title': SessaoPlenaria.objects.get(id=self.kwargs['pk'])
+ }
+
+ if 'marcadas_1' in request.POST:
+
+ context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(),
+ 'origem': request.POST['origem']})
+
+ # marcadas_1 se refere a votação simbólica e marcadas_2 a votação
+ # nominal
+ if request.POST['origem'] == 'ordem':
+ ordens = OrdemDia.objects.filter(
+ id__in=request.POST.getlist('marcadas_1'))
+ qtde_presentes = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk']).count()
+ context.update({'ordens': ordens,
+ 'total_presentes': qtde_presentes})
+ else:
+ expedientes = ExpedienteMateria.objects.filter(
+ id__in=request.POST.getlist('marcadas_1'))
+ qtde_presentes = SessaoPlenariaPresenca.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk']).count()
+ context.update({'expedientes': expedientes,
+ 'total_presentes': qtde_presentes})
+
+ if 'salvar-votacao' in request.POST:
+ form = VotacaoForm(request.POST)
+
+ if form.is_valid():
+
+ origem = request.POST['origem']
+
+ if origem == 'ordem':
+ ordens = OrdemDia.objects.filter(
+ id__in=request.POST.getlist('ordens'))
+
+ for ordem in ordens:
+ try:
+ votacao = RegistroVotacao()
+ votacao.numero_votos_sim = int(
+ request.POST['votos_sim'])
+ votacao.numero_votos_nao = int(
+ request.POST['votos_nao'])
+ votacao.numero_abstencoes = int(
+ request.POST['abstencoes'])
+ votacao.observacao = request.POST['observacao']
+ votacao.materia = ordem.materia
+ votacao.ordem = ordem
+ resultado = TipoResultadoVotacao.objects.get(
+ id=request.POST['resultado_votacao'])
+ votacao.tipo_resultado_votacao = resultado
+ votacao.save()
+ except Exception as e:
+ username = request.user.username
+ self.logger.error('user=' + username + '. Problemas ao salvar '
+ 'RegistroVotacao da materia de id={} '
+ 'e da ordem de id={}. '
+ .format(ordem.materia.id, ordem.id) + str(e))
+ return self.form_invalid(form, context)
+ else:
+ ordem.resultado = resultado.nome
+ ordem.votacao_aberta = False
+ ordem.save()
+
+ else:
+ expedientes = ExpedienteMateria.objects.filter(
+ id__in=request.POST.getlist('expedientes'))
+ for expediente in expedientes:
+ try:
+ votacao = RegistroVotacao()
+ votacao.numero_votos_sim = int(
+ request.POST['votos_sim'])
+ votacao.numero_votos_nao = int(
+ request.POST['votos_nao'])
+ votacao.numero_abstencoes = int(
+ request.POST['abstencoes'])
+ votacao.observacao = request.POST['observacao']
+ votacao.materia = expediente.materia
+ votacao.expediente = expediente
+ resultado = TipoResultadoVotacao.objects.get(
+ id=request.POST['resultado_votacao'])
+ votacao.tipo_resultado_votacao = resultado
+ votacao.save()
+ except Exception as e:
+ username = request.user.username
+ self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} '
+ 'e da ordem de id={}. '.format(expediente.materia.id, expediente.id) + str(e))
+ return self.form_invalid(form, context)
+ else:
+ expediente.resultado = resultado.nome
+ expediente.votacao_aberta = False
+ expediente.save()
+
+ return HttpResponseRedirect(self.get_success_url())
+
+ else:
+ return self.form_invalid(form, context)
+
+ if 'cancelar-votacao' in request.POST:
+ if request.POST['origem'] == 'ordem':
+ ordens = OrdemDia.objects.filter(
+ id__in=request.POST.getlist('ordens'))
+ for ordem in ordens:
+ ordem.votacao_aberta = False
+ ordem.save()
+ else:
+ expedientes = ExpedienteMateria.objects.filter(
+ id__in=request.POST.getlist('expedientes'))
+ for expediente in expedientes:
+ expediente.votacao_aberta = False
+ expediente.save()
+
+ return HttpResponseRedirect(self.get_success_url())
+
+ return self.render_to_response(context)
+
+ def get_tipos_votacao(self):
+ for tipo in TipoResultadoVotacao.objects.all():
+ yield tipo
+
+ def get_success_url(self):
+ if self.request.POST['origem'] == 'ordem':
+ return reverse('sapl.sessao:ordemdia_list',
+ kwargs={'pk': self.kwargs['pk']})
+ else:
+ return reverse('sapl.sessao:expedientemateria_list',
+ kwargs={'pk': self.kwargs['pk']})
+
+ def form_invalid(self, form, context):
+
+ errors_tuple = [(form[e].label, form.errors[e])
+ for e in form.errors if e in form.fields]
+ error_message = ''
+ for e in errors_tuple:
+ error_message += '%s : %s ' % (e[0], e[1][0])
+ for e in form.non_field_errors():
+ error_message += '%s ' % e
+ error_message += ' '
+
+ messages.add_message(self.request, messages.ERROR, error_message)
+
+ if self.request.POST['origem'] == 'ordem':
+ ordens = OrdemDia.objects.filter(
+ id__in=self.request.POST.getlist('ordens'))
+ qtde_presentes = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk']).count()
+ context.update({'ordens': ordens,
+ 'total_presentes': qtde_presentes})
+ elif self.request.POST['origem'] == 'expediente':
+ expedientes = ExpedienteMateria.objects.filter(
+ id__in=self.request.POST.getlist('expedientes'))
+ qtde_presentes = SessaoPlenariaPresenca.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk']).count()
+ context.update({'expedientes': expedientes,
+ 'total_presentes': qtde_presentes})
+
+ context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(),
+ 'form': form,
+ 'origem': self.request.POST['origem']})
+
+ return self.render_to_response(context)
+
+
+class VotacaoEmBlocoNominalView(TemplateView):
+ """
+ Votação Nominal
+ """
+ template_name = 'sessao/votacao/votacao_nominal_bloco.html'
+ logger = logging.getLogger(__name__)
+
+ def post(self, request, *args, **kwargs):
+ username = request.user.username
+ form = VotacaoNominalForm(request.POST)
+
+ if not 'context' in locals():
+ context = {'pk': self.kwargs['pk'],
+ 'root_pk': self.kwargs['pk'],
+ 'title': SessaoPlenaria.objects.get(id=self.kwargs['pk']),
+ 'subnav_template_name': 'sessao/subnav.yaml'}
+
+ if 'marcadas_2' in request.POST:
+
+ context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(),
+ 'origem': request.POST['origem']})
+
+ # marcadas_1 se refere a votação simbólica e marcadas_2 a votação
+ # nominal
+ if request.POST['origem'] == 'ordem':
+ ordens = OrdemDia.objects.filter(
+ id__in=request.POST.getlist('marcadas_2'))
+ presentes = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=kwargs['pk'])
+ context.update({'ordens': ordens})
+ else:
+ expedientes = ExpedienteMateria.objects.filter(
+ id__in=request.POST.getlist('marcadas_2'))
+ presentes = SessaoPlenariaPresenca.objects.filter(
+ sessao_plenaria_id=kwargs['pk'])
+ context.update({'expedientes': expedientes})
+ total_presentes = presentes.count()
+ context.update({'parlamentares': self.get_parlamentares(),
+ 'total_presentes': total_presentes})
+
+ if 'cancelar-votacao' in request.POST:
+ if request.POST['origem'] == 'ordem':
+ for ordem_id in request.POST.getlist('ordens'):
+ ordem = OrdemDia.objects.get(id=ordem_id)
+ fechar_votacao_materia(ordem)
+ return HttpResponseRedirect(reverse(
+ 'sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']}))
+ else:
+ for expediente_id in request.POST.getlist('expedientes'):
+ expediente = ExpedienteMateria.objects.get(
+ id=expediente_id)
+ fechar_votacao_materia(expediente)
+ return HttpResponseRedirect(reverse(
+ 'sapl.sessao:expedientemateria_list',
+ kwargs={'pk': self.kwargs['pk']}))
+
+ if 'salvar-votacao' in request.POST:
+
+ if form.is_valid():
+ if form.cleaned_data['resultado_votacao'] == None:
+ form.add_error(None, 'Não é possível finalizar a votação sem '
+ 'nenhum resultado da votação.')
+ return self.form_invalid(form, context)
+
+ qtde_votos = (int(request.POST['votos_sim']) +
+ int(request.POST['votos_nao']) +
+ int(request.POST['abstencoes']) +
+ int(request.POST['nao_votou']))
+
+ # Caso todas as opções sejam 'Não votou', fecha a votação
+ if int(request.POST['nao_votou']) == qtde_votos:
+ self.logger.error('user=' + username + '. Não é possível finalizar a votação sem '
+ 'nenhum voto.')
+ form.add_error(None, 'Não é possível finalizar a votação sem '
+ 'nenhum voto.')
+ return self.form_invalid(form, context)
+
+ if request.POST['origem'] == 'ordem':
+ for ordem_id in request.POST.getlist('ordens'):
+ ordem = OrdemDia.objects.get(id=ordem_id)
+ # Remove todas as votação desta matéria, caso existam
+ RegistroVotacao.objects.filter(
+ ordem_id=ordem_id).delete()
+ votacao = RegistroVotacao()
+ votacao.numero_votos_sim = int(
+ request.POST['votos_sim'])
+ votacao.numero_votos_nao = int(
+ request.POST['votos_nao'])
+ votacao.numero_abstencoes = int(
+ request.POST['abstencoes'])
+ votacao.observacao = request.POST['observacao']
+ votacao.materia = ordem.materia
+ votacao.ordem = ordem
+ votacao.tipo_resultado_votacao = form.cleaned_data['resultado_votacao']
+ votacao.save()
+
+ for votos in request.POST.getlist('voto_parlamentar'):
+ v = votos.split(':')
+ voto = v[0]
+ parlamentar_id = v[1]
+
+ voto_parlamentar = VotoParlamentar.objects.get_or_create(
+ parlamentar_id=parlamentar_id,
+ ordem_id=ordem_id)[0]
+
+ voto_parlamentar.voto = voto
+ voto_parlamentar.parlamentar_id = parlamentar_id
+ voto_parlamentar.votacao_id = votacao.id
+ voto_parlamentar.save()
+
+ ordem.resultado = form.cleaned_data['resultado_votacao'].nome
+ ordem.votacao_aberta = False
+ ordem.save()
+
+ VotoParlamentar.objects.filter(
+ ordem_id=ordem_id,
+ votacao__isnull=True).delete()
+
+ else:
+ for expediente_id in request.POST.getlist('expedientes'):
+ expediente = ExpedienteMateria.objects.get(
+ id=expediente_id)
+ RegistroVotacao.objects.filter(
+ expediente_id=expediente_id).delete()
+ votacao = RegistroVotacao()
+ votacao.numero_votos_sim = int(
+ request.POST['votos_sim'])
+ votacao.numero_votos_nao = int(
+ request.POST['votos_nao'])
+ votacao.numero_abstencoes = int(
+ request.POST['abstencoes'])
+ votacao.observacao = request.POST['observacao']
+ votacao.materia = expediente.materia
+ votacao.expediente = expediente
+ votacao.tipo_resultado_votacao = form.cleaned_data['resultado_votacao']
+ votacao.save()
+
+ # Salva os votos de cada parlamentar
+ for votos in request.POST.getlist('voto_parlamentar'):
+ v = votos.split(':')
+ voto = v[0]
+ parlamentar_id = v[1]
+
+ voto_parlamentar = VotoParlamentar.objects.get_or_create(
+ parlamentar_id=parlamentar_id,
+ expediente_id=expediente_id)[0]
+
+ voto_parlamentar.voto = voto
+ voto_parlamentar.parlamentar_id = parlamentar_id
+ voto_parlamentar.votacao_id = votacao.id
+ voto_parlamentar.save()
+
+ expediente.resultado = form.cleaned_data['resultado_votacao'].nome
+ expediente.votacao_aberta = False
+ expediente.save()
+
+ VotoParlamentar.objects.filter(
+ expediente_id=expediente_id,
+ votacao__isnull=True).delete()
+
+ return HttpResponseRedirect(self.get_success_url())
+
+ else:
+ return self.form_invalid(form, context)
+
+ return self.render_to_response(context)
+
+ def get_parlamentares(self):
+
+ # campos hidden ainda não preenchidos
+ if 'marcadas_2' in self.request.POST:
+ if self.request.POST['origem'] == 'ordem':
+ presencas = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk'])
+ ordens_id = self.request.POST.getlist('marcadas_2')
+ voto_parlamentar = VotoParlamentar.objects.filter(
+ ordem=ordens_id[0])
+ else:
+ presencas = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk'])
+ expedientes_id = self.request.POST.getlist('marcadas_2')
+ voto_parlamentar = VotoParlamentar.objects.filter(
+ expediente=expedientes_id[0])
+
+ # campos hidden já preenchidos
+ else:
+ if self.request.POST['origem'] == 'ordem':
+ presencas = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk'])
+ ordens_id = self.request.POST.getlist('ordens')
+ voto_parlamentar = VotoParlamentar.objects.filter(
+ ordem=ordens_id[0])
+ else:
+ presencas = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk'])
+ expedientes_id = self.request.POST.getlist('expedientes')
+ voto_parlamentar = VotoParlamentar.objects.filter(
+ expediente=expedientes_id[0])
+
+ presentes = [p.parlamentar for p in presencas]
+
+ for parlamentar in Parlamentar.objects.filter(ativo=True):
+ if parlamentar in presentes:
+ try:
+ voto = voto_parlamentar.get(
+ parlamentar=parlamentar)
+ except ObjectDoesNotExist:
+ username = self.request.user.username
+ self.logger.error('user=' + username + '. Objeto voto_parlamentar do ' +
+ 'parlamentar de id={} não existe.'.format(parlamentar.pk))
+ yield [parlamentar, None]
+ else:
+ yield [parlamentar, voto.voto]
+
+ def get_success_url(self):
+ if self.request.POST['origem'] == 'ordem':
+ return reverse('sapl.sessao:ordemdia_list',
+ kwargs={'pk': self.kwargs['pk']})
+ else:
+ return reverse('sapl.sessao:expedientemateria_list',
+ kwargs={'pk': self.kwargs['pk']})
+
+ def form_invalid(self, form, context):
+
+ errors_tuple = [(form[e].label, form.errors[e])
+ for e in form.errors if e in form.fields]
+ error_message = ''
+ for e in errors_tuple:
+ error_message += '%s : %s ' % (e[0], e[1][0])
+ for e in form.non_field_errors():
+ error_message += '%s ' % e
+ error_message += ' '
+
+ messages.add_message(self.request, messages.ERROR, error_message)
+
+ if self.request.POST['origem'] == 'ordem':
+ ordens = OrdemDia.objects.filter(
+ id__in=self.request.POST.getlist('ordens'))
+ presentes = PresencaOrdemDia.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk'])
+ context.update({'ordens': ordens})
+ elif self.request.POST['origem'] == 'expediente':
+ expedientes = ExpedienteMateria.objects.filter(
+ id__in=self.request.POST.getlist('expedientes'))
+ presentes = SessaoPlenariaPresenca.objects.filter(
+ sessao_plenaria_id=self.kwargs['pk'])
+ context.update({'expedientes': expedientes})
+
+ total_presentes = presentes.count()
+ context.update({'parlamentares': self.get_parlamentares(),
+ 'total_presentes': total_presentes,
+ 'resultado_votacao': TipoResultadoVotacao.objects.all(),
+ 'form': form,
+ 'origem': self.request.POST['origem']})
+
+ return self.render_to_response(context)
+
+
class RetiradaPautaCrud(MasterDetailCrud):
model = RetiradaPauta
public = [RP_LIST, RP_DETAIL, ]
parent_field = 'sessao_plenaria'
class BaseMixin(MasterDetailCrud.BaseMixin):
- list_field_names = ['tipo_de_retirada', 'materia', 'observacao', 'parlamentar']
+ list_field_names = ['tipo_de_retirada',
+ 'materia', 'observacao', 'parlamentar']
class ListView(MasterDetailCrud.ListView):
paginate_by = 10
@@ -3269,7 +3789,8 @@ class RetiradaPautaCrud(MasterDetailCrud):
layout_key = None
def get_initial(self):
- sessao_plenaria = RetiradaPauta.objects.get(id=self.kwargs['pk']).sessao_plenaria
+ sessao_plenaria = RetiradaPauta.objects.get(
+ id=self.kwargs['pk']).sessao_plenaria
return {'sessao_plenaria': sessao_plenaria}
class DeleteView(MasterDetailCrud.DeleteView):
diff --git a/sapl/static/styles/app.css b/sapl/static/styles/app.css
new file mode 100644
index 000000000..3561a3e06
--- /dev/null
+++ b/sapl/static/styles/app.css
@@ -0,0 +1,503 @@
+.container-home {
+ position: relative;
+ padding: 2em 1.5em 1.5em 1.5em;
+ max-width: 1000px;
+ margin: 0 auto; }
+ .container-home a:hover {
+ color: #444;
+ -webkit-transition: 0.3s ease-in;
+ -moz-transition: 0.3s ease-in;
+ -o-transition: 0.3s ease-in; }
+ .container-home #homeIndex {
+ text-align: center; }
+ .container-home .homeBanner span {
+ color: white;
+ font-size: 32px;
+ font-weight: 600;
+ display: inline-block;
+ vertical-align: middle;
+ padding: 2px 45px 4px;
+ border: 2px solid; }
+ .container-home .homeBanner::after {
+ display: inline-block;
+ vertical-align: middle;
+ height: 100%; }
+ .container-home .homeBlock {
+ display: inline-block;
+ position: relative;
+ background-color: #F3F3F3;
+ width: 190px;
+ height: 260px;
+ margin: 3px;
+ text-align: center;
+ font-size: 0;
+ overflow: hidden; }
+ .container-home .homeBlock > a {
+ display: block;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0; }
+ .container-home .homeBlock::after {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 100%;
+ overflow: visible;
+ clear: none;
+ visibility: initial; }
+ .container-home .homeContent {
+ position: relative;
+ padding: 10px;
+ text-align: justify;
+ font-size: 14px;
+ color: #FFF;
+ opacity: 0;
+ transition: opacity 0.5s ease;
+ display: inline-block;
+ vertical-align: middle; }
+ .container-home .homeContent p {
+ display: block;
+ line-height: 13px;
+ font-size: 80%;
+ color: white; }
+ .container-home .homeIcon {
+ position: relative;
+ display: inline-block;
+ width: 105px;
+ height: 105px;
+ border-radius: 50%;
+ background: #364347;
+ z-index: 1; }
+ .container-home .homeIcon::before {
+ content: '';
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ background: #364347;
+ top: 0;
+ left: 0;
+ transform: scale(0.95);
+ transition: transform 0.6s ease; }
+ .container-home .homeIcon img {
+ position: absolute;
+ margin: auto;
+ top: 0;
+ bottom: 0;
+ right: 0;
+ left: 0;
+ transition: opacity 0.4s 0.4s ease; }
+ .container-home .homeFront {
+ position: absolute;
+ top: 46%;
+ width: 100%;
+ font-size: 0;
+ transform: translateY(-60%); }
+ .container-home .homeFront h2 {
+ position: absolute;
+ margin-top: 18px;
+ font-size: 22px;
+ font-weight: 700;
+ color: #595959 !important;
+ width: 100%;
+ padding: 0 6%;
+ z-index: 0; }
+ .container-home .homeTitle {
+ display: block;
+ height: 32px;
+ text-align: center;
+ width: 100%;
+ opacity: 0;
+ transition: opacity 0.4s ease; }
+ .container-home .homeTitle::before {
+ content: '';
+ display: inline-block;
+ vertical-align: middle;
+ height: 100%; }
+ .container-home .homeTitle h2 {
+ display: inline-block;
+ vertical-align: middle;
+ max-width: 110px;
+ font-size: 14px;
+ color: white !important;
+ line-height: 1em; }
+ .container-home .homeTitle img {
+ display: inline-block;
+ vertical-align: middle;
+ height: 30px;
+ margin-right: 5px; }
+ .container-home .homeBlock:hover .homeIcon::before {
+ transform: scale(3.6) translateY(7px); }
+ .container-home .homeBlock:hover .homeContent {
+ opacity: 1;
+ transition-delay: 0.2s; }
+ .container-home .homeBlock:hover .homeIcon img {
+ opacity: 0;
+ transition-duration: 0.2s;
+ transition-delay: 0s; }
+ .container-home .homeBlock:hover .homeTitle {
+ opacity: 1; }
+
+html {
+ position: relative;
+ min-height: 100%; }
+
+body {
+ margin-bottom: 160px; }
+
+h1, h2, h3, h4, h5, h6, form, dl, dt, dd, p, div, img, a {
+ margin: 0;
+ padding: 0; }
+
+h1, .h1 {
+ font-size: 30px; }
+
+h2, .h2 {
+ font-size: 24px; }
+
+h3, .h3 {
+ font-size: 20px; }
+
+h4, .h4 {
+ font-size: 16px; }
+
+h5, .h5 {
+ font-size: 14px; }
+
+h6, .h6 {
+ font-size: 12px; }
+
+p {
+ margin: 0.5em 0; }
+ p .control-label {
+ font-weight: bold; }
+
+label {
+ margin-bottom: 0;
+ line-height: 1; }
+
+fieldset fieldset {
+ font-size: 95%; }
+ fieldset fieldset legend {
+ font-size: 18px; }
+
+.page-header {
+ margin: 20px 0px 10px; }
+
+.caret.top {
+ transform: rotate(180deg); }
+
+.btn:hover, .btn:focus {
+ color: inherit; }
+
+.btn-default.btn-excluir {
+ color: #d9534f; }
+ .btn-default.btn-excluir:hover {
+ color: #fff;
+ border-color: #de6764;
+ background-color: #de6764; }
+
+.btn-cancel-iframe {
+ position: relative;
+ text-align: right;
+ opacity: 0.5; }
+ .btn-cancel-iframe:hover {
+ opacity: 1; }
+ .btn-cancel-iframe a {
+ padding: 10px;
+ display: inline-block; }
+
+.legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+ clear: both; }
+
+.grid-gutter-width-right {
+ margin-right: 15px; }
+
+.controls-file {
+ padding: 10px;
+ border: 1px solid #d6e1e5;
+ border-radius: 4px; }
+ .controls-file label.checkbox-inline {
+ margin: 0px;
+ display: block; }
+
+.help-block-danger {
+ margin: 15px;
+ padding: 15px;
+ border: 2px dashed #f00; }
+
+.control-label {
+ margin: 0; }
+
+.form-control-static {
+ padding-top: 0;
+ min-height: auto; }
+ .form-control-static img {
+ max-width: 100%; }
+
+.pagination {
+ padding-top: 25px; }
+
+.modal .alert {
+ margin-bottom: 0; }
+
+.avatar-parlamentar {
+ height: 128px;
+ width: 128px;
+ margin: 0 auto;
+ display: table; }
+
+.masthead {
+ padding: 10px; }
+ .masthead .nav {
+ clear: both; }
+ .masthead .navbar-brand {
+ padding: 0px;
+ color: inherit;
+ font-size: 24px; }
+ .masthead .navbar-brand img.img-responsive {
+ height: 95px;
+ margin-right: 15px;
+ display: inline-block; }
+ .masthead .navbar-brand small {
+ color: #93A4AA;
+ font-size: 75%;
+ line-height: 25px; }
+ .masthead .navbar-brand .vcenter {
+ display: inline-block;
+ vertical-align: middle;
+ float: none;
+ padding: 10px; }
+
+nav.navbar {
+ margin-bottom: 0;
+ border-radius: 0;
+ font-size: 15px; }
+
+nav .navbar-nav > li > a {
+ padding-top: 0px;
+ padding-bottom: 0px;
+ line-height: 75px; }
+ nav .navbar-nav > li > a:hover {
+ background-color: #23527c; }
+
+nav .navbar-nav > li:nth-child(2) > .dropdown-menu {
+ right: auto; }
+
+nav .navbar-nav:last-child > li:last-child a {
+ padding-right: 0px; }
+
+.controls-radio-checkbox {
+ padding: 0px;
+ border: 1px solid #d6e1e5;
+ border-radius: 4px;
+ min-height: 20px; }
+ .controls-radio-checkbox .checkbox, .controls-radio-checkbox .radio, .controls-radio-checkbox .checkbox-inline, .controls-radio-checkbox .radio-inline {
+ padding: 8px 8px 8px 36px;
+ margin: 0;
+ line-height: 1.6;
+ display: block; }
+ .controls-radio-checkbox .checkbox:hover, .controls-radio-checkbox .radio:hover, .controls-radio-checkbox .checkbox-inline:hover, .controls-radio-checkbox .radio-inline:hover {
+ background-color: #d6e1e5; }
+ .controls-radio-checkbox .checkbox .icons, .controls-radio-checkbox .radio .icons, .controls-radio-checkbox .checkbox-inline .icons, .controls-radio-checkbox .radio-inline .icons {
+ top: auto;
+ left: 8px; }
+ .controls-radio-checkbox .checkbox-inline, .controls-radio-checkbox .radio-inline {
+ display: inline-block; }
+ .controls-radio-checkbox .help-block {
+ margin: 15px;
+ padding: 15px;
+ border: 2px dashed #d6e1e5; }
+
+.controls-radio-checkbox__old {
+ padding: 0px;
+ border: 1px solid #d6e1e5;
+ border-radius: 4px;
+ min-height: 20px; }
+ .controls-radio-checkbox__old label {
+ padding: 0;
+ line-height: 2.7;
+ padding-left: 36px; }
+ .controls-radio-checkbox__old label .icons {
+ top: 8px;
+ left: 8px; }
+ .controls-radio-checkbox__old label.checkbox-inline, .controls-radio-checkbox__old label.radio-inline {
+ padding-right: 8px; }
+ .controls-radio-checkbox__old label.checkbox-inline .icons, .controls-radio-checkbox__old label.radio-inline .icons {
+ top: 8px;
+ left: 8px; }
+ .controls-radio-checkbox__old .checkbox, .controls-radio-checkbox__old .radio, .controls-radio-checkbox__old .checkbox-inline, .controls-radio-checkbox__old .radio-inline {
+ margin: 0; }
+ .controls-radio-checkbox__old .checkbox:hover, .controls-radio-checkbox__old .radio:hover, .controls-radio-checkbox__old .checkbox-inline:hover, .controls-radio-checkbox__old .radio-inline:hover {
+ background-color: #d6e1e5; }
+
+.manual, .manual ul {
+ padding-left: 1.5em;
+ list-style-type: none;
+ margin-top: 0;
+ font-size: 100%; }
+
+.manual li {
+ display: list-item;
+ line-height: 1.5em;
+ padding-right: 0; }
+ .manual li a {
+ background-color: transparent;
+ border: none;
+ border-radius: none;
+ padding: 0; }
+
+.container-tabaux .sidebar-tabaux {
+ background: #fafafa;
+ margin-top: -70px;
+ padding: 10px;
+ border: 1px solid #eee; }
+ .container-tabaux .sidebar-tabaux .navbar-right {
+ margin: 0; }
+ .container-tabaux .sidebar-tabaux .nav-pills > li + li {
+ margin-left: 0px; }
+ .container-tabaux .sidebar-tabaux li {
+ width: 100%; }
+ .container-tabaux .sidebar-tabaux span {
+ display: none; }
+ .container-tabaux .sidebar-tabaux .dropdown-menu {
+ padding: 0px;
+ right: 10px;
+ margin-top: -5px;
+ overflow: hidden; }
+ .container-tabaux .sidebar-tabaux .dropdown-menu a {
+ border: 0px; }
+
+.container-tabaux ul {
+ list-style: none;
+ padding: 0; }
+
+.container-tabaux .list {
+ font-family: "SourceSansProSemiBold", Helvetica, Arial, sans-serif;
+ font-size: 0px;
+ display: table;
+ width: 100%;
+ margin: 0; }
+ .container-tabaux .list ul {
+ display: table;
+ width: 100%;
+ margin: 0; }
+ .container-tabaux .list li {
+ width: calc(50%);
+ display: inline-block;
+ position: relative; }
+ .container-tabaux .list > li {
+ width: 100%;
+ border-bottom: 1px solid #eee;
+ padding-bottom: 20px;
+ margin-bottom: 20px; }
+ .container-tabaux .list .head_title {
+ color: #364347;
+ font-size: 2.4rem;
+ text-transform: none; }
+ .container-tabaux .list a span {
+ display: none; }
+
+#styleparlamentar {
+ border: 0px solid #d6e1e5;
+ border-top-color: #d6e1e5;
+ border-right-color: #d6e1e5;
+ border-bottom-color: #d6e1e5;
+ border-left-color: #d6e1e5;
+ border-image-source: initial;
+ border-image-slice: initial;
+ border-image-repeat: initial;
+ font-size: 16px;
+ line-height: 1.467;
+ padding: 7px 12px;
+ height: 40px;
+ -webkit-appearance: none;
+ border-radius: 4px;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ margin-left: 1.0em; }
+
+.footer {
+ background: #364347;
+ color: white;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ bottom: 0px; }
+ .footer p {
+ color: white;
+ margin-top: 10px; }
+ .footer .container {
+ padding-top: 25px; }
+
+@media (max-width: 1199px) {
+ nav .container {
+ width: auto !important; }
+ .navbar-nav > li > a {
+ padding-left: 10.71429px;
+ padding-right: 10.71429px; } }
+
+@media (max-width: 1091px) {
+ .container {
+ width: auto; }
+ .navbar-nav > li > a {
+ padding-left: 7.5px;
+ padding-right: 7.5px; }
+ .masthead .navbar-brand {
+ font-size: 22px; }
+ .masthead .navbar-brand img.img-responsive {
+ height: 60px;
+ margin-right: 7.5px; } }
+
+@media (max-width: 991px) {
+ body {
+ margin: 0; }
+ .footer {
+ position: relative; }
+ .caret {
+ margin-left: 1px; }
+ .navbar-nav > li > a {
+ padding-left: 4px;
+ padding-right: 4px; } }
+
+@media (max-width: 767px) {
+ nav .navbar-nav > li > a {
+ line-height: 2.5; }
+ nav .navbar-right {
+ position: absolute;
+ top: 0;
+ margin: 10px; }
+ nav .navbar-right > li {
+ vertical-align: top;
+ display: inline-block; }
+ nav .navbar-right > li a {
+ padding-left: 10px;
+ padding-right: 10px; }
+ nav .navbar-right .pesquisa.open ul {
+ position: absolute; }
+ nav .navbar-right .navbar-form {
+ margin: 8px 0; }
+ .table {
+ width: auto;
+ white-space: normal;
+ display: block;
+ overflow-x: auto; } }
+
+@media (min-width: 1092px) and (max-width: 1199px) {
+ .container {
+ width: 1070px; } }
+
+@media print {
+ a[href]:after {
+ content: none !important; } }
diff --git a/sapl/static/styles/compilacao.css b/sapl/static/styles/compilacao.css
new file mode 100644
index 000000000..557ef057a
--- /dev/null
+++ b/sapl/static/styles/compilacao.css
@@ -0,0 +1,1136 @@
+a:link:after, a:visited:after {
+ content: ""; }
+
+.test_import:nth-child(even) {
+ background-color: #ccc; }
+
+#wait_message {
+ display: block;
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background-color: rgba(220, 220, 220, 0.75);
+ z-index: 99; }
+ #wait_message #msg {
+ position: relative;
+ margin: 20% auto;
+ padding: 1.2em 2em;
+ max-width: 600px;
+ text-align: center;
+ font-size: 1.5em;
+ color: #677;
+ border: 1px solid #eee;
+ background-color: #fff !important;
+ box-shadow: 0 1px 2px #999; }
+
+.text-center {
+ text-align: center; }
+
+.cp-notify {
+ z-index: 9999;
+ position: fixed;
+ top: 2em;
+ left: 50%;
+ min-width: 600px;
+ transform: translate(-50%, 0);
+ transition: all 0.4s ease;
+ opacity: 0.97; }
+ .cp-notify.hide {
+ opacity: 0;
+ top: -1000px;
+ display: block !important;
+ transition: all 0.4s ease; }
+ .cp-notify .message {
+ padding: 1em;
+ border: 2px solid rgba(0, 0, 0, 0.1);
+ border-radius: 4px;
+ color: rgba(0, 0, 0, 0.6);
+ line-height: 1em;
+ font-size: 1.3em;
+ text-align: center;
+ box-shadow: 0 0 100px rgba(0, 0, 0, 0.2); }
+
+.cp {
+ /* and dpt */ }
+ .cp .desativado .dtxt, .cp .dpt .dptt > a.desativado .dtxt, .cp .desativado .dtxt *, .cp .dpt .dptt > a.desativado .dtxt *, .cp .desativado .dpt-link, .cp .dpt .dptt > a.desativado .dpt-link, .cp .desativado .dpt-link *, .cp .dpt .dptt > a.desativado .dpt-link * {
+ text-decoration: line-through;
+ color: #999 !important; }
+ .cp .desativado .dtxt table, .cp .dpt .dptt > a.desativado .dtxt table, .cp .desativado .dtxt table td, .cp .dpt .dptt > a.desativado .dtxt table td, .cp .desativado .dtxt * table, .cp .dpt .dptt > a.desativado .dtxt * table, .cp .desativado .dtxt * table td, .cp .dpt .dptt > a.desativado .dtxt * table td, .cp .desativado .dpt-link table, .cp .dpt .dptt > a.desativado .dpt-link table, .cp .desativado .dpt-link table td, .cp .dpt .dptt > a.desativado .dpt-link table td, .cp .desativado .dpt-link * table, .cp .dpt .dptt > a.desativado .dpt-link * table, .cp .desativado .dpt-link * table td, .cp .dpt .dptt > a.desativado .dpt-link * table td {
+ border: 1px dotted #ccc; }
+ .cp a {
+ text-decoration: none;
+ cursor: pointer; }
+ .cp .diff .desativado, .cp .diff .dpt .dptt > a.desativado, .cp .dpt .diff .dptt > a.desativado, .cp .diff .desativado *, .cp .diff .dpt .dptt > a.desativado *, .cp .dpt .diff .dptt > a.desativado * {
+ text-decoration: line-through;
+ color: #ddd !important;
+ font-size: 90%; }
+ .cp .diff .added {
+ color: #04DE2C; }
+ .cp .dpt {
+ font-size: 1em;
+ position: relative; }
+ .cp .dpt.indent {
+ padding-left: 1em; }
+ .cp .dpt .ementa {
+ padding: 2em 0em 2em 35%;
+ font-weight: bold; }
+ .cp .dpt .titulo_generico, .cp .dpt .anexo, .cp .dpt .disp_preliminares, .cp .dpt .disp_gerais, .cp .dpt .disp_transitorias, .cp .dpt .disp_finais, .cp .dpt .parte, .cp .dpt .livro, .cp .dpt .titulo, .cp .dpt .capitulo, .cp .dpt .secao, .cp .dpt .subsecao, .cp .dpt .itemsecao {
+ text-align: center;
+ margin-bottom: 1em;
+ font-size: 1.15em;
+ margin-top: 3em; }
+ .cp .dpt .titulo {
+ margin-top: 2em; }
+ .cp .dpt .capitulo {
+ margin-top: 1.5em;
+ font-size: 1.15em; }
+ .cp .dpt .secao {
+ margin-top: 1.2em;
+ margin-bottom: 0.7em;
+ font-weight: bold;
+ font-size: 1.15em; }
+ .cp .dpt .subsecao,
+ .cp .dpt .itemsecao {
+ margin-top: 1em;
+ margin-bottom: 0.6em;
+ font-weight: bold;
+ font-size: 1.15em; }
+ .cp .dpt .artigo {
+ font-size: 1.15em;
+ float: left; }
+ .cp .dpt .artigo .dptt {
+ position: relative; }
+ .cp .dpt .caput {
+ margin-top: 0.3333em;
+ font-size: 1.15em; }
+ .cp .dpt .paragrafo {
+ font-size: 1.1em;
+ margin-top: 0.2222em; }
+ .cp .dpt .inciso {
+ font-size: 1.1em;
+ margin-top: 0.1667em; }
+ .cp .dpt .alinea {
+ font-size: 1.0em;
+ margin-top: 2px; }
+ .cp .dpt .item {
+ font-size: 1.0em;
+ margin-top: 2px; }
+ .cp .dpt .assinatura {
+ margin-top: 0.6em;
+ font-size: 1.15em; }
+ .cp .dpt .fecho_lei {
+ margin-top: 0.6em;
+ font-size: 1.15em; }
+ .cp .dpt .page-break {
+ page-break-before: always; }
+ .cp .dpt .bloco_alteracao {
+ padding-left: 10%;
+ font-style: italic;
+ color: #018; }
+ .cp .dpt .bloco_alteracao a {
+ text-decoration: underline; }
+ .cp .dpt .bloco_alteracao a, .cp .dpt .bloco_alteracao table, .cp .dpt .bloco_alteracao table td {
+ color: #018 !important; }
+ .cp .dpt .dn {
+ /* Notas de Dispositivo*/
+ font-weight: normal;
+ position: relative;
+ font-size: 70%; }
+ .cp .dpt .dn p, .cp .dpt .dn ul {
+ font-weight: normal;
+ margin: 0 0 0 0;
+ list-style: none;
+ padding: 0; }
+ .cp .dpt .dn .dnl {
+ /* Lista Notas de Dispositivo*/
+ display: block;
+ text-align: left !important; }
+ .cp .dpt .dn .dnl * {
+ display: inline; }
+ .cp .dpt .dn .dnl .bullet {
+ padding: 0 0.333em;
+ display: inline-block; }
+ .cp .dpt .dn .dnl .dnli {
+ min-height: 2.5em; }
+ .cp .dpt .dn .dnl .dnli:hover ul {
+ transition: opacity 0.5s linear, clip 0s 0.3s;
+ clip: auto;
+ opacity: 1;
+ background: rgba(230, 230, 230, 0.9); }
+ .cp .dpt .dn .dnl .dnli ul {
+ transition: opacity 0.5s linear, clip 0s 0.3s;
+ clip: rect(0, 0, 0, 0);
+ opacity: 0;
+ position: absolute;
+ background: transparent;
+ right: 0;
+ padding: 0.2em 0.5em 0em 0.5em;
+ border: 1px solid #c7e3d3;
+ border-top: 0px;
+ font-size: 1.5rem; }
+ .cp .dpt .dn .dnl .dnli ul li {
+ display: table-cell;
+ color: #aaa; }
+ .cp .dpt .dn .dnl .dnli ul li:hover {
+ color: #787; }
+ .cp .dpt .dn .dnl .dnli ul li:hover a {
+ color: #27AE60 !important; }
+ .cp .dpt .dn .dnl .dnli ul li .nowner {
+ color: #27AE60 !important; }
+ .cp .dpt .dn .dnl .dnli .ntitulo {
+ font-weight: bold;
+ color: #03A203;
+ text-decoration: none; }
+ .cp .dpt .dn .dnl .dnli .ntitulo a {
+ color: #294 !important; }
+ .cp .dpt .dn .dnl .dnli .ntexto {
+ color: #06D806; }
+ .cp .dpt .dn .dnl .dnli .ntexto a {
+ color: #03A203 !important; }
+ .cp .dpt .dn .dnl:hover {
+ display: block; }
+ .cp .dpt .dn .dnl:hover * {
+ display: block; }
+ .cp .dpt .dn .dnl:hover > .bullet {
+ display: none; }
+ .cp .dpt .dn .dnl:hover .dnli {
+ margin-top: 0.5em;
+ border-top: 1px solid #c7e3d3; }
+ .cp .dpt .dptt {
+ clear: left; }
+ .cp .dpt .dptt > a {
+ color: #000000; }
+ .cp .dpt .dptt > a.nota-alteracao {
+ color: #02baf2;
+ font-size: 0.75em; }
+ .cp .dpt .dptt > a.nota-alteracao:hover {
+ text-decoration: underline; }
+ .cp .dpt .dptt .dne {
+ position: absolute;
+ display: block;
+ right: 0;
+ left: 0;
+ top: 0;
+ height: 0;
+ transform: scaleX(0);
+ transform-origin: right;
+ transition: all 0.3s ease;
+ border-top: 1px solid #2980B9; }
+ .cp .dpt .dptt .dne ul.btns-action {
+ list-style: none;
+ padding: 0;
+ position: absolute;
+ right: 0;
+ background-color: #2980B9; }
+ .cp .dpt .dptt .dne ul.btns-action li {
+ float: left; }
+ .cp .dpt .dptt .dne ul.btns-action li:hover {
+ background-color: rgba(0, 0, 0, 0.1); }
+ .cp .dpt .dptt .dne ul.btns-action li a {
+ color: white;
+ padding: 0.15em 1em 0;
+ display: inline-block; }
+ .cp .dpt .dptt .dne-nota {
+ position: relative;
+ transform: scaleX(1);
+ height: auto;
+ border-top: 0px; }
+ .cp .dpt .dptt .dne-nota ul.btns-action {
+ display: none; }
+ .cp .dpt .dptt .dne-nota .dne-form {
+ margin: 1em -2em 0em;
+ text-align: left;
+ font-size: 1.6rem; }
+ .cp .dpt .dptt:hover .dne {
+ height: 0.1667rem;
+ transform: scaleX(1);
+ transition-delay: 1s; }
+ .cp .dpt .dptt:hover .dne-nota {
+ height: auto;
+ transition-delay: 0s; }
+ .cp .tipo-vigencias {
+ list-style: none;
+ position: fixed;
+ bottom: 0px;
+ left: 50%;
+ transform: translate(-50%, 0);
+ margin: 0;
+ padding: 0;
+ background-color: #2980B9;
+ z-index: 1000;
+ opacity: 0.9;
+ transition: all 0.3s ease-in-out; }
+ .cp .tipo-vigencias li {
+ display: inline-block;
+ border-left: 1px solid #fff;
+ float: left; }
+ .cp .tipo-vigencias li a {
+ color: white;
+ padding: 0.3em 1em 0;
+ display: inline-block;
+ font-size: 110%;
+ cursor: pointer; }
+ .cp .tipo-vigencias li a.selected {
+ background-color: rgba(0, 0, 0, 0.5); }
+ .cp .tipo-vigencias li:hover {
+ background-color: rgba(0, 0, 0, 0.2); }
+ .cp .tipo-vigencias:hover {
+ opacity: 1; }
+
+/* end cp */
+.cp.cpe {
+ /* fim .dpt */
+ /* fim dpt-alts */ }
+ .cp.cpe .desativado, .cp.cpe .dpt .dptt > a.desativado {
+ text-decoration: line-through;
+ color: #999 !important; }
+ .cp.cpe .desativado table, .cp.cpe .dpt .dptt > a.desativado table, .cp.cpe .desativado table td, .cp.cpe .dpt .dptt > a.desativado table td {
+ border: 1px dotted #ccc; }
+ .cp.cpe .desativado a.nota-alteracao * {
+ color: #02baf2 !important; }
+ .cp.cpe .dpt {
+ display: block; }
+ .cp.cpe .dpt > .dpt-actions-fixed {
+ position: absolute;
+ right: -0.8em;
+ top: -0.8em;
+ z-index: 3;
+ opacity: 0; }
+ .cp.cpe .dpt > .dpt-actions-fixed .activate {
+ display: none; }
+ .cp.cpe .dpt > .dpt-actions-fixed .deactivate {
+ display: inline; }
+ .cp.cpe .dpt > .dpt-actions-fixed .btn-dpt-edit.btn-default {
+ color: #333; }
+ .cp.cpe .dpt > .dpt-actions-fixed .btn-dpt-edit.btn-default:hover {
+ color: #fff;
+ background-color: #02baf2; }
+ .cp.cpe .dpt > .dpt-actions, .cp.cpe .dpt > .dpt-actions-bottom {
+ display: none; }
+ .cp.cpe .dpt > .dpt-text {
+ cursor: text;
+ min-height: 30px;
+ border: 1px solid transparent; }
+ .cp.cpe .dpt > .dpt-text:hover, .cp.cpe .dpt > .dpt-text.hover-fixed {
+ background-color: rgba(0, 0, 0, 0.01);
+ color: #2980B9;
+ border: 1px solid #eee;
+ transition: color 0.3s ease; }
+ .cp.cpe .dpt > .dpt-text.artigo {
+ float: none; }
+ .cp.cpe .dpt > .dpt-text a.link-rotulo {
+ color: #000; }
+ .cp.cpe .dpt:hover > .dpt-actions-fixed {
+ opacity: 1; }
+ .cp.cpe .dpt:hover > .dpt-actions-fixed:hover ~ .dpt-text {
+ background-color: rgba(0, 0, 0, 0.01);
+ color: #2980B9;
+ border: 1px solid #eee;
+ transition: color 0.3s ease; }
+ .cp.cpe .dpt .semtexto {
+ font-weight: bold;
+ color: #9aaed6; }
+ .cp.cpe .dpt .semtexto:hover {
+ color: #5f76a4; }
+ .cp.cpe .dpt-alts {
+ margin: 0;
+ margin-bottom: 1em;
+ padding: 0;
+ background-color: transparent;
+ min-height: 100px;
+ border: 2px dashed #fff; }
+ .cp.cpe .dpt-alts:hover {
+ border-color: #d9ddde; }
+ .cp.cpe .dpt-alts:empty {
+ border-color: #ddd; }
+ .cp.cpe .dpt-alts.drag {
+ width: 100% !important;
+ border-color: #d9ddde; }
+ .cp.cpe .dpt-alts.drag .dpt {
+ transition-duration: 0s !important; }
+ .cp.cpe .dpt-alts .dpt {
+ width: 100% !important;
+ box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24);
+ padding: 0;
+ margin: 0;
+ background-color: #edf0f1;
+ height: auto !important;
+ min-height: 2em;
+ z-index: 1; }
+ .cp.cpe .dpt-alts .dpt:not(:first-child) {
+ border-top: 1px solid white; }
+ .cp.cpe .dpt-alts .dpt > .dpt-text {
+ padding: 0.3em 1em;
+ margin-top: 0;
+ margin-bottom: 0; }
+ .cp.cpe .dpt-alts .dpt > .dpt-text a.link-rotulo {
+ text-decoration: underline; }
+ .cp.cpe .dpt-alts .dpt-selected.dpt {
+ margin: 0em -0.5em; }
+ .cp.cpe .dpt-selected.dpt {
+ width: auto !important;
+ margin: 1em -0.5em;
+ border: 1px solid #fad46b !important;
+ padding: 0;
+ background-color: #fafafa;
+ border-radius: 3px;
+ z-index: 4; }
+ .cp.cpe .dpt-selected.dpt > .dpt-text {
+ border: 1px solid transparent; }
+ .cp.cpe .dpt-selected.dpt > .dpt-text:hover {
+ border: 1px solid transparent;
+ background-color: transparent; }
+ .cp.cpe .dpt-selected.dpt > .dpt-form {
+ margin-bottom: 0em; }
+ .cp.cpe .dpt-selected.dpt > .dpt-actions, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom {
+ display: table;
+ background-color: #e5e5e5;
+ padding: 1em;
+ margin-bottom: 0em;
+ width: 100%; }
+ .cp.cpe .dpt-selected.dpt > .dpt-actions > .btn-action, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom > .btn-action {
+ display: table-cell;
+ float: none; }
+ .cp.cpe .dpt-selected.dpt > .dpt-actions .btn-excluir, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .btn-excluir, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar {
+ display: inline-block;
+ opacity: 0.3; }
+ .cp.cpe .dpt-selected.dpt > .dpt-actions .btn-excluir:hover, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar:hover, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar:hover, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .btn-excluir:hover, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar:hover, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar:hover {
+ opacity: 1; }
+ .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom {
+ margin: 0; }
+ .cp.cpe .dpt-selected .dpt-block {
+ border-top: 1px solid #e5e5e5 !important;
+ opacity: 0.6;
+ transition: opacity 0.4s ease; }
+ .cp.cpe .dpt-selected .dpt-block:hover {
+ opacity: 1; }
+ .cp.cpe .dpt-selected .dpt:only-child {
+ /*border-bottom: 1px solid #e5e5e5 !important;*/ }
+ .cp.cpe .dpt-selected .dpt:not(:last-child) {
+ /*border-bottom: 1px solid #e5e5e5 !important;*/ }
+ .cp.cpe .dpt-selected .dpt-text {
+ opacity: 0.7;
+ margin: 0;
+ padding: 0.7em; }
+ .cp.cpe .dpt-selected .dpt-text:hover {
+ opacity: 1;
+ background-color: #f5f5f5; }
+ .cp.cpe .dpt-selected .dpt-alts {
+ margin: 1em; }
+ .cp.cpe .dpt-selected .dpt-alts .dpt {
+ box-shadow: 0 0 0; }
+ .cp.cpe .dpt-selected > .dpt-actions-fixed {
+ opacity: 1;
+ top: -12px;
+ right: 0.5em; }
+ .cp.cpe .dpt-selected > .dpt-actions-fixed .activate {
+ display: inline; }
+ .cp.cpe .dpt-selected > .dpt-actions-fixed .deactivate {
+ display: none; }
+ .cp.cpe .dpt-selected > .dpt-actions-fixed .btn-dpt-edit {
+ padding-top: 2px;
+ padding-bottom: 1px; }
+ .cp.cpe .dpt-selected > .dpt-actions-fixed .btn-dpt-edit.btn-default {
+ background-color: #fad46b;
+ border: 1px solid #fad46b; }
+ .cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left {
+ right: auto !important;
+ left: 0;
+ padding: 2px 0; }
+ .cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left > .top.arrow {
+ right: 88%;
+ left: auto; }
+ .cp.cpe .dpt-selected .dropdown-menu li a {
+ padding-top: 2px;
+ padding-bottom: 2px; }
+ .cp.cpe .dpt-selected .btn-group .radius-right {
+ border-bottom-right-radius: 4px !important;
+ border-top-right-radius: 4px !important; }
+ .cp.cpe .dpt-selected:hover > .dpt-actions-fixed {
+ opacity: 1; }
+
+.cp.cpe1_old_apagar {
+ margin-bottom: 15em;
+ /* fim dpt */
+ /* fim dpt-selected */ }
+ .cp.cpe1_old_apagar .desativado, .cp.cpe1_old_apagar .dpt .dptt > a.desativado, .cp.cpe1_old_apagar .desativado *, .cp.cpe1_old_apagar .dpt .dptt > a.desativado * {
+ text-decoration: line-through;
+ color: #999 !important; }
+ .cp.cpe1_old_apagar .desativado table, .cp.cpe1_old_apagar .dpt .dptt > a.desativado table, .cp.cpe1_old_apagar .desativado table td, .cp.cpe1_old_apagar .dpt .dptt > a.desativado table td, .cp.cpe1_old_apagar .desativado * table, .cp.cpe1_old_apagar .dpt .dptt > a.desativado * table, .cp.cpe1_old_apagar .desativado * table td, .cp.cpe1_old_apagar .dpt .dptt > a.desativado * table td {
+ border: 1px dotted #ccc; }
+ .cp.cpe1_old_apagar a {
+ text-decoration: none;
+ cursor: pointer; }
+ .cp.cpe1_old_apagar .dpt {
+ position: relative;
+ display: block; }
+ .cp.cpe1_old_apagar .dpt .semtexto {
+ font-weight: bold;
+ color: #BFD1F6; }
+ .cp.cpe1_old_apagar .dpt .artigo {
+ float: none; }
+ .cp.cpe1_old_apagar .dpt .caput {
+ margin-top: 0; }
+ .cp.cpe1_old_apagar .dpt > .actions_right, .cp.cpe1_old_apagar .dpt-selected .csform .dpt > .actions_left {
+ color: #fff;
+ right: 0em;
+ position: absolute;
+ opacity: 0;
+ transition: all 0.4s ease-in-out;
+ z-index: 1000; }
+ .cp.cpe1_old_apagar .dpt > .actions_right a.btn-bloco, .cp.cpe1_old_apagar .dpt-selected .csform .dpt > .actions_left a.btn-bloco {
+ background-color: #3498db;
+ color: #ffffff !important;
+ padding: 8px 18px 6px;
+ display: inline-block;
+ line-height: 1;
+ float: right; }
+ .cp.cpe1_old_apagar .dpt > .actions_right a.btn-bloco:hover, .cp.cpe1_old_apagar .dpt-selected .csform .dpt > .actions_left a.btn-bloco:hover {
+ opacity: 1;
+ background-image: -webkit-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: -moz-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: -ms-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: -o-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: linear-gradient(to bottom, #1c81c4, #0b6dad); }
+ .cp.cpe1_old_apagar .dpt:hover > .actions_right, .cp.cpe1_old_apagar .dpt-selected .csform .dpt:hover > .actions_left {
+ opacity: 1; }
+ .cp.cpe1_old_apagar .dpt .bloco {
+ display: block;
+ clear: both; }
+ .cp.cpe1_old_apagar .dpt .bloco *:hover {
+ color: #27AE60; }
+ .cp.cpe1_old_apagar .dpt .bloco .de {
+ cursor: pointer; }
+ .cp.cpe1_old_apagar .dpt .articulacao {
+ border-top: 2px solid #e5e5e5;
+ margin: 2em 0; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao {
+ margin: 1em 0;
+ padding: 0em;
+ background-color: transparent;
+ min-height: 100px;
+ border: 2px dashed #fff; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao:hover {
+ border-color: #d9ddde; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao.drag {
+ width: 100% !important;
+ border-color: #d9ddde; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao.drag .dpt {
+ transition-duration: 0s !important; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt {
+ width: 100% !important;
+ box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24);
+ padding: 0.3em 1em;
+ margin: 0;
+ background-color: #edf0f1;
+ z-index: 1; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt:not(:first-child) {
+ border-top: 1px solid white; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.ui-draggable div {
+ cursor: pointer; }
+ .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.dpt-comp-selected {
+ transition: all 0.3s ease;
+ width: auto !important;
+ margin: 2em -3.7em;
+ box-shadow: 0 0 6px rgba(0, 0, 0, 0.16), 0 6px 12px rgba(0, 0, 0, 0.32); }
+ .cp.cpe1_old_apagar .dpt-selected {
+ font-size: 1em;
+ border: 0px solid #CCC;
+ margin: 1em -1.8em 1em -1.8em;
+ padding: 2.2em 2.2em 1.6em 2.2em;
+ box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23);
+ background-image: -webkit-linear-gradient(top, #eaeaee, #ddd);
+ background-image: -moz-linear-gradient(top, #eaeaee, #ddd);
+ background-image: -ms-linear-gradient(top, #eaeaee, #ddd);
+ background-image: -o-linear-gradient(top, #eaeaee, #ddd);
+ background-image: linear-gradient(to bottom, #eaeaee, #ddd);
+ /* fim csform*/ }
+ .cp.cpe1_old_apagar .dpt-selected ul {
+ list-style: none;
+ margin: 0;
+ padding: 0; }
+ .cp.cpe1_old_apagar .dpt-selected .semtexto {
+ color: #999; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco {
+ opacity: 0.5; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco:hover {
+ opacity: 1; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco a:hover {
+ background: transparent; }
+ .cp.cpe1_old_apagar .dpt-selected > .bloco {
+ opacity: 1;
+ margin: 1em; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao {
+ margin: 0;
+ padding: 1em;
+ border: 0 transparent;
+ background-image: -webkit-linear-gradient(top, #eaeaee, #ddd);
+ background-image: -moz-linear-gradient(top, #eaeaee, #ddd);
+ background-image: -ms-linear-gradient(top, #eaeaee, #ddd);
+ background-image: -o-linear-gradient(top, #eaeaee, #ddd);
+ background-image: linear-gradient(to bottom, #eaeaee, #ddd); }
+ .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao:hover {
+ border-color: transparent; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag {
+ width: 100% !important; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag .dpt {
+ transition-duration: 0s !important; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt {
+ width: auto !important;
+ transition: all 0.3s ease;
+ background-color: white; }
+ .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt:not(:first-child) {
+ border-top: 0px solid white; }
+ .cp.cpe1_old_apagar .dpt-selected > .dpt {
+ padding: 0; }
+ .cp.cpe1_old_apagar .dpt-selected > .dpt:last-child {
+ padding-bottom: 1em; }
+ .cp.cpe1_old_apagar .dpt-selected > .actions_right a.btn-bloco, .cp.cpe1_old_apagar .dpt-selected .csform .dpt-selected > .actions_left a.btn-bloco {
+ display: none; }
+ .cp.cpe1_old_apagar .dpt-selected .csform {
+ /* compilacao simple form */
+ display: block;
+ clear: both;
+ z-index: 9;
+ position: static;
+ /* actions_inserts */ }
+ .cp.cpe1_old_apagar .dpt-selected .csform .btns-action {
+ -webkit-animation: fadeIn 1s ease-in-out;
+ -moz-animation: fadeIn 1s ease-in-out;
+ -o-animation: fadeIn 1s ease-in-out;
+ opacity: 1;
+ position: absolute;
+ display: table;
+ transition: all 0.4s ease-in-out; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .btns-action a {
+ color: #16407c;
+ display: block;
+ background: transparent;
+ vertical-align: middle;
+ text-align: center;
+ font-weight: normal;
+ text-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
+ padding: 0.33em 0.4em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .btns-action > li {
+ position: relative;
+ display: table-cell;
+ vertical-align: top; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .btns-action > li:hover {
+ background-color: rgba(255, 255, 255, 0.5); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .btns-action > li:hover > a {
+ text-shadow: 0 0 5px #777;
+ color: #0a5; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .label_status {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ color: #889;
+ padding: 0.3em;
+ font-size: 80%;
+ text-align: right;
+ z-index: 15;
+ display: table; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .label_status li {
+ display: table-cell;
+ padding: 0 0.5em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents {
+ z-index: 11;
+ top: 0em;
+ left: 0em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents a {
+ padding: 0.62em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div, .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents li {
+ font-size: 80%;
+ display: table-cell;
+ vertical-align: middle;
+ border-right: 1px solid #CCC; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div {
+ padding: 0 0.4em;
+ font-stretch: condensed;
+ font-variant: small-caps;
+ font-weight: bold;
+ text-shadow: 0 0 10px #fff; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents > li:hover a {
+ color: #16407c;
+ font-weight: normal; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_top, .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom {
+ top: 0em;
+ right: 0em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_top a, .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a {
+ padding-right: 1em;
+ padding-left: 1em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_top li, .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li {
+ display: table-cell;
+ vertical-align: middle;
+ border-left: 1px solid #CCC; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom {
+ top: auto;
+ left: 0;
+ bottom: 0;
+ display: inline-block;
+ border-top: 1px solid #CCC; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a {
+ padding: 0 0.4em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li {
+ border: 0px;
+ border-right: 1px solid #CCC; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_right, .cp.cpe1_old_apagar .dpt-selected .csform .actions_left {
+ top: 2.2em;
+ right: 0em;
+ bottom: 0;
+ display: block; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_right li, .cp.cpe1_old_apagar .dpt-selected .csform .actions_left li {
+ width: 2.2em;
+ display: block;
+ border-bottom: 1px solid #CCC; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_right li:first-child, .cp.cpe1_old_apagar .dpt-selected .csform .actions_left li:first-child {
+ border-top: 1px solid #CCC; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_left {
+ right: auto;
+ left: 0em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts {
+ background: transparent;
+ position: relative;
+ z-index: 19;
+ display: table;
+ width: 100%; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li {
+ display: table-cell; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li:hover > a {
+ background-image: -webkit-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: -moz-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: -ms-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: -o-linear-gradient(top, #1c81c4, #0b6dad);
+ background-image: linear-gradient(to bottom, #1c81c4, #0b6dad); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a {
+ background-image: -webkit-linear-gradient(top, #3498DB, #2980C9);
+ background-image: -moz-linear-gradient(top, #3498DB, #2980C9);
+ background-image: -ms-linear-gradient(top, #3498DB, #2980C9);
+ background-image: -o-linear-gradient(top, #3498DB, #2980C9);
+ background-image: linear-gradient(to bottom, #3498DB, #2980C9);
+ border-right: 1px solid #fff;
+ padding: 0.2em;
+ display: block;
+ color: white;
+ text-align: center;
+ white-space: nowrap;
+ /* btn-excluir */ }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-excluir, .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar {
+ text-align: left;
+ background: #A70808;
+ color: #c99;
+ padding-left: 1.7em;
+ position: relative; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-excluir:hover, .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar:hover {
+ background-color: #c70808;
+ color: #ecc; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-excluir::before, .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before {
+ z-index: 20;
+ position: absolute;
+ background: url(/static/img/icon_delete_white.png) no-repeat 50% 50%;
+ content: "";
+ top: 0;
+ left: 0;
+ display: block;
+ color: black;
+ margin-left: 0.4em;
+ height: 100%;
+ width: 2em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar {
+ background: #1f8b4d;
+ color: white; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar:hover {
+ background: #2d9c5c;
+ color: white; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before {
+ background: url(/static/img/icon_save_white.png) no-repeat 50% 50%; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a span {
+ padding: 0 0.7em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li:last-child > a {
+ border-right: 0px solid #fff; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > ul li:nth-child(even) a {
+ background: #3385CA; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > ul li a {
+ border-right: 1px solid #fff;
+ display: block;
+ color: white;
+ background: #2980C9;
+ font-size: 80%;
+ padding: 0.23em 1em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > ul li a:hover {
+ background: #0a5ea4; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior {
+ table-layout: fixed; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul {
+ transform: translateY(30px);
+ transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s;
+ clip: rect(0, 0, 0, 0);
+ opacity: 0;
+ position: absolute;
+ margin-left: 0.5em;
+ box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23);
+ -webkit-transition-delay: 0.4s;
+ /* Safari */
+ transition-delay: 0.4s; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul li a {
+ border-right: 0px !important; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul li:first-child::before {
+ border-width: 0.375rem;
+ border-style: inset inset solid;
+ content: "";
+ display: block;
+ height: 0px;
+ width: 0px;
+ border-color: transparent transparent #3385CA;
+ position: absolute;
+ top: -0.71rem;
+ left: 0.9375rem; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul li:first-child:hover::before {
+ border-color: transparent transparent #0A5EA4; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul::after {
+ content: "";
+ position: absolute;
+ z-index: -1;
+ left: 0;
+ top: rem-calc(-25px);
+ height: rem-calc(25px);
+ width: 100%;
+ transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior:hover > ul {
+ transform: translateY(7px);
+ transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s;
+ opacity: 1;
+ clip: rect(-100px, 2000px, 2000px, -100px); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir {
+ display: block;
+ position: static; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul {
+ transform: translateY(30px);
+ transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s;
+ clip: rect(0, 0, 0, 0);
+ opacity: 0;
+ position: absolute;
+ margin-left: 0.5em;
+ box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23);
+ -webkit-transition-delay: 0.4s;
+ /* Safari */
+ transition-delay: 0.4s; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li a {
+ border-right: 0px !important; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child::before {
+ border-width: 0.375rem;
+ border-style: inset inset solid;
+ content: "";
+ display: block;
+ height: 0px;
+ width: 0px;
+ border-color: transparent transparent #3385CA;
+ position: absolute;
+ top: -0.71rem;
+ left: 0.9375rem; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child:hover::before {
+ border-color: transparent transparent #0A5EA4; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul::after {
+ content: "";
+ position: absolute;
+ z-index: -1;
+ left: 0;
+ top: rem-calc(-25px);
+ height: rem-calc(25px);
+ width: 100%;
+ transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir:hover > ul {
+ transform: translateY(7px);
+ transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s;
+ opacity: 1;
+ clip: rect(-100px, 2000px, 2000px, -100px); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul {
+ right: 0.5em; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li a {
+ background-color: #A70808; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li a:hover {
+ background: #c70808; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child::before {
+ border-color: transparent transparent #A70808;
+ right: 10%;
+ left: auto; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child:hover::before {
+ border-color: transparent transparent #c70808; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo {
+ z-index: 2000; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul {
+ transform: translateY(30px);
+ transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s;
+ clip: rect(0, 0, 0, 0);
+ opacity: 0;
+ position: absolute;
+ margin-left: 0.5em;
+ box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23);
+ -webkit-transition-delay: 0.4s;
+ /* Safari */
+ transition-delay: 0.4s; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul li a, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul li a {
+ border-right: 0px !important; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul li:first-child::before, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul li:first-child::before {
+ border-width: 0.375rem;
+ border-style: inset inset solid;
+ content: "";
+ display: block;
+ height: 0px;
+ width: 0px;
+ border-color: transparent transparent #3385CA;
+ position: absolute;
+ top: -0.71rem;
+ left: 0.9375rem; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul li:first-child:hover::before, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul li:first-child:hover::before {
+ border-color: transparent transparent #0A5EA4; }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul::after, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul::after {
+ content: "";
+ position: absolute;
+ z-index: -1;
+ left: 0;
+ top: rem-calc(-25px);
+ height: rem-calc(25px);
+ width: 100%;
+ transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li:hover > ul, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li:hover > ul {
+ transform: translateY(7px);
+ transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s;
+ opacity: 1;
+ clip: rect(-100px, 2000px, 2000px, -100px); }
+ .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li.menu_excluir > ul li:first-child::before, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li.menu_excluir > ul li:first-child::before {
+ right: auto;
+ left: 0.9375rem; }
+ .cp.cpe1_old_apagar .dpt-selected .csform textarea {
+ margin: 0;
+ resize: vertical;
+ min-height: 12.6em;
+ border: 0px;
+ font-size: 120%;
+ width: 100%; }
+ .cp.cpe1_old_apagar .dpt-selected .csform textarea:focus {
+ background: #fff; }
+ .cp.cpe1_old_apagar .dpt-selected .csform textarea::-webkit-input-placeholder {
+ color: #c70808;
+ opacity: 0.6;
+ font-size: 80%; }
+ .cp.cpe1_old_apagar .dpt-selected .csform textarea:-moz-placeholder {
+ /* Firefox 18- */
+ color: #c70808; }
+ .cp.cpe1_old_apagar .dpt-selected .csform textarea::-moz-placeholder {
+ /* Firefox 19+ */
+ color: #c70808; }
+ .cp.cpe1_old_apagar .dpt-selected .csform textarea:-ms-input-placeholder {
+ color: #c70808;
+ opacity: 0.6; }
+ .cp.cpe1_old_apagar .selected {
+ background-color: rgba(255, 255, 255, 0.5); }
+ .cp.cpe1_old_apagar .selected a:hover {
+ color: #16407c !important;
+ font-weight: normal !important; }
+
+.result-busca-dispositivo, .lista-dispositivo {
+ padding: 0 0 1em;
+ min-height: 3em; }
+ .result-busca-dispositivo ul, .lista-dispositivo ul {
+ list-style: none;
+ margin: 0;
+ padding: 1em 0 0;
+ transition: all 2s linear;
+ clear: both; }
+ .result-busca-dispositivo ul li, .lista-dispositivo ul li {
+ display: table;
+ border-collapse: separate;
+ border-bottom: 1px solid white;
+ width: 100%; }
+ .result-busca-dispositivo ul li.ta_title, .lista-dispositivo ul li.ta_title {
+ background-color: rgba(0, 0, 0, 0.15);
+ border-radius: 4px 4px 0 0;
+ width: 100%; }
+ .result-busca-dispositivo ul li:last-child .itemlabel, .lista-dispositivo ul li:last-child .itemlabel {
+ border-radius: 0 0 4px 0px;
+ margin: 0px; }
+ .result-busca-dispositivo ul li:last-child .iteminput, .lista-dispositivo ul li:last-child .iteminput {
+ border-radius: 0 0 0px 4px; }
+ .result-busca-dispositivo ul li .iteminput, .lista-dispositivo ul li .iteminput {
+ background-color: rgba(0, 0, 0, 0.1);
+ border-right: 1px solid white;
+ display: table-cell;
+ padding: 0.5em;
+ vertical-align: middle;
+ text-align: center; }
+ .result-busca-dispositivo ul li .iteminput input, .lista-dispositivo ul li .iteminput input {
+ margin: 0; }
+ .result-busca-dispositivo ul li .itemlabel, .lista-dispositivo ul li .itemlabel {
+ background-color: rgba(0, 0, 0, 0.1);
+ display: table-cell;
+ padding: 0.5em;
+ vertical-align: middle;
+ width: 100%; }
+ .result-busca-dispositivo ul li .itemlabel .artigo, .lista-dispositivo ul li .itemlabel .artigo {
+ float: none; }
+ .result-busca-dispositivo .nomenclatura_heranca, .lista-dispositivo .nomenclatura_heranca {
+ font-size: 90%;
+ color: #057dba;
+ display: inline; }
+
+.lista-dispositivo.controls-radio-checkbox {
+ border: 0px; }
+
+.label_vigencia {
+ border-top: 1px solid white;
+ display: inline-block;
+ color: #555; }
+ .label_vigencia span {
+ color: gray; }
+
+.cp-nav-parents > .dropdown-menu {
+ left: 0;
+ right: auto; }
+ .cp-nav-parents > .dropdown-menu::before {
+ content: '';
+ position: absolute;
+ top: -11px;
+ width: 100%;
+ height: 11px; }
+
+.cp-nav-parents:hover > .dropdown-menu {
+ display: block; }
+
+.table-notificacoes tbody tr td {
+ border-top: 1px solid white;
+ padding: 5px;
+ vertical-align: middle; }
+ .table-notificacoes tbody tr td ul {
+ margin: 0px;
+ /*padding: 0px;
+ list-style: none;*/ }
+ .table-notificacoes tbody tr td ul li:hover {
+ background-color: rgba(0, 0, 0, 0.1); }
+
+.btn-modal-open {
+ float: right; }
+
+.class_color_container {
+ background: #ddd !important; }
+
+.clear {
+ clear: both; }
+
+.mce-tinymce.mce-container {
+ border: 1px solid #ccc !important;
+ margin-right: 2px; }
+
+.mce-btn button:hover {
+ background-color: rgba(0, 0, 0, 0.1) !important;
+ text-shadow: 0 0 5px #fff;
+ box-shadow: 0 0 5px #777; }
+
+.mce-menu {
+ background: #eee !important; }
+
+.displaynone {
+ display: none !important; }
+
+@media only screen and (max-width: 800px) {
+ .cp .fixed {
+ z-index: 98;
+ position: relative; }
+ .cp.cpe1 .dpt-selected {
+ margin: 1em 0; }
+ .cp.cpe1 .dpt-selected .csform .actions_parents, .cp.cpe1 .dpt-selected .csform .label_status {
+ font-size: 80%;
+ position: static !important;
+ display: block !important;
+ padding: 0em;
+ height: auto !important;
+ left: 0;
+ right: auto;
+ text-align: left; }
+ .cp.cpe1 .dpt-selected .csform .actions_parents div, .cp.cpe1 .dpt-selected .csform .actions_parents li, .cp.cpe1 .dpt-selected .csform .label_status div, .cp.cpe1 .dpt-selected .csform .label_status li {
+ display: inline-block !important; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul {
+ transform: translateY(30px);
+ transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s;
+ clip: rect(0, 0, 0, 0);
+ opacity: 0;
+ position: absolute;
+ margin-left: 0.5em;
+ box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23);
+ -webkit-transition-delay: 0.4s;
+ /* Safari */
+ transition-delay: 0.4s; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul li a {
+ border-right: 0px !important; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul li:first-child::before {
+ border-width: 0.375rem;
+ border-style: inset inset solid;
+ content: "";
+ display: block;
+ height: 0px;
+ width: 0px;
+ border-color: transparent transparent #3385CA;
+ position: absolute;
+ top: -0.71rem;
+ left: 0.9375rem; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul li:first-child:hover::before {
+ border-color: transparent transparent #0A5EA4; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul::after {
+ content: "";
+ position: absolute;
+ z-index: -1;
+ left: 0;
+ top: rem-calc(-25px);
+ height: rem-calc(25px);
+ width: 100%;
+ transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li:hover > ul {
+ transform: translateY(7px);
+ transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s;
+ opacity: 1;
+ clip: rect(-100px, 2000px, 2000px, -100px); }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a span {
+ display: none; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-excluir, .cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar {
+ padding-left: 0;
+ min-width: 1em; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-excluir::before, .cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before, .cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before, .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before {
+ width: 100%;
+ margin: 0; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_in, .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_next, .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_prior {
+ position: static; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_in > ul {
+ left: 1em !important;
+ right: 1em !important;
+ margin-left: 0; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_in > ul li:first-child::before {
+ left: 37%; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_next > ul {
+ left: 0 !important;
+ right: 1em !important; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_prior > ul {
+ left: 1em !important;
+ right: 0 !important;
+ margin-left: 0;
+ margin-right: 0.5em; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_prior > ul li:first-child::before {
+ right: 42%;
+ left: auto; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.menu_excluir > ul {
+ left: 10% !important;
+ right: 0 !important;
+ margin-left: 0;
+ margin-right: 0.5em; }
+ .cp.cpe1 .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child::before {
+ right: 0;
+ left: auto; } }
+
+@media print {
+ .cp .vigencias, .toggle-topbar, .menu-icon, .button, .tipo-vigencias, .dne {
+ display: none; }
+ #btn_font_menos, #btn_font_mais {
+ display: none; }
+ .container {
+ width: 100%; } }
diff --git a/sapl/templates/auth/user_list.html b/sapl/templates/auth/user_list.html
index b24cb764e..949e544cb 100644
--- a/sapl/templates/auth/user_list.html
+++ b/sapl/templates/auth/user_list.html
@@ -29,7 +29,6 @@
{% endif %}
- Criar Usuário
+ Criar Usuário
- {% include 'paginacao.html'%}
{% endblock base_content %}
diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml
index 5e768ae4e..b86684e61 100644
--- a/sapl/templates/sessao/subnav.yaml
+++ b/sapl/templates/sessao/subnav.yaml
@@ -25,6 +25,8 @@
url: expedientemateria_list
- title: {% trans 'Oradores do Expediente' %}
url: oradorexpediente_list
+ - title: {% trans 'Votação em Bloco' %}
+ url: votacao_bloco_expediente
- title: {% trans 'Ordem do Dia' %}
children:
@@ -32,6 +34,8 @@
url: ordemdia_list
- title: {% trans 'Presença Ordem do Dia' %}
url: presencaordemdia
+ - title: {% trans 'Votação em Bloco' %}
+ url: votacao_bloco_ordemdia
- title: {% trans 'Painel Eletrônico' %}
url: painel
diff --git a/sapl/templates/sessao/votacao/nominal.html b/sapl/templates/sessao/votacao/nominal.html
index 96dd28622..27d95c7a0 100644
--- a/sapl/templates/sessao/votacao/nominal.html
+++ b/sapl/templates/sessao/votacao/nominal.html
@@ -72,46 +72,46 @@
window.history.back();
}
- function conta_votos() {
- var votos_sim = 0;
- var votos_nao = 0;
- var votos_abstencao = 0;
- var nao_votou = 0;
- $('[name=voto_parlamentar]').each(function() {
- if (($(this).is(':hidden')) == false) {
- switch ($(this).val().substring(0,4)) {
- case "Sim:":
- votos_sim = votos_sim + 1;
- break;
- case "Não:":
- votos_nao = votos_nao + 1;
- break;
- case "Abst":
- votos_abstencao = votos_abstencao + 1;
- break;
- case "Não ":
- nao_votou = nao_votou + 1;
- break;
- };
- };
- });
-
- $("#soma_votos").empty();
- $("#soma_votos").append("");
- $("#soma_votos").append("");
- $("#soma_votos").append("Abstenções: " + votos_abstencao + "
");
- $("#soma_votos").append("Ainda não votaram: " + nao_votou + "
");
- var t = setTimeout(function(){
- conta_votos()
- }, 500);
- }
- conta_votos();
-
- window.onload = conta_votos();
+ function conta_votos() {
+ var votos_sim = 0;
+ var votos_nao = 0;
+ var votos_abstencao = 0;
+ var nao_votou = 0;
+ $('[name=voto_parlamentar]').each(function() {
+ if (($(this).is(':hidden')) == false) {
+ switch ($(this).val().substring(0,4)) {
+ case "Sim:":
+ votos_sim = votos_sim + 1;
+ break;
+ case "Não:":
+ votos_nao = votos_nao + 1;
+ break;
+ case "Abst":
+ votos_abstencao = votos_abstencao + 1;
+ break;
+ case "Não ":
+ nao_votou = nao_votou + 1;
+ break;
+ };
+ };
+ });
+
+ $("#soma_votos").empty();
+ $("#soma_votos").append("");
+ $("#soma_votos").append("");
+ $("#soma_votos").append("Abstenções: " + votos_abstencao + "
");
+ $("#soma_votos").append("Ainda não votaram: " + nao_votou + "
");
+ var t = setTimeout(function(){
+ conta_votos()
+ }, 500);
+ }
+ conta_votos();
+
+ window.onload = conta_votos();
$(window).on('beforeunload', function () {
- $("input[type=submit], input[type=button]").prop("disabled", "disabled");
- });
+ $("input[type=submit], input[type=button]").prop("disabled", "disabled");
+ });
{% endblock extra_js%}
diff --git a/sapl/templates/sessao/votacao/votacao_bloco_expediente.html b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html
new file mode 100644
index 000000000..55ecdff5a
--- /dev/null
+++ b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html
@@ -0,0 +1,173 @@
+{% extends "crud/detail.html" %}
+{% load i18n crispy_forms_tags %}
+
+{% block base_content %}
+
+
+
+
+
+
+ Nenhuma matéria do expediente aberta.
+
+
+
+
+{% endblock base_content %}
+
+{% block extra_js %}
+
+
+
+{% endblock extra_js%}
diff --git a/sapl/templates/sessao/votacao/votacao_bloco_ordem.html b/sapl/templates/sessao/votacao/votacao_bloco_ordem.html
new file mode 100644
index 000000000..a2af7dbe9
--- /dev/null
+++ b/sapl/templates/sessao/votacao/votacao_bloco_ordem.html
@@ -0,0 +1,174 @@
+{% extends "crud/detail.html" %}
+{% load i18n crispy_forms_tags %}
+
+{% block base_content %}
+
+
+
+
+
+
+ Nenhuma ordem do dia aberta.
+
+
+
+
+{% endblock base_content %}
+
+{% block extra_js %}
+
+
+
+{% endblock extra_js%}
diff --git a/sapl/templates/sessao/votacao/votacao_nominal_bloco.html b/sapl/templates/sessao/votacao/votacao_nominal_bloco.html
new file mode 100644
index 000000000..3a9b74c1d
--- /dev/null
+++ b/sapl/templates/sessao/votacao/votacao_nominal_bloco.html
@@ -0,0 +1,149 @@
+{% extends "crud/detail.html" %}
+{% load i18n crispy_forms_tags%}
+
+{% block detail_content %}
+
+{% endblock detail_content %}
+
+{% block extra_js %}
+
+{% endblock extra_js%}
diff --git a/sapl/templates/sessao/votacao/votacao_simbolica_bloco.html b/sapl/templates/sessao/votacao/votacao_simbolica_bloco.html
new file mode 100644
index 000000000..be25d4d69
--- /dev/null
+++ b/sapl/templates/sessao/votacao/votacao_simbolica_bloco.html
@@ -0,0 +1,80 @@
+{% extends "crud/detail.html" %}
+{% load i18n crispy_forms_tags%}
+
+{% block detail_content %}
+
+ {% csrf_token %}
+
+
+ Votação Simbólica
+
+
+ {% if ordens %}
+ {% for o in ordens %}
+
+ Matéria: {{o.materia|safe}}
+
+ Ementa: {{o.materia.ementa|safe}}
+
+ {% endfor %}
+ {% else %}
+ {% for e in expedientes %}
+
+ Matéria: {{e.materia|safe}}
+
+ Ementa: {{e.materia.ementa|safe}}
+
+ {% endfor %}
+ {% endif %}
+ Total presentes: {{total_presentes}} (com presidente)
+
+
+
+ {% if total_presentes == 0 %}
+
+
Não existe nenhum parlamentar presente para que a votação ocorra.
+
+ Voltar
+ {% else %}
+
+
+
+
+
+ A totalização inclui o voto do Presidente?
+
+ Sim
+ Não
+
+
+
+
+ Resultado da Votação
+
+ {% for tipo in resultado_votacao %}
+ {{tipo.nome}}
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+ {% endif %}
+
+
+{% endblock detail_content %}
From c6c994c34495e8741fa0e8bb9b26fa4d3c7a49c1 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Wed, 19 Dec 2018 14:44:20 -0200
Subject: [PATCH 020/222] =?UTF-8?q?HOTFIX=20-=20definicao=20de=20valor=20d?=
=?UTF-8?q?efault=20no=20relat=C3=B3rio=20de=20normas=20por=20vig=C3=AAnci?=
=?UTF-8?q?a?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/base/forms.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index 36267dbc3..fecba4a52 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -748,6 +748,7 @@ class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet):
self.filters['ano'].label = 'Ano'
self.form.fields['ano'].required = True
self.form.fields['vigencia'] = self.vigencia
+ self.form.fields['vigencia'].initial = True
row1 = to_row([('ano', 12)])
row2 = to_row([('vigencia', 12)])
From c7db9779e0c3cb6194385740123cad465a70360a Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Thu, 20 Dec 2018 08:54:17 -0200
Subject: [PATCH 021/222] HOT-FIX coloca filter_override no novo formato
---
sapl/base/forms.py | 14 ++++++--------
sapl/templates/base/relatorios_list.html | 2 +-
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index fecba4a52..a82dcab53 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -694,15 +694,13 @@ class RelatorioNormasMesFilterSet(django_filters.FilterSet):
label='Ano da Norma',
choices=RANGE_ANOS)
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Ano')),
- 'widget': RangeWidgetOverride}
- }}
-
-
class Meta:
+ filter_overrides = {models.DateField: {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Ano')),
+ 'widget': RangeWidgetOverride}
+ }}
model = NormaJuridica
fields = ['ano']
diff --git a/sapl/templates/base/relatorios_list.html b/sapl/templates/base/relatorios_list.html
index 87f8933be..012064096 100644
--- a/sapl/templates/base/relatorios_list.html
+++ b/sapl/templates/base/relatorios_list.html
@@ -58,7 +58,7 @@
{% if estatisticas_acesso_normas %}
- Estatísticas de acesso de Normas.
+ Estatísticas de acesso de Normas
Normas por acesso.
{% endif %}
From 9bf8cc4afe40d169ebed6dade9a239ec82a419e0 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Thu, 20 Dec 2018 14:02:05 -0200
Subject: [PATCH 022/222] fix #2432 (#2434)
---
sapl/materia/views.py | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index ebce51a5d..578357721 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -2039,24 +2039,41 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
if not request.POST['data_encaminhamento']:
data_encaminhamento = None
else:
- data_encaminhamento = tz.localize(datetime.strptime(
- request.POST['data_encaminhamento'], "%d/%m/%Y"))
+ try:
+ data_encaminhamento = tz.localize(datetime.strptime(
+ request.POST['data_encaminhamento'], "%d/%m/%Y"))
+ except ValueError:
+ msg = _('Formato da data de encaminhamento incorreto.')
+ messages.add_message(request, messages.ERROR, msg)
+ return self.get(request, self.kwargs)
if request.POST['data_fim_prazo'] == '':
data_fim_prazo = None
else:
- data_fim_prazo = tz.localize(datetime.strptime(
- request.POST['data_fim_prazo'], "%d/%m/%Y"))
+ try:
+ data_fim_prazo = tz.localize(datetime.strptime(
+ request.POST['data_fim_prazo'], "%d/%m/%Y"))
+ except ValueError:
+ msg = _('Formato da data fim do prazo incorreto.')
+ messages.add_message(request, messages.ERROR, msg)
+ return self.get(request, self.kwargs)
# issue https://github.com/interlegis/sapl/issues/1123
# TODO: usar Form
urgente = request.POST['urgente'] == 'True'
flag_error = False
for materia_id in marcadas:
+ try:
+ data_tramitacao = tz.localize(datetime.strptime(
+ request.POST['data_tramitacao'], "%d/%m/%Y"))
+ except ValueError:
+ msg = _('Formato da data da tramitação incorreto.')
+ messages.add_message(request, messages.ERROR, msg)
+ return self.get(request, self.kwargs)
+
t = Tramitacao(
materia_id=materia_id,
- data_tramitacao=tz.localize(datetime.strptime(
- request.POST['data_tramitacao'], "%d/%m/%Y")),
+ data_tramitacao=data_tramitacao,
data_encaminhamento=data_encaminhamento,
data_fim_prazo=data_fim_prazo,
unidade_tramitacao_local_id=request.POST[
From 0c464b685930aa28476c134d003e138c0c9434a3 Mon Sep 17 00:00:00 2001
From: Victor Fabre
Date: Thu, 20 Dec 2018 14:04:13 -0200
Subject: [PATCH 023/222] Fix #2435 (#2436)
---
sapl/base/views.py | 7 ++++++-
sapl/templates/base/RelatorioPresencaSessao_filter.html | 2 ++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/sapl/base/views.py b/sapl/base/views.py
index 599d6b05f..8d5acce7b 100644
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -10,7 +10,7 @@ from django.contrib.auth.tokens import default_token_generator
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.core.mail import send_mail
from django.core.urlresolvers import reverse
-from django.db.models import Count
+from django.db.models import Count, Q
from django.http import Http404, HttpResponseRedirect
from django.template import TemplateDoesNotExist
from django.template.loader import get_template
@@ -373,8 +373,13 @@ class RelatorioPresencaSessaoView(FilterView):
# Completa o dicionario as informacoes parlamentar/sessao/ordem
parlamentares_presencas = []
for i, p in enumerate(parlamentares_qs):
+ m = p.mandato_set.filter(Q(data_inicio_mandato__lte=_range[0], data_fim_mandato__gte=_range[1]) |
+ Q(data_inicio_mandato__lte=_range[0], data_fim_mandato__isnull=True) |
+ Q(data_inicio_mandato__gte=_range[0], data_fim_mandato__lte=_range[1]))
+ m = m.last()
parlamentares_presencas.append({
'parlamentar': p,
+ 'titular': m.titular,
'sessao_porc': 0,
'ordemdia_porc': 0
})
diff --git a/sapl/templates/base/RelatorioPresencaSessao_filter.html b/sapl/templates/base/RelatorioPresencaSessao_filter.html
index e3e447f8d..9836235ca 100644
--- a/sapl/templates/base/RelatorioPresencaSessao_filter.html
+++ b/sapl/templates/base/RelatorioPresencaSessao_filter.html
@@ -25,6 +25,7 @@
Nome Parlamentar / Partido
+ Titular
Sessão
Ordem do Dia
@@ -39,6 +40,7 @@
{% for p in parlamentares %}
{{p.parlamentar}} / {{p.parlamentar|filiacao_intervalo_filter:date_range|default:"Sem Partido"}}
+ {%if p.titular %} Sim {% else %} Não {% endif %}
{{p.sessao_count}}
{{p.sessao_porc}}
{{p.ordemdia_count}}
From 90dec5fd76c33df51828a58802b5e1e6e1df76db Mon Sep 17 00:00:00 2001
From: Edward
Date: Thu, 20 Dec 2018 14:13:24 -0200
Subject: [PATCH 024/222] Fixes #2055 - Busca Textual (#2179)
Fixes #2055 - Busca Textual
---
Dockerfile | 5 +-
sapl/base/search_indexes.py | 72 +-
sapl/materia/views.py | 2 +
sapl/norma/views.py | 2 +
sapl/settings.py | 21 +-
.../materia/materialegislativa_filter.html | 10 +-
.../templates/norma/normajuridica_filter.html | 10 +-
solr/docker-compose.yml | 61 +
.../sapl_configset/conf/lang/stopwords_en.txt | 54 +
.../sapl_configset/conf/lang/stopwords_pt.txt | 253 +++
solr/sapl_configset/conf/managed-schema | 573 +++++++
solr/sapl_configset/conf/params.json | 20 +
solr/sapl_configset/conf/protwords.txt | 21 +
solr/sapl_configset/conf/saplconfigset.zip | Bin 0 -> 30297 bytes
solr/sapl_configset/conf/schema.xml | 165 ++
solr/sapl_configset/conf/solrconfig.xml | 1367 +++++++++++++++++
solr/sapl_configset/conf/stopwords.txt | 14 +
solr/sapl_configset/conf/synonyms.txt | 29 +
solr_api.py | 155 ++
start.sh | 18 +-
20 files changed, 2797 insertions(+), 55 deletions(-)
create mode 100644 solr/docker-compose.yml
create mode 100644 solr/sapl_configset/conf/lang/stopwords_en.txt
create mode 100644 solr/sapl_configset/conf/lang/stopwords_pt.txt
create mode 100644 solr/sapl_configset/conf/managed-schema
create mode 100644 solr/sapl_configset/conf/params.json
create mode 100644 solr/sapl_configset/conf/protwords.txt
create mode 100644 solr/sapl_configset/conf/saplconfigset.zip
create mode 100644 solr/sapl_configset/conf/schema.xml
create mode 100644 solr/sapl_configset/conf/solrconfig.xml
create mode 100644 solr/sapl_configset/conf/stopwords.txt
create mode 100644 solr/sapl_configset/conf/synonyms.txt
create mode 100755 solr_api.py
diff --git a/Dockerfile b/Dockerfile
index 3f3adc78e..ffb812d6b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,8 +1,9 @@
FROM alpine:3.8
ENV BUILD_PACKAGES postgresql-dev graphviz-dev graphviz build-base git pkgconfig \
- python3-dev libxml2-dev jpeg-dev libressl-dev libffi-dev libxslt-dev \
- nodejs npm py3-lxml py3-magic postgresql-client poppler-utils antiword vim openssh-client
+ python3-dev libxml2-dev jpeg-dev libressl-dev libffi-dev libxslt-dev \
+ nodejs npm py3-lxml py3-magic postgresql-client poppler-utils antiword \
+ curl jq openssh-client vim openssh-client
RUN apk update --update-cache && apk upgrade
diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py
index f1ec87ddd..0e0283ba8 100644
--- a/sapl/base/search_indexes.py
+++ b/sapl/base/search_indexes.py
@@ -1,6 +1,4 @@
import os.path
-import re
-import string
import textract
import logging
@@ -8,6 +6,7 @@ from django.db.models import F, Q, Value
from django.db.models.fields import TextField
from django.db.models.functions import Concat
from django.template import loader
+from haystack import connections
from haystack.constants import Indexable
from haystack.fields import CharField
from haystack.indexes import SearchIndex
@@ -24,6 +23,7 @@ from sapl.utils import RemoveTag
class TextExtractField(CharField):
+ backend = None
logger = logging.getLogger(__name__)
def __init__(self, **kwargs):
@@ -34,24 +34,20 @@ class TextExtractField(CharField):
self.model_attr = (self.model_attr, )
def solr_extraction(self, arquivo):
- extracted_data = self._get_backend(None).extract_file_contents(
- arquivo)['contents']
- # Remove as tags xml
- self.logger.debug("Removendo as tags xml.")
- extracted_data = re.sub('<[^>]*>', '', extracted_data)
- # Remove tags \t e \n
- self.logger.debug("Removendo as \t e \n.")
- extracted_data = extracted_data.replace(
- '\n', ' ').replace('\t', ' ')
- # Remove sinais de pontuação
- self.logger.debug("Removendo sinais de pontuação.")
- extracted_data = re.sub('[' + string.punctuation + ']',
- ' ', extracted_data)
- # Remove espaços múltiplos
- self.logger.debugger("Removendo espaços múltiplos.")
- extracted_data = " ".join(extracted_data.split())
-
- return extracted_data
+ if not self.backend:
+ self.backend = connections['default'].get_backend()
+ try:
+ with open(arquivo.path, 'rb') as f:
+ content = self.backend.extract_file_contents(f)
+ if not content or not content['contents']:
+ return ''
+ data = content['contents']
+ except Exception as e:
+ print('erro processando arquivo: ' % arquivo.path)
+ self.logger.error(arquivo.path)
+ self.logger.error('erro processando arquivo: ' % arquivo.path)
+ data = ''
+ return data
def whoosh_extraction(self, arquivo):
@@ -66,11 +62,11 @@ class TextExtractField(CharField):
language='pt-br').decode('utf-8').replace('\n', ' ').replace(
'\t', ' ')
- def print_error(self, arquivo):
- self.logger.error("Erro inesperado processando arquivo: {}".format(arquivo.path))
- msg = 'Erro inesperado processando arquivo: %s' % (
- arquivo.path)
- print(msg)
+ def print_error(self, arquivo, error):
+ msg = 'Erro inesperado processando arquivo %s erro: %s' % (
+ arquivo.path, error)
+ print(msg, error)
+ self.logger.error(msg, error)
def file_extractor(self, arquivo):
if not os.path.exists(arquivo.path) or \
@@ -81,9 +77,9 @@ class TextExtractField(CharField):
if SOLR_URL:
try:
return self.solr_extraction(arquivo)
- except Exception as e:
- self.logger.error("Erro no arquivo {}. ".format(arquivo.path) + str(e))
- self.print_error(arquivo)
+ except Exception as err:
+ print(str(err))
+ self.print_error(arquivo, err)
# Em ambiente de DEV utiliza-se o Whoosh
# Como ele não possui extração, faz-se uso do textract
@@ -91,13 +87,13 @@ class TextExtractField(CharField):
try:
self.logger.debug("Tentando whoosh_extraction no arquivo {}".format(arquivo.path))
return self.whoosh_extraction(arquivo)
- except ExtensionNotSupported as e:
- self.logger.error("Erro no arquivo {}".format(arquivo.path) + str(e))
- print(str(e))
- except Exception as e2:
- self.logger.error(str(e))
- print(str(e2))
self.print_error(arquivo)
+ except ExtensionNotSupported as err:
+ print(str(err))
+ self.logger.error(str(err))
+ except Exception as err:
+ print(str(err))
+ self.print_error(arquivo, str(err))
return ''
def ta_extractor(self, value):
@@ -133,7 +129,9 @@ class TextExtractField(CharField):
value = getattr(obj, attr)
if not value:
continue
- data += getattr(self, func)(value)
+ data += getattr(self, func)(value) + ' '
+
+ data = data.replace('\n', ' ')
return data
@@ -159,6 +157,10 @@ class DocumentoAcessorioIndex(SearchIndex, Indexable):
)
)
+ def __init__(self, **kwargs):
+ super().__init__(**kwargs)
+ self.text.search_index = self
+
def get_model(self):
return self.model
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 578357721..8af8a19e2 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -1810,6 +1810,8 @@ 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 f7800c42f..0e0ed23e4 100644
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -15,6 +15,7 @@ from django.views.generic import TemplateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
+from sapl import settings
from sapl.base.models import AppConfig
from sapl.compilacao.views import IntegracaoTaView
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
@@ -107,6 +108,7 @@ 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/settings.py b/sapl/settings.py
index d30b4df3c..0d6a452bc 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -100,23 +100,28 @@ INSTALLED_APPS = (
# FTS = Full Text Search
# Desabilita a indexação textual até encontramos uma solução para a issue
# https://github.com/interlegis/sapl/issues/2055
-#HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
-HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.BaseSignalProcessor'
+#HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.BaseSignalProcessor' # Disable auto index
+HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
SEARCH_BACKEND = 'haystack.backends.whoosh_backend.WhooshEngine'
SEARCH_URL = ('PATH', PROJECT_DIR.child('whoosh'))
-SOLR_URL = config('SOLR_URL', cast=str, default='')
-if SOLR_URL:
+# SOLR
+USE_SOLR = config('USE_SOLR', cast=bool, default=False)
+SOLR_URL = config('SOLR_URL', cast=str, default='http://localhost:8983')
+SOLR_COLLECTION = config('SOLR_COLLECTION', cast=str, default='sapl')
+
+if USE_SOLR:
SEARCH_BACKEND = 'haystack.backends.solr_backend.SolrEngine'
- SEARCH_URL = ('URL', config('SOLR_URL', cast=str))
- # ...or for multicore...
- # 'URL': 'http://127.0.0.1:8983/solr/mysite',
+ SEARCH_URL = ('URL', '{}/solr/{}'.format(SOLR_URL, SOLR_COLLECTION))
+# BATCH_SIZE: default is 1000 if omitted, avoid Too Large Entity Body errors
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': SEARCH_BACKEND,
- SEARCH_URL[0]: SEARCH_URL[1]
+ SEARCH_URL[0]: SEARCH_URL[1],
+ 'BATCH_SIZE': 500,
+ 'TIMEOUT': 60,
},
}
diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html
index cdd408af3..5ff3eaee0 100644
--- a/sapl/templates/materia/materialegislativa_filter.html
+++ b/sapl/templates/materia/materialegislativa_filter.html
@@ -3,11 +3,13 @@
{% load crispy_forms_tags %}
{% block actions %}
+
{% if paginator.count %}
{% if paginator.count > 1 %}
- {% blocktrans with paginator.count as total_materias %}Pesquisa concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}
+ {% if not tipo_listagem or tipo_listagem == '1' %}
+ {% blocktrans with paginator.count as total_materias %}Pesquisa detalhada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}
+ {% else %}
+ {% blocktrans with paginator.count as total_materias %}Pesquisa simplificada concluída com sucesso! Foram encontradas {{total_materias}} matérias.{% endblocktrans %}
+ {% endif %}
{% elif paginator.count == 1 %}
{% trans 'Pesquisa concluída com sucesso! Foi encontrada 1 matéria.'%}
{% endif %}
@@ -63,92 +67,96 @@
{% endif %}
{% if m.autoria_set.all %}
- Autor:
- {% for a in m.autoria_set.all %}
+ Autor:
+ {% for a in m.autoria_set.all %}
{% if not forloop.first %}
{{a.autor}}
{% else %}
{{a.autor}}
{% endif %}
- {% endfor %}
-
- {% endif %}
- {% if m.tramitacao_set.last.unidade_tramitacao_destino %}
- Localização Atual: {{m.tramitacao_set.last.unidade_tramitacao_destino}}
- {% endif %}
- {% if m.tramitacao_set.last.status %}
- Status: {{m.tramitacao_set.last.status}}
- Data Fim Prazo (Tramitação): {{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}
- {% endif %}
- {% if m.registrovotacao_set.exists %}
- Data Votação:
- {% for rv in m.registrovotacao_set.all %}
- {% if rv.ordem %}
-
- {{ rv.ordem.sessao_plenaria.data_inicio }}
-
- {% elif rv.expediente %}
-
- {{ rv.expediente.sessao_plenaria.data_inicio }}
-
- {% endif %}
-
- {% endfor %}
- {% endif %}
- {% if m.tramitacao_set.last.data_tramitacao %}
- Data da última Tramitação: {{m.tramitacao_set.last.data_tramitacao}}
- Ultima Ação: {{m.tramitacao_set.last.texto}}
- {% endif %}
- {% if m.anexo_de.exists %}
- {% for a in m.materia_anexada_set.all %}
- Matéria Anexadora:
-
- {{ a.materia_principal }}
-
- Data Anexação: {{a.data_anexacao}}
-
{% endfor %}
- {% endif %}
- {% if m.anexadas.all.exists %}
- {% for anexada in m.materia_principal_set.all %}
- Matéria Anexada:
-
- {{ anexada.materia_anexada }}
-
- Data Anexação: {{anexada.data_anexacao}}
- {% endfor %}
{% endif %}
- {% if m.documentoacessorio_set.all.exists %}
- Documentos Acessórios:
-
- {{ m.documentoacessorio_set.all.count }}
+
+ {% if not tipo_listagem or tipo_listagem == '1' %}
+
+ {% if m.tramitacao_set.last.unidade_tramitacao_destino %}
+ Localização Atual: {{m.tramitacao_set.last.unidade_tramitacao_destino}}
+ {% endif %}
+ {% if m.tramitacao_set.last.status %}
+ Status: {{m.tramitacao_set.last.status}}
+ Data Fim Prazo (Tramitação): {{m.tramitacao_set.last.data_fim_prazo|default_if_none:""}}
+ {% endif %}
+ {% if m.registrovotacao_set.exists %}
+ Data Votação:
+ {% for rv in m.registrovotacao_set.all %}
+ {% if rv.ordem %}
+
+ {{ rv.ordem.sessao_plenaria.data_inicio }}
+
+ {% elif rv.expediente %}
+
+ {{ rv.expediente.sessao_plenaria.data_inicio }}
+
+ {% endif %}
+
+ {% endfor %}
+ {% endif %}
+ {% if m.tramitacao_set.last.data_tramitacao %}
+ Data da última Tramitação: {{m.tramitacao_set.last.data_tramitacao}}
+ Ultima Ação: {{m.tramitacao_set.last.texto}}
+ {% endif %}
+ {% if m.anexo_de.exists %}
+ {% for a in m.materia_anexada_set.all %}
+ Matéria Anexadora:
+
+ {{ a.materia_principal }}
+ Data Anexação: {{a.data_anexacao}}
- {% endif %}
- {% if m.texto_original %}Texto Original {% endif %}
- {% if m.texto_articulado.exists %}Texto Articulado {% endif %}
- {% if m.normajuridica_set.exists %}
- {% for nr in m.normajuridica_set.all %}
- Norma Jurídica Vinculada:
-
- {{ nr }}
+ {% endfor %}
+ {% endif %}
+ {% if m.anexadas.all.exists %}
+ {% for anexada in m.materia_principal_set.all %}
+ Matéria Anexada:
+
+ {{ anexada.materia_anexada }}
+
+ Data Anexação: {{anexada.data_anexacao}}
+
+ {% endfor %}
+ {% endif %}
+ {% if m.documentoacessorio_set.all.exists %}
+ Documentos Acessórios:
+
+ {{ m.documentoacessorio_set.all.count }}
+ {% endif %}
+ {% if m.texto_original %}Texto Original {% endif %}
+ {% if m.texto_articulado.exists %}Texto Articulado {% endif %}
+ {% if m.normajuridica_set.exists %}
+ {% for nr in m.normajuridica_set.all %}
+ Norma Jurídica Vinculada:
+
+ {{ nr }}
+
+
+ {% endfor %}
+ {% endif %}
+ {% if m.audienciapublica_set.exists %}
+ Audiência(s) Pública(s):
+ {% for ap in m.audienciapublica_set.all %}
+
+ {{ ap.nome }}
+
+ {% if not forloop.last %}, {% endif %}
{% endfor %}
- {% endif %}
- {% if m.audienciapublica_set.exists %}
- Audiência(s) Pública(s):
- {% for ap in m.audienciapublica_set.all %}
-
- {{ ap.nome }}
-
- {% if not forloop.last %}, {% endif %}
- {% endfor %}
- {% endif %}
-
- {% if m.em_tramitacao and mail_service_configured %}
- Acompanhar Matéria
+ {% endif %}
+
+ {% if m.em_tramitacao and mail_service_configured %}
+ Acompanhar Matéria
+ {% endif %}
{% endif %}
From 93e394d3f5c677427716574e6a5070932fcc1696 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 04:54:38 -0200
Subject: [PATCH 055/222] =?UTF-8?q?Refatora=20formul=C3=A1rio=20de=20pesqu?=
=?UTF-8?q?isa=20de=20normas?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/norma/forms.py | 15 +++++++--
.../migrations/0020_auto_20190106_0454.py | 31 +++++++++++++++++++
sapl/norma/models.py | 21 +++++++------
3 files changed, 56 insertions(+), 11 deletions(-)
create mode 100644 sapl/norma/migrations/0020_auto_20190106_0454.py
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
index 55541b48f..cd5a091a1 100644
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -6,6 +6,7 @@ from crispy_forms.layout import Fieldset, Layout
from django import forms
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models
+from django.db.models import Q
from django.forms import ModelForm, widgets, ModelChoiceField
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
@@ -44,7 +45,9 @@ class NormaFilterSet(django_filters.FilterSet):
label='Ano',
choices=choice_anos_com_normas)
- ementa = django_filters.CharFilter(lookup_expr='icontains')
+ ementa = django_filters.CharFilter(
+ method='filter_ementa',
+ label=_('Pesquisar expressões na ementa da norma'))
indexacao = django_filters.CharFilter(lookup_expr='icontains',
label=_('Indexação'))
@@ -52,7 +55,7 @@ class NormaFilterSet(django_filters.FilterSet):
assuntos = django_filters.ModelChoiceFilter(
queryset=AssuntoNorma.objects.all())
- o = NormaPesquisaOrderingFilter()
+ o = NormaPesquisaOrderingFilter(help_text='')
class Meta:
filter_overrides = {models.DateField: {
@@ -82,6 +85,14 @@ class NormaFilterSet(django_filters.FilterSet):
form_actions(label='Pesquisar'))
)
+ def filter_ementa(self, queryset, name, value):
+ texto = value.split()
+ q = Q()
+ for t in texto:
+ q &= Q(ementa__icontains=t)
+
+ return queryset.filter(q)
+
class NormaJuridicaForm(ModelForm):
diff --git a/sapl/norma/migrations/0020_auto_20190106_0454.py b/sapl/norma/migrations/0020_auto_20190106_0454.py
new file mode 100644
index 000000000..09c5caa6f
--- /dev/null
+++ b/sapl/norma/migrations/0020_auto_20190106_0454.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2019-01-06 06:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('norma', '0019_auto_20190104_1021'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='normajuridica',
+ name='data_publicacao',
+ field=models.DateField(blank=True, null=True, verbose_name='Data de Publicação'),
+ ),
+ migrations.AlterField(
+ model_name='normajuridica',
+ name='tipo',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='norma.TipoNormaJuridica', verbose_name='Tipo da Norma Jurídica'),
+ ),
+ migrations.AlterField(
+ model_name='normajuridica',
+ name='veiculo_publicacao',
+ field=models.CharField(blank=True, max_length=30, verbose_name='Veículo de Publicação'),
+ ),
+ ]
diff --git a/sapl/norma/models.py b/sapl/norma/models.py
index 80075f113..21834cc4d 100644
--- a/sapl/norma/models.py
+++ b/sapl/norma/models.py
@@ -83,7 +83,7 @@ class NormaJuridica(models.Model):
tipo = models.ForeignKey(
TipoNormaJuridica,
on_delete=models.PROTECT,
- verbose_name=_('Tipo da Norma Juridica'))
+ verbose_name=_('Tipo da Norma Jurídica'))
materia = models.ForeignKey(
MateriaLegislativa, blank=True, null=True,
on_delete=models.PROTECT, verbose_name=_('Matéria'))
@@ -98,11 +98,11 @@ class NormaJuridica(models.Model):
choices=ESFERA_FEDERACAO_CHOICES)
data = models.DateField(blank=False, null=True, verbose_name=_('Data'))
data_publicacao = models.DateField(
- blank=True, null=True, verbose_name=_('Data Publicação'))
+ blank=True, null=True, verbose_name=_('Data de Publicação'))
veiculo_publicacao = models.CharField(
max_length=30,
blank=True,
- verbose_name=_('Veículo Publicação'))
+ verbose_name=_('Veículo de Publicação'))
pagina_inicio_publicacao = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Pg. Início'))
pagina_fim_publicacao = models.PositiveIntegerField(
@@ -119,7 +119,8 @@ class NormaJuridica(models.Model):
assuntos = models.ManyToManyField(
AssuntoNorma, blank=True,
verbose_name=_('Assuntos'))
- data_vigencia = models.DateField(blank=True, null=True, verbose_name=_('Data Fim Vigência'))
+ data_vigencia = models.DateField(
+ blank=True, null=True, verbose_name=_('Data Fim Vigência'))
timestamp = models.DateTimeField(null=True)
texto_articulado = GenericRelation(
@@ -197,7 +198,8 @@ class NormaEstatisticas(models.Model):
blank=True, null=True,
auto_now=True)
norma = models.ForeignKey(NormaJuridica,
- on_delete=models.CASCADE)
+ on_delete=models.CASCADE)
+
def __str__(self):
return _('Usuário: %(usuario)s, Norma: %(norma)s') % {
'usuario': self.usuario, 'norma': self.norma}
@@ -225,6 +227,7 @@ class AutoriaNorma(models.Model):
return _('Autoria: %(autor)s - %(norma)s') % {
'autor': self.autor, 'norma': self.norma}
+
@reversion.register()
class LegislacaoCitada(models.Model):
materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE)
@@ -271,8 +274,8 @@ class TipoVinculoNormaJuridica(models.Model):
descricao_passiva = models.CharField(
max_length=50, blank=True, verbose_name=_('Descrição Passiva'))
revoga_integralmente = models.BooleanField(verbose_name=_('Revoga Integralmente?'),
- choices=YES_NO_CHOICES,
- default=False)
+ choices=YES_NO_CHOICES,
+ default=False)
class Meta:
verbose_name = _('Tipo de Vínculo entre Normas Jurídicas')
@@ -318,8 +321,8 @@ class AnexoNormaJuridica(models.Model):
on_delete=models.PROTECT,
verbose_name=_('Norma Juridica'))
assunto_anexo = models.TextField(
- blank = True,
- default = "",
+ blank=True,
+ default="",
verbose_name=_('Assunto do Anexo'),
max_length=250
)
From c8e520509e0225527883605ec0f5e6d980a225d3 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 13:42:04 -0200
Subject: [PATCH 056/222] Refatora form de pesquisa de protocolos
---
sapl/protocoloadm/forms.py | 32 +++++++++----------
.../migrations/0013_auto_20190106_1336.py | 26 +++++++++++++++
sapl/protocoloadm/models.py | 10 +++---
3 files changed, 48 insertions(+), 20 deletions(-)
create mode 100644 sapl/protocoloadm/migrations/0013_auto_20190106_1336.py
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 63474be8e..90fb7c7ce 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -29,12 +29,11 @@ from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
TIPOS_PROTOCOLO = [('0', 'Recebido'), ('1', 'Enviado'),
- ('2', 'Interno'), ('', '---------')]
+ ('2', 'Interno')]
TIPOS_PROTOCOLO_CREATE = [
('0', 'Recebido'), ('1', 'Enviado'), ('2', 'Interno')]
-NATUREZA_PROCESSO = [('', '---------'),
- ('0', 'Administrativo'),
+NATUREZA_PROCESSO = [('0', 'Administrativo'),
('1', 'Legislativo')]
@@ -68,13 +67,18 @@ class AcompanhamentoDocumentoForm(ModelForm):
class ProtocoloFilterSet(django_filters.FilterSet):
- ano = django_filters.ChoiceFilter(required=False,
- label='Ano',
- choices=choice_anos_com_protocolo)
+ ano = django_filters.ChoiceFilter(
+ required=False,
+ label='Ano',
+ choices=choice_anos_com_protocolo)
- assunto_ementa = django_filters.CharFilter(lookup_expr='icontains')
+ assunto_ementa = django_filters.CharFilter(
+ label=_('Assunto'),
+ lookup_expr='icontains')
- interessado = django_filters.CharFilter(lookup_expr='icontains')
+ interessado = django_filters.CharFilter(
+ label=_('Interessado'),
+ lookup_expr='icontains')
autor = django_filters.CharFilter(widget=forms.HiddenInput())
@@ -91,7 +95,7 @@ class ProtocoloFilterSet(django_filters.FilterSet):
widget=forms.Select(
attrs={'class': 'selector'}))
- o = AnoNumeroOrderingFilter()
+ o = AnoNumeroOrderingFilter(help_text='')
class Meta:
filter_overrides = {models.DateTimeField: {
@@ -110,9 +114,6 @@ class ProtocoloFilterSet(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
super(ProtocoloFilterSet, self).__init__(*args, **kwargs)
- self.filters['autor'].label = 'Tipo de Matéria'
- self.filters['assunto_ementa'].label = 'Assunto'
-
row1 = to_row(
[('numero', 4),
('ano', 4),
@@ -136,9 +137,7 @@ class ProtocoloFilterSet(django_filters.FilterSet):
'Limpar Autor',
css_class='btn btn-primary btn-sm'), 10)])
row5 = to_row(
- [('tipo_processo', 12)])
- row6 = to_row(
- [('o', 12)])
+ [('tipo_processo', 6), ('o', 6)])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
@@ -146,9 +145,10 @@ class ProtocoloFilterSet(django_filters.FilterSet):
Fieldset(_('Pesquisar Protocolo'),
row1, row2,
row3,
+ row5,
HTML(autor_label),
HTML(autor_modal),
- row4, row5, row6,
+ row4,
form_actions(label='Pesquisar'))
)
diff --git a/sapl/protocoloadm/migrations/0013_auto_20190106_1336.py b/sapl/protocoloadm/migrations/0013_auto_20190106_1336.py
new file mode 100644
index 000000000..3cd58e085
--- /dev/null
+++ b/sapl/protocoloadm/migrations/0013_auto_20190106_1336.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2019-01-06 15:36
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('protocoloadm', '0012_auto_20190104_1021'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='protocolo',
+ name='tipo_documento',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='protocoloadm.TipoDocumentoAdministrativo', verbose_name='Tipo de Documento'),
+ ),
+ migrations.AlterField(
+ model_name='protocolo',
+ name='tipo_materia',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='materia.TipoMateriaLegislativa', verbose_name='Tipo de Matéria'),
+ ),
+ ]
diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py
index 1b061fa18..438037205 100644
--- a/sapl/protocoloadm/models.py
+++ b/sapl/protocoloadm/models.py
@@ -1,8 +1,8 @@
-import reversion
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from model_utils import Choices
+import reversion
from sapl.base.models import Autor
from sapl.materia.models import TipoMateriaLegislativa, UnidadeTramitacao
@@ -78,13 +78,13 @@ class Protocolo(models.Model):
blank=True,
null=True,
on_delete=models.PROTECT,
- verbose_name=_('Tipo de documento'))
+ verbose_name=_('Tipo de Documento'))
tipo_materia = models.ForeignKey(
TipoMateriaLegislativa,
blank=True,
null=True,
on_delete=models.PROTECT,
- verbose_name=_('Tipo Matéria'))
+ verbose_name=_('Tipo de Matéria'))
numero_paginas = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Número de Páginas'))
observacao = models.TextField(
@@ -299,10 +299,12 @@ class TramitacaoAdministrativo(models.Model):
'documento': self.documento, 'status': self.status
}
+
@reversion.register()
class AcompanhamentoDocumento(models.Model):
usuario = models.CharField(max_length=50)
- documento = models.ForeignKey(DocumentoAdministrativo, on_delete=models.CASCADE)
+ documento = models.ForeignKey(
+ DocumentoAdministrativo, on_delete=models.CASCADE)
email = models.EmailField(
max_length=100, verbose_name=_('E-mail'))
data_cadastro = models.DateField(auto_now_add=True)
From a19a8c0b1b0fbdc8d4dfed3c94a082a49e84c1a8 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 14:08:36 -0200
Subject: [PATCH 057/222] Refatora form de pesquisa de Documentos
Administrativos
---
sapl/protocoloadm/forms.py | 51 +++++++++++++++++++++-----------------
sapl/utils.py | 5 ++++
2 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 90fb7c7ce..2b43e7ab3 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -20,7 +20,8 @@ from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa,
UnidadeTramitacao)
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, AnoNumeroOrderingFilter,
RangeWidgetOverride, autor_label, autor_modal,
- choice_anos_com_protocolo)
+ choice_anos_com_protocolo,
+ choice_anos_com_documentoadministrativo)
from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo,
@@ -37,9 +38,7 @@ NATUREZA_PROCESSO = [('0', 'Administrativo'),
('1', 'Legislativo')]
-EM_TRAMITACAO = [('', '---------'),
- (0, 'Sim'),
- (1, 'Não')]
+EM_TRAMITACAO = [(0, 'Sim'), (1, 'Não')]
class AcompanhamentoDocumentoForm(ModelForm):
@@ -155,19 +154,24 @@ class ProtocoloFilterSet(django_filters.FilterSet):
class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
- ano = django_filters.ChoiceFilter(required=False,
- label='Ano',
- choices=RANGE_ANOS)
+ ano = django_filters.ChoiceFilter(
+ required=False,
+ label='Ano',
+ choices=choice_anos_com_documentoadministrativo)
tramitacao = django_filters.ChoiceFilter(required=False,
label='Em Tramitação?',
- choices=EM_TRAMITACAO)
+ choices=YES_NO_CHOICES)
- assunto = django_filters.CharFilter(lookup_expr='icontains')
+ assunto = django_filters.CharFilter(
+ label=_('Assunto'),
+ lookup_expr='icontains')
- interessado = django_filters.CharFilter(lookup_expr='icontains')
+ interessado = django_filters.CharFilter(
+ label=_('Interessado'),
+ lookup_expr='icontains')
- o = AnoNumeroOrderingFilter()
+ o = AnoNumeroOrderingFilter(help_text='')
class Meta:
filter_overrides = {models.DateField: {
@@ -190,37 +194,38 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
local_atual = 'tramitacaoadministrativo__unidade_tramitacao_destino'
self.filters['tipo'].label = 'Tipo de Documento'
+ self.filters['protocolo__numero'].label = 'Núm. Protocolo'
self.filters['tramitacaoadministrativo__status'].label = 'Situação'
self.filters[local_atual].label = 'Localização Atual'
row1 = to_row(
- [('tipo', 6),
- ('numero', 6)])
+ [('tipo', 8),
+ ('o', 4), ])
row2 = to_row(
- [('ano', 4),
+ [('numero', 2),
+ ('ano', 2),
('protocolo__numero', 2),
('numero_externo', 2),
('data', 4)])
row3 = to_row(
- [('interessado', 4),
- ('assunto', 4),
- ('tramitacao', 4)])
+ [('interessado', 6),
+ ('assunto', 6)])
row4 = to_row(
- [('tramitacaoadministrativo__unidade_tramitacao_destino', 6),
- ('tramitacaoadministrativo__status', 6)])
-
- row5 = to_row(
- [('o', 12)])
+ [
+ ('tramitacao', 2),
+ ('tramitacaoadministrativo__status', 5),
+ ('tramitacaoadministrativo__unidade_tramitacao_destino', 5),
+ ])
self.form.helper = FormHelper()
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisar Documento'),
row1, row2,
- row3, row4, row5,
+ row3, row4,
form_actions(label='Pesquisar'))
)
diff --git a/sapl/utils.py b/sapl/utils.py
index c812fdcb9..b1970c46b 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -369,6 +369,11 @@ def choice_anos_com_protocolo():
return choice_anos(Protocolo)
+def choice_anos_com_documentoadministrativo():
+ from sapl.protocoloadm.models import DocumentoAdministrativo
+ return choice_anos(DocumentoAdministrativo)
+
+
def choice_anos_com_sessaoplenaria():
try:
from sapl.sessao.models import SessaoPlenaria
From 94fc4db6260389b97ea8e36bc33d58ae2608a7a4 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 14:19:32 -0200
Subject: [PATCH 058/222] corrige form de cadastro de documento administrativo
---
sapl/protocoloadm/forms.py | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 2b43e7ab3..9e8920f7f 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -21,7 +21,7 @@ from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa,
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, AnoNumeroOrderingFilter,
RangeWidgetOverride, autor_label, autor_modal,
choice_anos_com_protocolo,
- choice_anos_com_documentoadministrativo)
+ choice_anos_com_documentoadministrativo, ANO_CHOICES)
from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo,
@@ -707,12 +707,13 @@ class DocumentoAdministrativoForm(ModelForm):
data = forms.DateField(initial=timezone.now)
- ano_protocolo = forms.ChoiceField(required=False,
- label=Protocolo._meta.
- get_field('ano').verbose_name,
- choices=RANGE_ANOS,
- widget=forms.Select(
- attrs={'class': 'selector'}))
+ ano_protocolo = forms.ChoiceField(
+ required=False,
+ label=Protocolo._meta.
+ get_field('ano').verbose_name,
+ choices=[('', '---------')] + choice_anos_com_protocolo(),
+ widget=forms.Select(
+ attrs={'class': 'selector'}))
numero_protocolo = forms.IntegerField(required=False,
label=Protocolo._meta.
@@ -829,7 +830,7 @@ class DocumentoAdministrativoForm(ModelForm):
def __init__(self, *args, **kwargs):
row1 = to_row(
- [('tipo', 4), ('numero', 4), ('ano', 4)])
+ [('tipo', 6), ('numero', 3), ('ano', 3)])
row2 = to_row(
[('data', 4), ('numero_protocolo', 4), ('ano_protocolo', 4)])
@@ -838,7 +839,7 @@ class DocumentoAdministrativoForm(ModelForm):
[('assunto', 12)])
row4 = to_row(
- [('interessado', 8), ('tramitacao', 2), (InlineRadios('restrito'), 2)])
+ [('interessado', 7), ('tramitacao', 2), (InlineRadios('restrito'), 3)])
row5 = to_row(
[('texto_integral', 12)])
From ae370faf189a7318cc821f9d45b45148ae1c3df3 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 17:02:45 -0200
Subject: [PATCH 059/222] altera teste de documento administrativo inexistente
---
sapl/protocoloadm/tests/test_protocoloadm.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py
index 2f61d359f..d61d7b2b3 100644
--- a/sapl/protocoloadm/tests/test_protocoloadm.py
+++ b/sapl/protocoloadm/tests/test_protocoloadm.py
@@ -1,10 +1,10 @@
from datetime import date, timedelta
-import pytest
from django.core.urlresolvers import reverse
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
+import pytest
from sapl.materia.models import UnidadeTramitacao
from sapl.protocoloadm.forms import (AnularProcoloAdmForm,
@@ -368,6 +368,9 @@ def test_documento_administrativo_invalido():
def test_documento_administrativo_protocolo_inexistente():
tipo = mommy.make(TipoDocumentoAdministrativo)
+ protocolo = mommy.make(Protocolo,
+ ano=2017,
+ numero=10)
form = DocumentoAdministrativoForm(data={'ano': '2017',
'tipo': str(tipo.pk),
From 6c3ca7e57b4ab027f4f76147802e7be14fa0f3d8 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 00:03:10 -0200
Subject: [PATCH 060/222] corrige erro apontado pelo teste de doc adms
inexistentes
---
sapl/protocoloadm/forms.py | 6 +++---
sapl/protocoloadm/tests/test_protocoloadm.py | 7 +++++--
sapl/utils.py | 20 ++++++++++++++++++++
3 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 9e8920f7f..9a9bda40b 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -20,8 +20,8 @@ from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa,
UnidadeTramitacao)
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, AnoNumeroOrderingFilter,
RangeWidgetOverride, autor_label, autor_modal,
- choice_anos_com_protocolo,
- choice_anos_com_documentoadministrativo, ANO_CHOICES)
+ choice_anos_com_protocolo, choice_force_optional,
+ choice_anos_com_documentoadministrativo)
from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo,
@@ -711,7 +711,7 @@ class DocumentoAdministrativoForm(ModelForm):
required=False,
label=Protocolo._meta.
get_field('ano').verbose_name,
- choices=[('', '---------')] + choice_anos_com_protocolo(),
+ choices=choice_force_optional(choice_anos_com_protocolo),
widget=forms.Select(
attrs={'class': 'selector'}))
diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py
index d61d7b2b3..2a4c9f53c 100644
--- a/sapl/protocoloadm/tests/test_protocoloadm.py
+++ b/sapl/protocoloadm/tests/test_protocoloadm.py
@@ -1,6 +1,7 @@
from datetime import date, timedelta
from django.core.urlresolvers import reverse
+from django.utils import timezone
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from model_mommy import mommy
@@ -191,7 +192,7 @@ def test_create_tramitacao(admin_client):
'unidade_tramitacao_destino': unidade_tramitacao_destino_2.pk,
'documento': documento_adm.pk,
'status': status.pk,
- 'data_tramitacao': date.today() + timedelta(
+ 'data_tramitacao': timezone.now().date() + timedelta(
days=1)},
follow=True)
@@ -370,7 +371,9 @@ def test_documento_administrativo_protocolo_inexistente():
tipo = mommy.make(TipoDocumentoAdministrativo)
protocolo = mommy.make(Protocolo,
ano=2017,
- numero=10)
+ numero=10,
+ anulado=False,
+ tipo_documento=tipo)
form = DocumentoAdministrativoForm(data={'ano': '2017',
'tipo': str(tipo.pk),
diff --git a/sapl/utils.py b/sapl/utils.py
index b1970c46b..ee8271b4f 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -387,6 +387,26 @@ def choice_anos_com_sessaoplenaria():
return []
+def choice_force_optional(callable):
+ """ Django-filter faz algo que tenha o mesmo sentido em ChoiceFilter,
+ no entanto, as funções choice_anos_... podem ser usadas em formulários
+ comuns de adição e/ou edição, com a particularidade de terem
+ required=False.
+ Neste caso para ser possível contar com a otimização de apenas mostrar anos
+ que estejam na base de dados e ainda colocar o item opcional '---------',
+ é necessário encapsular então, as funções choice_anos_... com a
+ esta função choice_force_optional... isso ocorre e foi aplicado
+ inicialmente no cadastro de documentos administrativos onde tem-se
+ opcionalmente a possibilidade de colocar o ano do protocolo.
+ Em ChoiceFilter choice_force_optional não deve ser usado pois duplicaria
+ o item opcional '---------' já que ChoiceFilter já o adiciona, como dito
+ anteriormente.
+ """
+ def _func():
+ return [('', '---------')] + callable()
+ return _func
+
+
TIPOS_TEXTO_PERMITIDOS = (
'application/vnd.oasis.opendocument.text',
'application/x-vnd.oasis.opendocument.text',
From 0605581e2ede90a2161b2c48f554b73297416857 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 09:45:39 -0200
Subject: [PATCH 061/222] =?UTF-8?q?remove=20duplicidade=20de=20c=C3=B3digo?=
=?UTF-8?q?=20de=20filter=5Foverrides?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/base/forms.py | 49 ++++++-------------------------------
sapl/materia/forms.py | 34 ++++---------------------
sapl/norma/forms.py | 8 +-----
sapl/protocoloadm/forms.py | 18 +++-----------
sapl/protocoloadm/models.py | 5 ++--
sapl/utils.py | 16 ++++++++++++
6 files changed, 36 insertions(+), 94 deletions(-)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index 5aa3315fb..5b246a47f 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -32,7 +32,8 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES,
ChoiceWithoutValidationField, ImageThumbnailFileInput,
RangeWidgetOverride, autor_label, autor_modal,
models_with_gr_for_model, qs_override_django_filter,
- choice_anos_com_normas, choice_anos_com_materias)
+ choice_anos_com_normas, choice_anos_com_materias,
+ FilterOverridesMetaMixin)
from .models import AppConfig, CasaLegislativa
@@ -674,13 +675,7 @@ class AutorFormForAdmin(AutorForm):
class RelatorioAtasFilterSet(django_filters.FilterSet):
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = SessaoPlenaria
fields = ['data_inicio']
@@ -714,12 +709,6 @@ class RelatorioNormasMesFilterSet(django_filters.FilterSet):
choices=choice_anos_com_normas)
class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Ano')),
- 'widget': RangeWidgetOverride}
- }}
model = NormaJuridica
fields = ['ano']
@@ -784,13 +773,7 @@ class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet):
class RelatorioPresencaSessaoFilterSet(django_filters.FilterSet):
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = SessaoPlenaria
fields = ['data_inicio']
@@ -822,13 +805,7 @@ class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet):
parent = super(RelatorioHistoricoTramitacaoFilterSet, self).qs
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero')
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['tipo', 'tramitacao__unidade_tramitacao_local',
'tramitacao__status', 'tramitacao__data_tramitacao']
@@ -861,13 +838,7 @@ class RelatorioDataFimPrazoTramitacaoFilterSet(django_filters.FilterSet):
parent = super(RelatorioDataFimPrazoTramitacaoFilterSet, self).qs
return parent.distinct().prefetch_related('tipo').order_by('-ano', 'tipo', 'numero')
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['tipo', 'tramitacao__unidade_tramitacao_local',
'tramitacao__status', 'tramitacao__data_fim_prazo']
@@ -1034,13 +1005,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet):
return parent.distinct().filter(autoria__primeiro_autor=True)\
.order_by('autoria__autor', '-autoria__primeiro_autor', 'tipo', '-ano', '-numero')
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index 06d5bada8..a043d024d 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -45,7 +45,7 @@ from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO,
MateriaPesquisaOrderingFilter, RangeWidgetOverride,
autor_label, autor_modal, gerar_hash_arquivo,
models_with_gr_for_model, qs_override_django_filter,
- choice_anos_com_materias)
+ choice_anos_com_materias, FilterOverridesMetaMixin)
from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial,
DocumentoAcessorio, Numeracao, Proposicao, Relatoria,
@@ -806,13 +806,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
choices=CHOICE_TIPO_LISTAGEM,
label=_('Tipo da Listagem do Resultado da Pesquisa'))
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial / Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['numero',
'numero_protocolo',
@@ -1104,13 +1098,7 @@ class AutoriaMultiCreateForm(Form):
class AcessorioEmLoteFilterSet(django_filters.FilterSet):
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']
@@ -1134,13 +1122,7 @@ class AcessorioEmLoteFilterSet(django_filters.FilterSet):
class PrimeiraTramitacaoEmLoteFilterSet(django_filters.FilterSet):
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao']
@@ -1165,13 +1147,7 @@ class PrimeiraTramitacaoEmLoteFilterSet(django_filters.FilterSet):
class TramitacaoEmLoteFilterSet(django_filters.FilterSet):
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = MateriaLegislativa
fields = ['tipo', 'data_apresentacao', 'tramitacao__status',
'tramitacao__unidade_tramitacao_destino']
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
index cd5a091a1..512308e4f 100644
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -57,13 +57,7 @@ class NormaFilterSet(django_filters.FilterSet):
o = NormaPesquisaOrderingFilter(help_text='')
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = NormaJuridica
fields = ['tipo', 'numero', 'ano', 'data', 'data_vigencia',
'data_publicacao', 'ementa', 'assuntos']
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 9a9bda40b..2a324543b 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -96,13 +96,7 @@ class ProtocoloFilterSet(django_filters.FilterSet):
o = AnoNumeroOrderingFilter(help_text='')
- class Meta:
- filter_overrides = {models.DateTimeField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': 'Data (%s)' % (_('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = Protocolo
fields = ['numero',
'tipo_documento',
@@ -113,6 +107,8 @@ class ProtocoloFilterSet(django_filters.FilterSet):
def __init__(self, *args, **kwargs):
super(ProtocoloFilterSet, self).__init__(*args, **kwargs)
+ self.filters['timestamp'].label = 'Data (Inicial - Final)'
+
row1 = to_row(
[('numero', 4),
('ano', 4),
@@ -173,13 +169,7 @@ class DocumentoAdministrativoFilterSet(django_filters.FilterSet):
o = AnoNumeroOrderingFilter(help_text='')
- class Meta:
- filter_overrides = {models.DateField: {
- 'filter_class': django_filters.DateFromToRangeFilter,
- 'extra': lambda f: {
- 'label': 'Data (%s)' % (_('Inicial - Final')),
- 'widget': RangeWidgetOverride}
- }}
+ class Meta(FilterOverridesMetaMixin):
model = DocumentoAdministrativo
fields = ['tipo',
'numero',
diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py
index 438037205..6d3d90671 100644
--- a/sapl/protocoloadm/models.py
+++ b/sapl/protocoloadm/models.py
@@ -56,10 +56,11 @@ class Protocolo(models.Model):
null=False,
choices=RANGE_ANOS,
verbose_name=_('Ano do Protocolo'))
- # TODO: Remover esses dois campos após migração,
- # TODO: pois timestamp supre a necessidade
+
+ # FIXME: https://github.com/interlegis/sapl/issues/2337
data = models.DateField(null=True, blank=True)
hora = models.TimeField(null=True, blank=True)
+
# Não foi utilizado auto_now_add=True em timestamp porque
# ele usa datetime.now que não é timezone aware.
timestamp = models.DateTimeField(default=timezone.now)
diff --git a/sapl/utils.py b/sapl/utils.py
index ee8271b4f..def839eb1 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -16,6 +16,7 @@ from django.contrib.contenttypes.fields import (GenericForeignKey, GenericRel,
GenericRelation)
from django.core.exceptions import ValidationError
from django.core.mail import get_connection
+from django.db import models
from django.db.models import Q
from django.utils import six, timezone
from django.utils.translation import ugettext_lazy as _
@@ -407,6 +408,21 @@ def choice_force_optional(callable):
return _func
+FILTER_OVERRIDES_DATEFIELD = {
+ 'filter_class': django_filters.DateFromToRangeFilter,
+ 'extra': lambda f: {
+ 'label': '%s (%s)' % (f.verbose_name, _('Inicial - Final')),
+ 'widget': RangeWidgetOverride
+ }
+}
+
+
+class FilterOverridesMetaMixin:
+ filter_overrides = {
+ models.DateField: FILTER_OVERRIDES_DATEFIELD
+ }
+
+
TIPOS_TEXTO_PERMITIDOS = (
'application/vnd.oasis.opendocument.text',
'application/x-vnd.oasis.opendocument.text',
From 0b9feaf5ce0ce76c7d06a92ca1ef46a2d4bdb833 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 17:13:41 -0200
Subject: [PATCH 062/222] add imports
---
sapl/norma/forms.py | 2 +-
sapl/protocoloadm/forms.py | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
index 512308e4f..c49f94889 100644
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -18,7 +18,7 @@ from sapl.materia.forms import choice_anos_com_materias
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.settings import MAX_DOC_UPLOAD_SIZE
from sapl.utils import NormaPesquisaOrderingFilter, RangeWidgetOverride,\
- choice_anos_com_normas
+ choice_anos_com_normas, FilterOverridesMetaMixin
from .models import (AnexoNormaJuridica, AssuntoNorma, NormaJuridica, NormaRelacionada,
TipoNormaJuridica, AutoriaNorma)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 2a324543b..d0c812958 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -21,7 +21,8 @@ from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa,
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, AnoNumeroOrderingFilter,
RangeWidgetOverride, autor_label, autor_modal,
choice_anos_com_protocolo, choice_force_optional,
- choice_anos_com_documentoadministrativo)
+ choice_anos_com_documentoadministrativo,
+ FilterOverridesMetaMixin)
from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo,
From 9869d4d4c4bcaef0afd793f3cb8dc74517914c89 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 20:35:27 -0200
Subject: [PATCH 063/222] =?UTF-8?q?retira=20field=20search=20inv=C3=A1lido?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/parlamentares/models.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index 8c07914c4..b1ee14629 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -281,7 +281,6 @@ class Parlamentar(models.Model):
('nome_completo', '__icontains'),
('nome_parlamentar', '__icontains'),
('filiacao__partido__sigla', '__icontains'),
- ('filiacao__partido', '__exact'),
))
class Meta:
From e9d64207f2fd1b1437267106618a5e5ced42ed93 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 9 Jan 2019 17:30:54 -0200
Subject: [PATCH 064/222] Fix #2447
---
sapl/materia/views.py | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 07911f09b..0f856ede3 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -26,7 +26,7 @@ import weasyprint
import sapl
from sapl.base.email_utils import do_envia_email_confirmacao
-from sapl.base.models import Autor, CasaLegislativa
+from sapl.base.models import Autor, CasaLegislativa, AppConfig as BaseAppConfig
from sapl.base.signals import tramitacao_signal
from sapl.comissoes.models import Comissao, Participacao
from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT,
@@ -783,16 +783,23 @@ class ProposicaoCrud(Crud):
msg_error = _('Proposição não possui nenhum tipo de '
'Texto associado.')
else:
- p.data_devolucao = None
- p.data_envio = timezone.now()
- p.save()
-
if p.texto_articulado.exists():
ta = p.texto_articulado.first()
ta.privacidade = STATUS_TA_IMMUTABLE_RESTRICT
ta.editing_locked = True
ta.save()
+ receber_recibo = BaseAppConfig.attr(
+ 'receber_recibo_proposicao')
+
+ if not receber_recibo:
+ ta = p.texto_articulado.first()
+ p.hash_code = 'P' + ta.hash() + SEPARADOR_HASH_PROPOSICAO + str(p.pk)
+
+ p.data_devolucao = None
+ p.data_envio = timezone.now()
+ p.save()
+
messages.success(request, _(
'Proposição enviada com sucesso.'))
try:
From 05f1bb923912b051d7710952a0b0792bdc1187da Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Thu, 10 Jan 2019 18:42:30 -0200
Subject: [PATCH 065/222] Release: 3.1.141
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index b379cf46c..c796253d4 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.140
+ image: interlegis/sapl:3.1.141
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 59f9919f1..a738aa276 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.140
+ Release: 3.1.141
diff --git a/setup.py b/setup.py
index 6b7c5a248..61de04956 100644
--- a/setup.py
+++ b/setup.py
@@ -49,7 +49,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.140',
+ version='3.1.141',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From bd2bc3a4f7d71f6f7b387f13694defcebaca93ea Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sat, 5 Jan 2019 04:39:39 -0200
Subject: [PATCH 066/222] bump django para 1.11
---
requirements/requirements.txt | 17 +++++++++--------
setup.py | 11 ++++++-----
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 3c4d2e135..69cb803f5 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -1,18 +1,19 @@
+django>=1.11,<2.0
+django-haystack==2.8.1
+django-bootstrap3==11.0.0
+django-filter==2.0.0
+djangorestframework==3.9.0
+
dj-database-url==0.4.1
-django-haystack==2.6.0
-django>=1.10,<1.11
-django-bootstrap3==7.0.1
django-bower==5.2.0
django-braces==1.9.0
django-compressor==2.0
django-crispy-forms==1.6.1
django-extensions==1.9.8
django-extra-views==0.11.0
-django-filter==1.0.0
django-floppyforms==1.6.2
django-model-utils==3.1.1
django-sass-processor==0.5.8
-djangorestframework==3.4.0
easy-thumbnails==2.5
django-image-cropping==1.2
libsass==0.11.1
@@ -32,6 +33,6 @@ whoosh==2.7.4
django-speedinfo==1.3.5
django-reversion-compare==0.8.4
-git+git://github.com/interlegis/trml2pdf.git
-git+git://github.com/jasperlittle/django-rest-framework-docs
-git+git://github.com/rubgombar1/django-admin-bootstrapped.git
\ No newline at end of file
+#git+git://github.com/interlegis/trml2pdf.git
+#git+git://github.com/jasperlittle/django-rest-framework-docs
+#git+git://github.com/rubgombar1/django-admin-bootstrapped.git
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 61de04956..a64217d42 100644
--- a/setup.py
+++ b/setup.py
@@ -9,21 +9,22 @@ with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme:
os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))
install_requires = [
+ 'django>=1.11,<2.0',
+ 'django-haystack==2.8.1',
+ 'django-bootstrap3==11.0.0',
+ 'django-filter==2.0.0',
+ 'djangorestframework==3.9.0',
+
'dj-database-url==0.4.1',
- 'django-haystack==2.6.0',
- 'django>=1.10,<1.11',
- 'django-bootstrap3==7.0.1',
'django-bower==5.2.0',
'django-braces==1.9.0',
'django-compressor==2.0',
'django-crispy-forms==1.6.1',
'django-extensions==1.9.8',
'django-extra-views==0.11.0',
- 'django-filter==0.15.3',
'django-floppyforms==1.6.2',
'django-model-utils==3.1.1',
'django-sass-processor==0.5.8',
- 'djangorestframework==3.4.0',
'drfdocs',
'easy-thumbnails==2.5',
'django-image-cropping==1.1.0',
From 55963883265c9165aa62a8bf62e030395eb7d80b Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sat, 5 Jan 2019 04:40:44 -0200
Subject: [PATCH 067/222] =?UTF-8?q?altera=C3=A7=C3=B5es=20m=C3=ADnimas=20p?=
=?UTF-8?q?ara=20executar=20manage=20check?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/api/forms.py | 2 +-
sapl/api/views.py | 5 +++--
sapl/settings.py | 7 ++++---
sapl/utils.py | 21 ++++++++++-----------
4 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/sapl/api/forms.py b/sapl/api/forms.py
index fecfbf598..0c8a1889f 100644
--- a/sapl/api/forms.py
+++ b/sapl/api/forms.py
@@ -6,8 +6,8 @@ from django.forms.widgets import MultiWidget, TextInput
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django_filters.filters import CharFilter, ModelChoiceFilter, DateFilter
+from django_filters.rest_framework.filterset import FilterSet
from rest_framework import serializers
-from rest_framework.filters import FilterSet
from sapl.base.models import Autor, TipoAutor
from sapl.parlamentares.models import Legislatura
diff --git a/sapl/api/views.py b/sapl/api/views.py
index b8cafc1dd..336bb23d7 100644
--- a/sapl/api/views.py
+++ b/sapl/api/views.py
@@ -1,9 +1,10 @@
import logging
+
from django.contrib.contenttypes.models import ContentType
from django.db.models import Q
from django.http import Http404
from django.utils.translation import ugettext_lazy as _
-from rest_framework.filters import DjangoFilterBackend
+from django_filters.rest_framework.backends import DjangoFilterBackend
from rest_framework.generics import ListAPIView
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
from rest_framework.permissions import (AllowAny, IsAuthenticated,
@@ -175,7 +176,7 @@ class AutoresProvaveisListView(ListAPIView):
serializer_class = ChoiceSerializer
def get_queryset(self):
-
+
params = {'content_type__isnull': False}
username = self.request.user.username
tipo = ''
diff --git a/sapl/settings.py b/sapl/settings.py
index 80bf18273..63f18e325 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -90,6 +90,7 @@ INSTALLED_APPS = (
'haystack',
'sass_processor',
'rest_framework',
+ 'django_filters',
'reversion',
'reversion_compare',
'whoosh',
@@ -110,7 +111,7 @@ SOLR_URL = config('SOLR_URL', cast=str, default='http://localhost:8983')
SOLR_COLLECTION = config('SOLR_COLLECTION', cast=str, default='sapl')
if USE_SOLR:
- HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' #enable auto-index
+ HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # enable auto-index
SEARCH_BACKEND = 'haystack.backends.solr_backend.SolrEngine'
SEARCH_URL = ('URL', '{}/solr/{}'.format(SOLR_URL, SOLR_COLLECTION))
@@ -118,7 +119,7 @@ if USE_SOLR:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': SEARCH_BACKEND,
- SEARCH_URL[0]: SEARCH_URL[1],
+ SEARCH_URL[0]: SEARCH_URL[1],
'BATCH_SIZE': 1000,
'TIMEOUT': 60,
},
@@ -166,7 +167,7 @@ REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "sapl.api.pagination.StandardPagination",
"DEFAULT_FILTER_BACKENDS": (
"rest_framework.filters.SearchFilter",
- "rest_framework.filters.DjangoFilterBackend",
+ 'django_filters.rest_framework.DjangoFilterBackend',
),
}
diff --git a/sapl/utils.py b/sapl/utils.py
index def839eb1..c884a8c48 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -21,7 +21,6 @@ from django.db.models import Q
from django.utils import six, timezone
from django.utils.translation import ugettext_lazy as _
import django_filters
-from django_filters.filterset import STRICTNESS
from easy_thumbnails import source_generators
from floppyforms import ClearableFileInput
import magic
@@ -685,12 +684,12 @@ def qs_override_django_filter(self):
valid = self.is_bound and self.form.is_valid()
if self.is_bound and not valid:
- if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR:
+ """if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR:
raise forms.ValidationError(self.form.errors)
- elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS:
- self._qs = self.queryset.none()
- return self._qs
- # else STRICTNESS.IGNORE... ignoring
+ elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS:"""
+ self._qs = self.queryset.none()
+ return self._qs
+ # else STRICTNESS.IGNORE... ignoring
# start with all the results and filter from there
qs = self.queryset.all()
@@ -703,12 +702,12 @@ def qs_override_django_filter(self):
try:
value = self.form.fields[name].clean(raw_value)
except forms.ValidationError:
- if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR:
+ """if self.strict == STRICTNESS.RAISE_VALIDATION_ERROR:
raise
- elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS:
- self._qs = self.queryset.none()
- return self._qs
- # else STRICTNESS.IGNORE... ignoring
+ elif bool(self.strict) == STRICTNESS.RETURN_NO_RESULTS:"""
+ self._qs = self.queryset.none()
+ return self._qs
+ # else STRICTNESS.IGNORE... ignoring
if value is not None: # valid & clean data
qs = qs._next_is_sticky()
From b4666807ab6c9f16101a2dd5cc832d580ef06c01 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sat, 5 Jan 2019 04:52:22 -0200
Subject: [PATCH 068/222] =?UTF-8?q?adequa=C3=A7=C3=A3o=20de=20c=C3=B3digo?=
=?UTF-8?q?=20na=20chamada=20do=20render=20de=20templates?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/base/email_utils.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/base/email_utils.py b/sapl/base/email_utils.py
index 024045edd..b41c68402 100644
--- a/sapl/base/email_utils.py
+++ b/sapl/base/email_utils.py
@@ -18,7 +18,7 @@ def load_email_templates(templates, context={}):
emails = []
for t in templates:
tpl = loader.get_template(t)
- email = tpl.render(Context(context))
+ email = tpl.render(context)
if t.endswith(".html"):
email = email.replace('\n', '').replace('\r', '')
emails.append(email)
From 243f984a13a60ef441daff8fef9dc8603be773a1 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 16:21:20 -0200
Subject: [PATCH 069/222] remove django-compressor
---
requirements/requirements.txt | 11 ++++++-----
sapl/base/templatetags/common_tags.py | 15 ++++++++++-----
sapl/crud/base.py | 15 +++++++++------
setup.py | 9 +++++----
4 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 69cb803f5..944b300d7 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -1,13 +1,12 @@
django>=1.11,<2.0
-django-haystack==2.8.1
django-bootstrap3==11.0.0
+django-haystack==2.8.1
django-filter==2.0.0
djangorestframework==3.9.0
-
-dj-database-url==0.4.1
+dj-database-url==0.5.0
django-bower==5.2.0
django-braces==1.9.0
-django-compressor==2.0
+
django-crispy-forms==1.6.1
django-extensions==1.9.8
django-extra-views==0.11.0
@@ -35,4 +34,6 @@ django-reversion-compare==0.8.4
#git+git://github.com/interlegis/trml2pdf.git
#git+git://github.com/jasperlittle/django-rest-framework-docs
-#git+git://github.com/rubgombar1/django-admin-bootstrapped.git
\ No newline at end of file
+#git+git://github.com/rubgombar1/django-admin-bootstrapped.git
+
+#django-compressor==2.2
\ No newline at end of file
diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py
index 89f781558..884a6968f 100644
--- a/sapl/base/templatetags/common_tags.py
+++ b/sapl/base/templatetags/common_tags.py
@@ -1,8 +1,4 @@
-import logging
-
-from compressor.utils import get_class
from django import template
-from django.conf import settings
from django.template.defaultfilters import stringfilter
from sapl.base.models import AppConfig
@@ -15,6 +11,15 @@ from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO
register = template.Library()
+def get_class(class_string):
+ if not hasattr(class_string, '__bases__'):
+ class_string = str(class_string)
+ dot = class_string.rindex('.')
+ mod_name, class_name = class_string[:dot], class_string[dot + 1:]
+ if class_name:
+ return getattr(__import__(mod_name, {}, {}, [str('')]), class_name)
+
+
@register.simple_tag
def define(arg):
return arg
@@ -228,7 +233,7 @@ def file_extension(value):
def cronometro_to_seconds(value):
if not AppConfig.attr('cronometro_' + value):
return 0
-
+
return AppConfig.attr('cronometro_' + value).seconds
diff --git a/sapl/crud/base.py b/sapl/crud/base.py
index e720b36cd..faa0e1287 100644
--- a/sapl/crud/base.py
+++ b/sapl/crud/base.py
@@ -1,6 +1,6 @@
import logging
+
from braces.views import FormMessagesMixin
-from compressor.utils.decorators import cached_property
from crispy_forms.bootstrap import FieldWithButtons, StrictButton
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Field, Layout
@@ -16,6 +16,7 @@ from django.http.response import Http404
from django.shortcuts import redirect
from django.utils.decorators import classonlymethod
from django.utils.encoding import force_text
+from django.utils.functional import cached_property
from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _
from django.views.generic import (CreateView, DeleteView, DetailView, ListView,
@@ -29,6 +30,7 @@ from sapl.rules.map_rules import (RP_ADD, RP_CHANGE, RP_DELETE, RP_DETAIL,
from sapl.settings import BASE_DIR
from sapl.utils import normalize
+
ACTION_LIST, ACTION_CREATE, ACTION_DETAIL, ACTION_UPDATE, ACTION_DELETE = \
'list', 'create', 'detail', 'update', 'delete'
@@ -558,7 +560,8 @@ class CrudListView(PermissionRequiredContainerCrudMixin, ListView):
fm = model._meta.get_field(fo)
except Exception as e:
username = self.request.user.username
- self.logger.error("user=" + username + ". " + str(e))
+ self.logger.error(
+ "user=" + username + ". " + str(e))
pass
if fm and hasattr(fm, 'related_model')\
@@ -824,7 +827,7 @@ class CrudUpdateView(PermissionRequiredContainerCrudMixin,
logger = logging.getLogger(__name__)
def form_valid(self, form):
-
+
self.object = form.instance
try:
self.object.modifier = self.request.user
@@ -882,12 +885,12 @@ class CrudDeleteView(PermissionRequiredContainerCrudMixin,
error_msg2 += '{} - {}, '.format(
i._meta.verbose_name, i
)
- error_msg2 = error_msg2[:len(error_msg2)-2] + '.'
+ error_msg2 = error_msg2[:len(error_msg2) - 2] + '.'
error_msg += ''
-
+
username = request.user.username
self.logger.error("user=" + username + ". Registro não pode ser removido, pois "
- "é referenciado por outros registros: " + error_msg2)
+ "é referenciado por outros registros: " + error_msg2)
messages.add_message(request,
messages.ERROR,
error_msg)
diff --git a/setup.py b/setup.py
index a64217d42..e44ded347 100644
--- a/setup.py
+++ b/setup.py
@@ -10,15 +10,14 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))
install_requires = [
'django>=1.11,<2.0',
- 'django-haystack==2.8.1',
'django-bootstrap3==11.0.0',
+ 'django-haystack==2.8.1',
'django-filter==2.0.0',
'djangorestframework==3.9.0',
-
- 'dj-database-url==0.4.1',
+ 'dj-database-url==0.5.0',
'django-bower==5.2.0',
'django-braces==1.9.0',
- 'django-compressor==2.0',
+
'django-crispy-forms==1.6.1',
'django-extensions==1.9.8',
'django-extra-views==0.11.0',
@@ -47,6 +46,8 @@ install_requires = [
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
# 'git+git://github.com/rubgombar1/django-admin-bootstrapped.git''
+
+ #'django-compressor==2.2',
]
setup(
name='interlegis-sapl',
From 22b87f36ebc8659a6ecaf8831ab0f425206b0993 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 16:49:40 -0200
Subject: [PATCH 070/222] =?UTF-8?q?bump=20django-crispy-forms=20e=20ajuste?=
=?UTF-8?q?s=20de=20c=C3=B3digo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
requirements/requirements.txt | 2 +-
sapl/utils.py | 16 ++++++++++++----
setup.py | 4 ++--
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 944b300d7..7b6dc25c1 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -6,8 +6,8 @@ djangorestframework==3.9.0
dj-database-url==0.5.0
django-bower==5.2.0
django-braces==1.9.0
+django-crispy-forms==1.7.2
-django-crispy-forms==1.6.1
django-extensions==1.9.8
django-extra-views==0.11.0
django-floppyforms==1.6.2
diff --git a/sapl/utils.py b/sapl/utils.py
index c884a8c48..706d5cb65 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -208,19 +208,27 @@ class RangeWidgetOverride(forms.MultiWidget):
def __init__(self, attrs=None):
widgets = (forms.DateInput(format='%d/%m/%Y',
- attrs={'class': 'dateinput',
+ attrs={'class': 'dateinput form-control',
'placeholder': 'Inicial'}),
forms.DateInput(format='%d/%m/%Y',
- attrs={'class': 'dateinput',
+ attrs={'class': 'dateinput form-control',
'placeholder': 'Final'}))
super(RangeWidgetOverride, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
return [value.start, value.stop]
- return [None, None]
+ return []
+
+ def render(self, name, value, attrs=None, renderer=None):
+ rendered_widgets = []
+ for i, x in enumerate(self.widgets):
+ rendered_widgets.append(
+ x.render(
+ '%s_%d' % (name, i), value[i] if value else ''
+ )
+ )
- def format_output(self, rendered_widgets):
html = '%s
%s
'\
% tuple(rendered_widgets)
return '%s
' % html
diff --git a/setup.py b/setup.py
index e44ded347..018ff1002 100644
--- a/setup.py
+++ b/setup.py
@@ -17,8 +17,8 @@ install_requires = [
'dj-database-url==0.5.0',
'django-bower==5.2.0',
'django-braces==1.9.0',
+ 'django-crispy-forms==1.7.2',
- 'django-crispy-forms==1.6.1',
'django-extensions==1.9.8',
'django-extra-views==0.11.0',
'django-floppyforms==1.6.2',
@@ -46,7 +46,7 @@ install_requires = [
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
# 'git+git://github.com/rubgombar1/django-admin-bootstrapped.git''
-
+
#'django-compressor==2.2',
]
setup(
From ca684e006734a94e10af7da367cba0c0db5747f8 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 6 Jan 2019 17:08:34 -0200
Subject: [PATCH 071/222] descomenta libs do requirements
---
requirements/requirements.txt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 7b6dc25c1..4b869decc 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -32,8 +32,8 @@ whoosh==2.7.4
django-speedinfo==1.3.5
django-reversion-compare==0.8.4
-#git+git://github.com/interlegis/trml2pdf.git
-#git+git://github.com/jasperlittle/django-rest-framework-docs
-#git+git://github.com/rubgombar1/django-admin-bootstrapped.git
+git+git://github.com/interlegis/trml2pdf.git
+git+git://github.com/jasperlittle/django-rest-framework-docs
+git+git://github.com/rubgombar1/django-admin-bootstrapped.git
#django-compressor==2.2
\ No newline at end of file
From 82fb5613c39f991a985f0291af0d6d95c86754d3 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 00:43:54 -0200
Subject: [PATCH 072/222] bump django-floppyforms
---
requirements/requirements.txt | 2 +-
sapl/sessao/forms.py | 8 +++-----
sapl/settings.py | 19 ++++++++++++-------
sapl/static/styles/app.scss | 3 +++
.../parlamentares/parlamentares_list.html | 6 ++++--
setup.py | 4 ++--
6 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 4b869decc..524549446 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -7,10 +7,10 @@ dj-database-url==0.5.0
django-bower==5.2.0
django-braces==1.9.0
django-crispy-forms==1.7.2
+django-floppyforms==1.7.0
django-extensions==1.9.8
django-extra-views==0.11.0
-django-floppyforms==1.6.2
django-model-utils==3.1.1
django-sass-processor==0.5.8
easy-thumbnails==2.5
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index 35d49e277..68f6d3222 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -3,7 +3,6 @@ from datetime import datetime
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button, Fieldset, Layout
from django import forms
-from django.contrib import messages
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import transaction
@@ -12,22 +11,21 @@ from django.forms import ModelForm
from django.forms.widgets import CheckboxSelectMultiple
from django.utils.translation import ugettext_lazy as _
import django_filters
-from floppyforms import widgets
from sapl.base.models import Autor, TipoAutor
from sapl.crispy_layout_mixin import form_actions, to_row, SaplFormLayout
from sapl.materia.forms import MateriaLegislativaFilterSet
from sapl.materia.models import (MateriaLegislativa, StatusTramitacao,
TipoMateriaLegislativa)
-from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato
+from sapl.parlamentares.models import Parlamentar, Mandato
from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES,
MateriaPesquisaOrderingFilter, autor_label,
autor_modal, timezone, choice_anos_com_sessaoplenaria)
from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia,
Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria,
- SessaoPlenariaPresenca, TipoJustificativa, TipoResultadoVotacao,
- OcorrenciaSessao, RegistroVotacao, RetiradaPauta, TipoRetiradaPauta)
+ SessaoPlenariaPresenca, TipoResultadoVotacao,
+ OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta)
MES_CHOICES = RANGE_MESES
diff --git a/sapl/settings.py b/sapl/settings.py
index 63f18e325..fbc19f53f 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -79,20 +79,25 @@ INSTALLED_APPS = (
'django.contrib.messages',
'django.contrib.staticfiles',
- # more
- 'django_extensions',
'djangobower',
- 'bootstrap3', # basically for django_admin_bootstrapped
+ 'bootstrap3',
'crispy_forms',
- 'easy_thumbnails',
- 'image_cropping',
'floppyforms',
- 'haystack',
- 'sass_processor',
+
'rest_framework',
'django_filters',
+
+
+
+ 'django_extensions',
+ 'easy_thumbnails',
+ 'image_cropping',
+ 'sass_processor',
+
'reversion',
'reversion_compare',
+
+ 'haystack',
'whoosh',
'speedinfo',
diff --git a/sapl/static/styles/app.scss b/sapl/static/styles/app.scss
index a0540b8e1..f05189142 100644
--- a/sapl/static/styles/app.scss
+++ b/sapl/static/styles/app.scss
@@ -451,6 +451,9 @@ nav {
overflow-x: auto;
}
}
+.lista-parlamentares .table td {
+ vertical-align: middle;
+}
@media (min-width: 1092px) and (max-width: 1199px) {
.container {
diff --git a/sapl/templates/parlamentares/parlamentares_list.html b/sapl/templates/parlamentares/parlamentares_list.html
index bc3955b06..43627a9ad 100644
--- a/sapl/templates/parlamentares/parlamentares_list.html
+++ b/sapl/templates/parlamentares/parlamentares_list.html
@@ -21,7 +21,7 @@
{% if not rows %}
{{ NO_ENTRIES_MSG }}
{% else %}
-
+
{% blocktrans with verbose_name_plural=view.verbose_name_plural %}Total de {{ verbose_name_plural }}: {{count}} {% endblocktrans %}
@@ -43,7 +43,9 @@
{% for value, href, obj in value_list %}
{% if forloop.first %}
-
+ {% if obj.fotografia %}
+
+ {% endif %}
{% endif %}
diff --git a/setup.py b/setup.py
index 018ff1002..12a1823a7 100644
--- a/setup.py
+++ b/setup.py
@@ -18,10 +18,10 @@ install_requires = [
'django-bower==5.2.0',
'django-braces==1.9.0',
'django-crispy-forms==1.7.2',
+ 'django-floppyforms==1.7.0',
- 'django-extensions==1.9.8',
'django-extra-views==0.11.0',
- 'django-floppyforms==1.6.2',
+ 'django-extensions==1.9.8',
'django-model-utils==3.1.1',
'django-sass-processor==0.5.8',
'drfdocs',
From 3564909a1b6baf6735e471af5ca3fdb006738b18 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 01:03:06 -0200
Subject: [PATCH 073/222] bump django-extra-views
---
requirements/requirements.txt | 2 +-
sapl/settings.py | 25 +++++++++++++++-------
sapl/temp_suppress_crispy_form_warnings.py | 22 -------------------
setup.py | 2 +-
4 files changed, 19 insertions(+), 32 deletions(-)
delete mode 100644 sapl/temp_suppress_crispy_form_warnings.py
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 524549446..3b260f0d6 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -8,9 +8,9 @@ django-bower==5.2.0
django-braces==1.9.0
django-crispy-forms==1.7.2
django-floppyforms==1.7.0
+django-extra-views==0.12.0
django-extensions==1.9.8
-django-extra-views==0.11.0
django-model-utils==3.1.1
django-sass-processor==0.5.8
easy-thumbnails==2.5
diff --git a/sapl/settings.py b/sapl/settings.py
index fbc19f53f..78f8f7781 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -22,9 +22,6 @@ from dj_database_url import parse as db_url
from easy_thumbnails.conf import Settings as thumbnail_settings
from unipath import Path
-from .temp_suppress_crispy_form_warnings import \
- SUPRESS_CRISPY_FORM_WARNINGS_LOGGING
-
host = socket.gethostbyname_ex(socket.gethostname())[0]
@@ -288,6 +285,7 @@ DAB_FIELD_RENDERER = \
CRISPY_TEMPLATE_PACK = 'bootstrap3'
CRISPY_ALLOWED_TEMPLATE_PACKS = 'bootstrap3'
CRISPY_FAIL_SILENTLY = not DEBUG
+FLOPPY_FORMS_USE_GIS = False
BOWER_COMPONENTS_ROOT = PROJECT_DIR.child("bower")
BOWER_INSTALLED_APPS = (
@@ -345,6 +343,22 @@ LOGGING = {
}
}
+PASSWORD_HASHERS = [
+ 'django.contrib.auth.hashers.PBKDF2PasswordHasher', # default
+ 'sapl.hashers.ZopeSHA1PasswordHasher',
+]
+
+
+def remove_warnings():
+ import warnings
+ warnings.filterwarnings(
+ 'ignore', module='floppyforms',
+ message='Unable to import floppyforms.gis'
+ )
+
+
+remove_warnings()
+
def uncaught_exceptions(type, value, error_traceback):
import traceback
@@ -356,8 +370,3 @@ def uncaught_exceptions(type, value, error_traceback):
# captura exceções que não foram tratadas
sys.excepthook = uncaught_exceptions
-
-PASSWORD_HASHERS = [
- 'django.contrib.auth.hashers.PBKDF2PasswordHasher', # default
- 'sapl.hashers.ZopeSHA1PasswordHasher',
-]
diff --git a/sapl/temp_suppress_crispy_form_warnings.py b/sapl/temp_suppress_crispy_form_warnings.py
deleted file mode 100644
index 39105d39e..000000000
--- a/sapl/temp_suppress_crispy_form_warnings.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import copy
-import logging
-
-from django.utils.log import DEFAULT_LOGGING
-
-# hack to suppress many annoying warnings from crispy_forms
-# Do remove this file and corresponding import in settings
-# when crispy_forms is corrected !!!
-SUPRESS_CRISPY_FORM_WARNINGS_LOGGING = copy.deepcopy(DEFAULT_LOGGING)
-SUPRESS_CRISPY_FORM_WARNINGS_LOGGING['filters']['suppress_deprecated'] = {
- '()': 'sapl.temp_suppress_crispy_form_warnings.SuppressDeprecated'
-}
-SUPRESS_CRISPY_FORM_WARNINGS_LOGGING['handlers']['console']['filters'].append(
- 'suppress_deprecated')
-
-
-class SuppressDeprecated(logging.Filter):
-
- def filter(self, record):
- msg = record.getMessage()
- return not ('crispy_forms' in msg and
- 'RemovedInDjango19Warning' in msg)
diff --git a/setup.py b/setup.py
index 12a1823a7..4a44886a9 100644
--- a/setup.py
+++ b/setup.py
@@ -19,8 +19,8 @@ install_requires = [
'django-braces==1.9.0',
'django-crispy-forms==1.7.2',
'django-floppyforms==1.7.0',
+ 'django-extra-views==0.12.0',
- 'django-extra-views==0.11.0',
'django-extensions==1.9.8',
'django-model-utils==3.1.1',
'django-sass-processor==0.5.8',
From 08d249f123304f8bcb817c89bd1cdf3bb36e7b0a Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 09:57:28 -0200
Subject: [PATCH 074/222] bump django-models-utils e django-sass-processor
---
requirements/requirements.txt | 4 ++--
setup.py | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 3b260f0d6..5ad014630 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -9,10 +9,10 @@ django-braces==1.9.0
django-crispy-forms==1.7.2
django-floppyforms==1.7.0
django-extra-views==0.12.0
+django-model-utils==3.1.2
+django-sass-processor==0.7.2
django-extensions==1.9.8
-django-model-utils==3.1.1
-django-sass-processor==0.5.8
easy-thumbnails==2.5
django-image-cropping==1.2
libsass==0.11.1
diff --git a/setup.py b/setup.py
index 4a44886a9..b17a241c0 100644
--- a/setup.py
+++ b/setup.py
@@ -20,10 +20,10 @@ install_requires = [
'django-crispy-forms==1.7.2',
'django-floppyforms==1.7.0',
'django-extra-views==0.12.0',
+ 'django-model-utils==3.1.2',
+ 'django-sass-processor==0.7.2',
'django-extensions==1.9.8',
- 'django-model-utils==3.1.1',
- 'django-sass-processor==0.5.8',
'drfdocs',
'easy-thumbnails==2.5',
'django-image-cropping==1.1.0',
From 9bc8225bbc0a14b2bf526d96df15fdb81d115ce7 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:18:30 -0200
Subject: [PATCH 075/222] bump django-reversion e django-reversion-compare
---
requirements/requirements.txt | 4 ++--
setup.py | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 5ad014630..229fc2b44 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -11,6 +11,8 @@ django-floppyforms==1.7.0
django-extra-views==0.12.0
django-model-utils==3.1.2
django-sass-processor==0.7.2
+django-reversion==3.0.2
+django-reversion-compare==0.8.6
django-extensions==1.9.8
easy-thumbnails==2.5
@@ -26,11 +28,9 @@ unipath==1.1
pysolr==3.6.0
python-magic==0.4.12
gunicorn==19.6.0
-django-reversion==2.0.8
WeasyPrint==0.42
whoosh==2.7.4
django-speedinfo==1.3.5
-django-reversion-compare==0.8.4
git+git://github.com/interlegis/trml2pdf.git
git+git://github.com/jasperlittle/django-rest-framework-docs
diff --git a/setup.py b/setup.py
index b17a241c0..c08b7cafb 100644
--- a/setup.py
+++ b/setup.py
@@ -22,6 +22,8 @@ install_requires = [
'django-extra-views==0.12.0',
'django-model-utils==3.1.2',
'django-sass-processor==0.7.2',
+ 'django-reversion==3.0.2',
+ 'django-reversion-compare==0.8.6'
'django-extensions==1.9.8',
'drfdocs',
@@ -38,11 +40,9 @@ install_requires = [
'pysolr==3.6.0',
'python-magic==0.4.12',
'gunicorn==19.6.0',
- 'django-reversion==2.0.8',
'WeasyPrint==0.42',
'whoosh==2.7.4',
'django-speedinfo==1.3.5',
- 'django-reversion-compare==0.8.4'
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
# 'git+git://github.com/rubgombar1/django-admin-bootstrapped.git''
From 93c462703ff30be1e3f970caf905c0ed93daf2bf Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:25:46 -0200
Subject: [PATCH 076/222] bump django-speedinfo
---
requirements/requirements.txt | 2 +-
setup.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 229fc2b44..0ebfd9195 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -13,6 +13,7 @@ django-model-utils==3.1.2
django-sass-processor==0.7.2
django-reversion==3.0.2
django-reversion-compare==0.8.6
+django-speedinfo==1.4.0
django-extensions==1.9.8
easy-thumbnails==2.5
@@ -30,7 +31,6 @@ python-magic==0.4.12
gunicorn==19.6.0
WeasyPrint==0.42
whoosh==2.7.4
-django-speedinfo==1.3.5
git+git://github.com/interlegis/trml2pdf.git
git+git://github.com/jasperlittle/django-rest-framework-docs
diff --git a/setup.py b/setup.py
index c08b7cafb..e7839c35e 100644
--- a/setup.py
+++ b/setup.py
@@ -24,6 +24,7 @@ install_requires = [
'django-sass-processor==0.7.2',
'django-reversion==3.0.2',
'django-reversion-compare==0.8.6'
+ 'django-speedinfo==1.4.0',
'django-extensions==1.9.8',
'drfdocs',
@@ -42,7 +43,6 @@ install_requires = [
'gunicorn==19.6.0',
'WeasyPrint==0.42',
'whoosh==2.7.4',
- 'django-speedinfo==1.3.5',
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
# 'git+git://github.com/rubgombar1/django-admin-bootstrapped.git''
From 1c6192a54e9ff358908fa3ed0d5be56bf4001cde Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:31:54 -0200
Subject: [PATCH 077/222] bump django-extensions
---
requirements/requirements.txt | 4 ++--
sapl/settings.py | 6 ++----
setup.py | 2 +-
3 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 0ebfd9195..2b83fa694 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -14,10 +14,10 @@ django-sass-processor==0.7.2
django-reversion==3.0.2
django-reversion-compare==0.8.6
django-speedinfo==1.4.0
+django-extensions==2.1.4
-django-extensions==1.9.8
-easy-thumbnails==2.5
django-image-cropping==1.2
+easy-thumbnails==2.5
libsass==0.11.1
psycopg2-binary==2.7.4
python-decouple==3.0
diff --git a/sapl/settings.py b/sapl/settings.py
index 78f8f7781..782cbb0f4 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -75,21 +75,19 @@ INSTALLED_APPS = (
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'django_extensions',
'djangobower',
'bootstrap3',
'crispy_forms',
'floppyforms',
+ 'sass_processor',
'rest_framework',
'django_filters',
-
-
- 'django_extensions',
'easy_thumbnails',
'image_cropping',
- 'sass_processor',
'reversion',
'reversion_compare',
diff --git a/setup.py b/setup.py
index e7839c35e..2ebde35b9 100644
--- a/setup.py
+++ b/setup.py
@@ -25,8 +25,8 @@ install_requires = [
'django-reversion==3.0.2',
'django-reversion-compare==0.8.6'
'django-speedinfo==1.4.0',
+ 'django-extensions==2.1.4',
- 'django-extensions==1.9.8',
'drfdocs',
'easy-thumbnails==2.5',
'django-image-cropping==1.1.0',
From 33200eae61f253baf2ac826a2bf9ffa3e6efc934 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:33:54 -0200
Subject: [PATCH 078/222] bump django-image-cropping
---
setup.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/setup.py b/setup.py
index 2ebde35b9..3917d49bd 100644
--- a/setup.py
+++ b/setup.py
@@ -26,10 +26,9 @@ install_requires = [
'django-reversion-compare==0.8.6'
'django-speedinfo==1.4.0',
'django-extensions==2.1.4',
-
- 'drfdocs',
+ 'django-image-cropping==1.2.0',
'easy-thumbnails==2.5',
- 'django-image-cropping==1.1.0',
+
'libsass==0.11.1',
'psycopg2==2.7.4',
'python-decouple==3.0',
@@ -43,6 +42,8 @@ install_requires = [
'gunicorn==19.6.0',
'WeasyPrint==0.42',
'whoosh==2.7.4',
+
+ 'drfdocs',
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
# 'git+git://github.com/rubgombar1/django-admin-bootstrapped.git''
From bfdbf82ef5fc121c3cf683d70f13ec316b3a1ac8 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:38:06 -0200
Subject: [PATCH 079/222] bump libsass
---
requirements/requirements.txt | 10 +++++-----
setup.py | 4 ++--
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 2b83fa694..5e5425ebe 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -15,10 +15,10 @@ django-reversion==3.0.2
django-reversion-compare==0.8.6
django-speedinfo==1.4.0
django-extensions==2.1.4
-
django-image-cropping==1.2
easy-thumbnails==2.5
-libsass==0.11.1
+libsass==0.17.0
+
psycopg2-binary==2.7.4
python-decouple==3.0
pytz==2016.4
@@ -32,8 +32,8 @@ gunicorn==19.6.0
WeasyPrint==0.42
whoosh==2.7.4
-git+git://github.com/interlegis/trml2pdf.git
-git+git://github.com/jasperlittle/django-rest-framework-docs
-git+git://github.com/rubgombar1/django-admin-bootstrapped.git
+#git+git://github.com/interlegis/trml2pdf.git
+#git+git://github.com/jasperlittle/django-rest-framework-docs
+#git+git://github.com/rubgombar1/django-admin-bootstrapped.git
#django-compressor==2.2
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 3917d49bd..d8fbacbe5 100644
--- a/setup.py
+++ b/setup.py
@@ -29,7 +29,7 @@ install_requires = [
'django-image-cropping==1.2.0',
'easy-thumbnails==2.5',
- 'libsass==0.11.1',
+ 'libsass==0.17.0',
'psycopg2==2.7.4',
'python-decouple==3.0',
'pytz==2016.4',
@@ -42,7 +42,7 @@ install_requires = [
'gunicorn==19.6.0',
'WeasyPrint==0.42',
'whoosh==2.7.4',
-
+
'drfdocs',
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
From a0d47f84c052cf602b32ae3d595a982d3a4ad6a6 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:43:31 -0200
Subject: [PATCH 080/222] bump python-decouple
---
requirements/requirements.txt | 2 +-
setup.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 5e5425ebe..584b51380 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -18,9 +18,9 @@ django-extensions==2.1.4
django-image-cropping==1.2
easy-thumbnails==2.5
libsass==0.17.0
+python-decouple==3.1
psycopg2-binary==2.7.4
-python-decouple==3.0
pytz==2016.4
pyyaml==4.2b1
rtyaml==0.0.3
diff --git a/setup.py b/setup.py
index d8fbacbe5..80379f086 100644
--- a/setup.py
+++ b/setup.py
@@ -28,10 +28,10 @@ install_requires = [
'django-extensions==2.1.4',
'django-image-cropping==1.2.0',
'easy-thumbnails==2.5',
-
'libsass==0.17.0',
+ 'python-decouple==3.1',
+
'psycopg2==2.7.4',
- 'python-decouple==3.0',
'pytz==2016.4',
'pyyaml==4.2b1',
'rtyaml==0.0.3',
From 5ef0e0421b6a8d62d78f06b105e50a9a8eab039b Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:46:34 -0200
Subject: [PATCH 081/222] bump psycopg2-binary
---
requirements/requirements.txt | 2 +-
setup.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 584b51380..44e37516e 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -19,8 +19,8 @@ django-image-cropping==1.2
easy-thumbnails==2.5
libsass==0.17.0
python-decouple==3.1
+psycopg2-binary==2.7.6.1
-psycopg2-binary==2.7.4
pytz==2016.4
pyyaml==4.2b1
rtyaml==0.0.3
diff --git a/setup.py b/setup.py
index 80379f086..b48c420ee 100644
--- a/setup.py
+++ b/setup.py
@@ -30,10 +30,10 @@ install_requires = [
'easy-thumbnails==2.5',
'libsass==0.17.0',
'python-decouple==3.1',
+ 'psycopg2-binary==2.7.6.1',
+ 'pyyaml==4.2b1',
- 'psycopg2==2.7.4',
'pytz==2016.4',
- 'pyyaml==4.2b1',
'rtyaml==0.0.3',
'textract==1.5.0',
'unipath==1.1',
From 0e1ed356c47e9031cc3cb00f3ab67c5373c26c1f Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 10:53:26 -0200
Subject: [PATCH 082/222] bump pytz
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
pytz é uma biblioteca que necessita ser atualizada com mais
frequencia... ela traz informações e registra as mudanças de horários de
verão, fato comum no Brasil.
---
requirements/requirements.txt | 4 ++--
setup.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 44e37516e..8f0e1c523 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -20,9 +20,9 @@ easy-thumbnails==2.5
libsass==0.17.0
python-decouple==3.1
psycopg2-binary==2.7.6.1
-
-pytz==2016.4
pyyaml==4.2b1
+pytz==2018.9
+
rtyaml==0.0.3
textract==1.5.0
unipath==1.1
diff --git a/setup.py b/setup.py
index b48c420ee..6b720f173 100644
--- a/setup.py
+++ b/setup.py
@@ -32,8 +32,8 @@ install_requires = [
'python-decouple==3.1',
'psycopg2-binary==2.7.6.1',
'pyyaml==4.2b1',
+ 'pytz==2018.9',
- 'pytz==2016.4',
'rtyaml==0.0.3',
'textract==1.5.0',
'unipath==1.1',
From 09fc9942c8a428836230e96f29002ec4cf4f3395 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 17:09:31 -0200
Subject: [PATCH 083/222] bump rtyaml
---
requirements/requirements.txt | 8 ++++----
setup.py | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 8f0e1c523..7c40f527d 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -22,8 +22,8 @@ python-decouple==3.1
psycopg2-binary==2.7.6.1
pyyaml==4.2b1
pytz==2018.9
+rtyaml==0.0.5
-rtyaml==0.0.3
textract==1.5.0
unipath==1.1
pysolr==3.6.0
@@ -32,8 +32,8 @@ gunicorn==19.6.0
WeasyPrint==0.42
whoosh==2.7.4
-#git+git://github.com/interlegis/trml2pdf.git
-#git+git://github.com/jasperlittle/django-rest-framework-docs
-#git+git://github.com/rubgombar1/django-admin-bootstrapped.git
+git+git://github.com/interlegis/trml2pdf.git
+git+git://github.com/jasperlittle/django-rest-framework-docs
+git+git://github.com/rubgombar1/django-admin-bootstrapped.git
#django-compressor==2.2
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 6b720f173..e89b7e402 100644
--- a/setup.py
+++ b/setup.py
@@ -33,8 +33,8 @@ install_requires = [
'psycopg2-binary==2.7.6.1',
'pyyaml==4.2b1',
'pytz==2018.9',
+ 'rtyaml==0.0.5',
- 'rtyaml==0.0.3',
'textract==1.5.0',
'unipath==1.1',
'pysolr==3.6.0',
From a4297969901c78aef7480c870b1df85a5a1813c0 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 17:25:08 -0200
Subject: [PATCH 084/222] bump WeasyPrint
---
requirements/requirements.txt | 6 +++---
setup.py | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 7c40f527d..0ef545cc5 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -23,13 +23,13 @@ psycopg2-binary==2.7.6.1
pyyaml==4.2b1
pytz==2018.9
rtyaml==0.0.5
+python-magic==0.4.15
+unipath==1.1
+WeasyPrint==44
textract==1.5.0
-unipath==1.1
pysolr==3.6.0
-python-magic==0.4.12
gunicorn==19.6.0
-WeasyPrint==0.42
whoosh==2.7.4
git+git://github.com/interlegis/trml2pdf.git
diff --git a/setup.py b/setup.py
index e89b7e402..370a8f3ca 100644
--- a/setup.py
+++ b/setup.py
@@ -34,13 +34,13 @@ install_requires = [
'pyyaml==4.2b1',
'pytz==2018.9',
'rtyaml==0.0.5',
+ 'WeasyPrint==44',
'textract==1.5.0',
'unipath==1.1',
'pysolr==3.6.0',
'python-magic==0.4.12',
'gunicorn==19.6.0',
- 'WeasyPrint==0.42',
'whoosh==2.7.4',
'drfdocs',
From 284c4662b4adb8b30d0b192072dc238ef8f64712 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 7 Jan 2019 17:26:39 -0200
Subject: [PATCH 085/222] bump gunicorn
---
requirements/requirements.txt | 2 +-
setup.py | 7 +++----
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 0ef545cc5..bcc15f37b 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -26,10 +26,10 @@ rtyaml==0.0.5
python-magic==0.4.15
unipath==1.1
WeasyPrint==44
+gunicorn==19.9.0
textract==1.5.0
pysolr==3.6.0
-gunicorn==19.6.0
whoosh==2.7.4
git+git://github.com/interlegis/trml2pdf.git
diff --git a/setup.py b/setup.py
index 370a8f3ca..7b750d91a 100644
--- a/setup.py
+++ b/setup.py
@@ -34,16 +34,15 @@ install_requires = [
'pyyaml==4.2b1',
'pytz==2018.9',
'rtyaml==0.0.5',
+ 'python-magic==0.4.15',
+ 'unipath==1.1',
'WeasyPrint==44',
+ 'gunicorn==19.9.0',
'textract==1.5.0',
- 'unipath==1.1',
'pysolr==3.6.0',
- 'python-magic==0.4.12',
- 'gunicorn==19.6.0',
'whoosh==2.7.4',
- 'drfdocs',
# 'git+git://github.com/interlegis/trml2pdf.git',
# 'git+git://github.com/jasperlittle/django-rest-framework-docs'
# 'git+git://github.com/rubgombar1/django-admin-bootstrapped.git''
From ac91543b0fd0a32f3f30ec881e9052d1ce9cfa58 Mon Sep 17 00:00:00 2001
From: Leandro Roberto da Silva
Date: Thu, 10 Jan 2019 20:45:58 -0200
Subject: [PATCH 086/222] Fix #2337 (#2448)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* impl data e hora manual no protocolo de matérias
* impl data e hora manual no protocolo de documentos
* ajustes de teste em protocoloadm
---
sapl/protocoloadm/forms.py | 155 +++++++++++++-----
.../migrations/0014_auto_20190110_1300.py | 35 ++++
...15_protocolo_timestamp_data_hora_manual.py | 21 +++
.../migrations/0016_auto_20190110_1345.py | 21 +++
sapl/protocoloadm/models.py | 24 ++-
sapl/protocoloadm/tests/test_protocoloadm.py | 23 ++-
sapl/protocoloadm/views.py | 41 ++++-
sapl/relatorios/views.py | 35 ++--
sapl/static/js/app.js | 1 +
sapl/templates/protocoloadm/comprovante.html | 6 +-
.../protocoloadm/protocolar_documento.html | 14 ++
.../protocoloadm/protocolar_materia.html | 62 ++++---
.../protocoloadm/protocolo_mostrar.html | 10 +-
sapl/utils.py | 18 ++
14 files changed, 369 insertions(+), 97 deletions(-)
create mode 100644 sapl/protocoloadm/migrations/0014_auto_20190110_1300.py
create mode 100644 sapl/protocoloadm/migrations/0015_protocolo_timestamp_data_hora_manual.py
create mode 100644 sapl/protocoloadm/migrations/0016_auto_20190110_1345.py
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index d0c812958..8f476d443 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -1,9 +1,9 @@
import logging
-from crispy_forms.bootstrap import InlineRadios
+from crispy_forms.bootstrap import InlineRadios, Alert
from crispy_forms.helper import FormHelper
-from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout
+from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Div
from django import forms
from django.core.exceptions import (MultipleObjectsReturned,
ObjectDoesNotExist, ValidationError)
@@ -18,11 +18,12 @@ from sapl.base.models import Autor, TipoAutor
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row
from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa,
UnidadeTramitacao)
+from sapl.protocoloadm.models import Protocolo
from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, AnoNumeroOrderingFilter,
RangeWidgetOverride, autor_label, autor_modal,
choice_anos_com_protocolo, choice_force_optional,
choice_anos_com_documentoadministrativo,
- FilterOverridesMetaMixin)
+ FilterOverridesMetaMixin, choice_anos_com_materias)
from .models import (AcompanhamentoDocumento, DocumentoAcessorioAdministrativo,
DocumentoAdministrativo,
@@ -344,6 +345,12 @@ class ProtocoloDocumentForm(ModelForm):
numero = forms.IntegerField(
required=False, label=_('Número de Protocolo (opcional)'))
+ data_hora_manual = forms.ChoiceField(
+ label=_('Informar data e hora manualmente?'),
+ widget=forms.RadioSelect(),
+ choices=YES_NO_CHOICES,
+ initial=False)
+
class Meta:
model = Protocolo
fields = ['tipo_protocolo',
@@ -352,7 +359,9 @@ class ProtocoloDocumentForm(ModelForm):
'assunto',
'interessado',
'observacao',
- 'numero'
+ 'numero',
+ 'data',
+ 'hora',
]
def __init__(self, *args, **kwargs):
@@ -360,30 +369,56 @@ class ProtocoloDocumentForm(ModelForm):
row1 = to_row(
[(InlineRadios('tipo_protocolo'), 12)])
row2 = to_row(
- [('tipo_documento', 6),
- ('numero_paginas', 6)])
- row3 = to_row(
- [('assunto', 12)])
+ [('tipo_documento', 5),
+ ('numero_paginas', 2),
+ (Div(), 1),
+ (InlineRadios('data_hora_manual'), 4),
+ ])
+ row3 = to_row([
+ (Div(), 2),
+ (Alert(
+ """
+ Usuário: {} - {}
+ IP: {} - {}
+
+ """.format(
+ kwargs['initial']['user_data_hora_manual'],
+ Protocolo._meta.get_field(
+ 'user_data_hora_manual').help_text,
+ kwargs['initial']['ip_data_hora_manual'],
+ Protocolo._meta.get_field(
+ 'ip_data_hora_manual').help_text,
+
+ ),
+ dismiss=False,
+ css_class='alert-info'), 6),
+ ('data', 2),
+ ('hora', 2),
+ ])
row4 = to_row(
- [('interessado', 12)])
+ [('assunto', 12)])
row5 = to_row(
- [('observacao', 12)])
+ [('interessado', 12)])
row6 = to_row(
+ [('observacao', 12)])
+ row7 = to_row(
[('numero', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Identificação de Documento'),
row1,
- row2,
+ row2),
+ Fieldset(_('Protocolo com data e hora informados manualmente'),
row3,
- row4,
- row5,
- HTML(" "),
- ),
+ css_id='protocolo_data_hora_manual',
+ css_class='hidden'),
+ row4,
+ row5,
+ HTML(" "),
Fieldset(_('Número do Protocolo (Apenas se quiser que a numeração comece '
'a partir do número a ser informado)'),
- row6,
+ row7,
HTML(" "),
form_actions(label=_('Protocolar Documento'))
)
@@ -419,10 +454,11 @@ class ProtocoloMateriaForm(ModelForm):
ano_materia = forms.CharField(
label=_('Ano matéria'), required=False)
- vincular_materia = forms.ChoiceField(label=_('Vincular a matéria existente?'),
- widget=forms.RadioSelect(),
- choices=YES_NO_CHOICES,
- initial=False)
+ vincular_materia = forms.ChoiceField(
+ label=_('Vincular a matéria existente?'),
+ widget=forms.RadioSelect(),
+ choices=YES_NO_CHOICES,
+ initial=False)
numero_paginas = forms.CharField(label=_('Núm. Páginas'), required=True)
@@ -435,6 +471,12 @@ class ProtocoloMateriaForm(ModelForm):
numero = forms.IntegerField(
required=False, label=_('Número de Protocolo (opcional)'))
+ data_hora_manual = forms.ChoiceField(
+ label=_('Informar data e hora manualmente?'),
+ widget=forms.RadioSelect(),
+ choices=YES_NO_CHOICES,
+ initial=False)
+
class Meta:
model = Protocolo
fields = ['tipo_materia',
@@ -446,7 +488,9 @@ class ProtocoloMateriaForm(ModelForm):
'numero_materia',
'ano_materia',
'vincular_materia',
- 'numero'
+ 'numero',
+ 'data',
+ 'hora',
]
def clean_autor(self):
@@ -506,28 +550,55 @@ class ProtocoloMateriaForm(ModelForm):
('tipo_autor', 3),
('autor', 3)])
row2 = to_row(
- [(InlineRadios('vincular_materia'), 4),
- ('numero_materia', 4),
- ('ano_materia', 4), ])
- row3 = to_row(
- [('assunto_ementa', 12)])
+ [(InlineRadios('vincular_materia'), 3),
+ ('numero_materia', 2),
+ ('ano_materia', 2),
+ (Div(), 1),
+ (InlineRadios('data_hora_manual'), 4),
+ ])
+ row3 = to_row([
+ (Div(), 2),
+ (Alert(
+ """
+ Usuário: {} - {}
+ IP: {} - {}
+
+ """.format(
+ kwargs['initial']['user_data_hora_manual'],
+ Protocolo._meta.get_field(
+ 'user_data_hora_manual').help_text,
+ kwargs['initial']['ip_data_hora_manual'],
+ Protocolo._meta.get_field(
+ 'ip_data_hora_manual').help_text,
+
+ ),
+ dismiss=False,
+ css_class='alert-info'), 6),
+ ('data', 2),
+ ('hora', 2),
+ ])
row4 = to_row(
- [('observacao', 12)])
+ [('assunto_ementa', 12)])
row5 = to_row(
+ [('observacao', 12)])
+ row6 = to_row(
[('numero', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(_('Identificação da Matéria'),
row1,
- row2,
+ row2),
+ Fieldset(_('Protocolo com data e hora informados manualmente'),
row3,
- row4,
- HTML(" "),
- ),
+ css_id='protocolo_data_hora_manual',
+ css_class='hidden'),
+ row4,
+ row5,
+ HTML(" "),
Fieldset(_('Número do Protocolo (Apenas se quiser que a numeração comece'
' a partir do número a ser informado)'),
- row5,
+ row6,
HTML(" "),
form_actions(label=_('Protocolar Matéria')))
)
@@ -855,15 +926,15 @@ class DesvincularDocumentoForm(ModelForm):
logger = logging.getLogger(__name__)
- numero = forms.CharField(required=True,
- label=DocumentoAdministrativo._meta.
- get_field('numero').verbose_name
- )
- ano = forms.ChoiceField(required=True,
- label=DocumentoAdministrativo._meta.
- get_field('ano').verbose_name,
- choices=RANGE_ANOS,
- widget=forms.Select(attrs={'class': 'selector'}))
+ numero = forms.CharField(
+ required=True,
+ label=DocumentoAdministrativo._meta.get_field('numero').verbose_name)
+
+ ano = forms.ChoiceField(
+ required=True,
+ label=DocumentoAdministrativo._meta.get_field('ano').verbose_name,
+ choices=choice_anos_com_documentoadministrativo,
+ widget=forms.Select(attrs={'class': 'selector'}))
def clean(self):
super(DesvincularDocumentoForm, self).clean()
@@ -929,7 +1000,7 @@ class DesvincularMateriaForm(forms.Form):
label=_('Número da Matéria'))
ano = forms.ChoiceField(required=True,
label=_('Ano da Matéria'),
- choices=RANGE_ANOS,
+ choices=choice_anos_com_materias,
widget=forms.Select(attrs={'class': 'selector'}))
tipo = forms.ModelChoiceField(label=_('Tipo de Matéria'),
required=True,
diff --git a/sapl/protocoloadm/migrations/0014_auto_20190110_1300.py b/sapl/protocoloadm/migrations/0014_auto_20190110_1300.py
new file mode 100644
index 000000000..56cdf8d36
--- /dev/null
+++ b/sapl/protocoloadm/migrations/0014_auto_20190110_1300.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2019-01-10 15:00
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('protocoloadm', '0013_auto_20190106_1336'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='protocolo',
+ name='ip_data_hora_manual',
+ field=models.CharField(blank=True, help_text='Endereço IP da estação de trabalho do usuário que está realizando Protocolo e informando data e hora manualmente.', max_length=15, verbose_name='IP'),
+ ),
+ migrations.AddField(
+ model_name='protocolo',
+ name='user_data_hora_manual',
+ field=models.CharField(blank=True, help_text='Usuário que está realizando Protocolo e informando data e hora manualmente.', max_length=20, verbose_name='IP'),
+ ),
+ migrations.AlterField(
+ model_name='protocolo',
+ name='data',
+ field=models.DateField(blank=True, help_text='Informado manualmente', null=True, verbose_name='Data do Protocolo'),
+ ),
+ migrations.AlterField(
+ model_name='protocolo',
+ name='hora',
+ field=models.TimeField(blank=True, help_text='Informado manualmente', null=True, verbose_name='Hora do Protocolo'),
+ ),
+ ]
diff --git a/sapl/protocoloadm/migrations/0015_protocolo_timestamp_data_hora_manual.py b/sapl/protocoloadm/migrations/0015_protocolo_timestamp_data_hora_manual.py
new file mode 100644
index 000000000..85554edad
--- /dev/null
+++ b/sapl/protocoloadm/migrations/0015_protocolo_timestamp_data_hora_manual.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2019-01-10 15:43
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('protocoloadm', '0014_auto_20190110_1300'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='protocolo',
+ name='timestamp_data_hora_manual',
+ field=models.DateTimeField(default=django.utils.timezone.now),
+ ),
+ ]
diff --git a/sapl/protocoloadm/migrations/0016_auto_20190110_1345.py b/sapl/protocoloadm/migrations/0016_auto_20190110_1345.py
new file mode 100644
index 000000000..71f2b7f7a
--- /dev/null
+++ b/sapl/protocoloadm/migrations/0016_auto_20190110_1345.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.8 on 2019-01-10 15:45
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('protocoloadm', '0015_protocolo_timestamp_data_hora_manual'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='protocolo',
+ name='timestamp',
+ field=models.DateTimeField(blank=True, default=django.utils.timezone.now, null=True),
+ ),
+ ]
diff --git a/sapl/protocoloadm/models.py b/sapl/protocoloadm/models.py
index 6d3d90671..e335a5db1 100644
--- a/sapl/protocoloadm/models.py
+++ b/sapl/protocoloadm/models.py
@@ -57,13 +57,29 @@ class Protocolo(models.Model):
choices=RANGE_ANOS,
verbose_name=_('Ano do Protocolo'))
- # FIXME: https://github.com/interlegis/sapl/issues/2337
- data = models.DateField(null=True, blank=True)
- hora = models.TimeField(null=True, blank=True)
+ data = models.DateField(null=True, blank=True,
+ verbose_name=_('Data do Protocolo'),
+ help_text=_('Informado manualmente'))
+ hora = models.TimeField(null=True, blank=True,
+ verbose_name=_('Hora do Protocolo'),
+ help_text=_('Informado manualmente'))
+ timestamp_data_hora_manual = models.DateTimeField(default=timezone.now)
+ user_data_hora_manual = models.CharField(
+ max_length=20, blank=True,
+ verbose_name=_('IP'),
+ help_text=_('Usuário que está realizando Protocolo e informando '
+ 'data e hora manualmente.'))
+ ip_data_hora_manual = models.CharField(
+ max_length=15, blank=True,
+ verbose_name=_('IP'),
+ help_text=_('Endereço IP da estação de trabalho '
+ 'do usuário que está realizando Protocolo e informando '
+ 'data e hora manualmente.'))
# Não foi utilizado auto_now_add=True em timestamp porque
# ele usa datetime.now que não é timezone aware.
- timestamp = models.DateTimeField(default=timezone.now)
+ timestamp = models.DateTimeField(
+ default=timezone.now, null=True, blank=True)
tipo_protocolo = models.PositiveIntegerField(
blank=True, null=True, verbose_name=_('Tipo de Protocolo'))
tipo_processo = models.PositiveIntegerField()
diff --git a/sapl/protocoloadm/tests/test_protocoloadm.py b/sapl/protocoloadm/tests/test_protocoloadm.py
index 2a4c9f53c..c7e4bc341 100644
--- a/sapl/protocoloadm/tests/test_protocoloadm.py
+++ b/sapl/protocoloadm/tests/test_protocoloadm.py
@@ -1,4 +1,4 @@
-from datetime import date, timedelta
+from datetime import date, timedelta, datetime
from django.core.urlresolvers import reverse
from django.utils import timezone
@@ -392,29 +392,42 @@ def test_documento_administrativo_protocolo_inexistente():
def test_protocolo_documento_form_invalido():
- form = ProtocoloDocumentForm(data={})
+ form = ProtocoloDocumentForm(
+ data={},
+ initial={
+ 'user_data_hora_manual': '',
+ 'ip_data_hora_manual': '',
+ 'data': timezone.localdate(timezone.now()),
+ 'hora': timezone.localtime(timezone.now())})
assert not form.is_valid()
errors = form.errors
+ assert errors['data_hora_manual'] == [_('Este campo é obrigatório.')]
assert errors['tipo_protocolo'] == [_('Este campo é obrigatório.')]
assert errors['interessado'] == [_('Este campo é obrigatório.')]
assert errors['tipo_documento'] == [_('Este campo é obrigatório.')]
assert errors['numero_paginas'] == [_('Este campo é obrigatório.')]
assert errors['assunto'] == [_('Este campo é obrigatório.')]
- assert len(errors) == 5
+ assert len(errors) == 6
def test_protocolo_materia_invalido():
- form = ProtocoloMateriaForm(data={})
+ form = ProtocoloMateriaForm(data={},
+ initial={
+ 'user_data_hora_manual': '',
+ 'ip_data_hora_manual': '',
+ 'data': timezone.localdate(timezone.now()),
+ 'hora': timezone.localtime(timezone.now())})
assert not form.is_valid()
errors = form.errors
+ assert errors['data_hora_manual'] == [_('Este campo é obrigatório.')]
assert errors['assunto_ementa'] == [_('Este campo é obrigatório.')]
assert errors['tipo_autor'] == [_('Este campo é obrigatório.')]
assert errors['tipo_materia'] == [_('Este campo é obrigatório.')]
@@ -422,4 +435,4 @@ def test_protocolo_materia_invalido():
assert errors['autor'] == [_('Este campo é obrigatório.')]
assert errors['vincular_materia'] == [_('Este campo é obrigatório.')]
- assert len(errors) == 6
+ assert len(errors) == 7
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
index 8dd7e9e47..f91ee5227 100755
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -492,6 +492,15 @@ class ProtocoloDocumentoView(PermissionRequiredMixin,
return reverse('sapl.protocoloadm:protocolo_mostrar',
kwargs={'pk': self.object.id})
+ def get_initial(self):
+ initial = super().get_initial()
+
+ initial['user_data_hora_manual'] = self.request.user.username
+ initial['ip_data_hora_manual'] = get_client_ip(self.request)
+ initial['data'] = timezone.localdate(timezone.now())
+ initial['hora'] = timezone.localtime(timezone.now())
+ return initial
+
def form_valid(self, form):
protocolo = form.save(commit=False)
username = self.request.user.username
@@ -538,6 +547,17 @@ class ProtocoloDocumentoView(PermissionRequiredMixin,
return self.render_to_response(self.get_context_data())
protocolo.ano = timezone.now().year
protocolo.assunto_ementa = self.request.POST['assunto']
+
+ if form.cleaned_data['data_hora_manual'] == 'True':
+ protocolo.timestamp = None
+ protocolo.user_data_hora_manual = username
+ protocolo.ip_data_hora_manual = get_client_ip(self.request)
+ else:
+ protocolo.data = None
+ protocolo.hora = None
+ protocolo.user_data_hora_manual = ''
+ protocolo.ip_data_hora_manual = ''
+
protocolo.save()
self.object = protocolo
return redirect(self.get_success_url())
@@ -659,6 +679,15 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView):
return reverse('sapl.protocoloadm:materia_continuar', kwargs={
'pk': protocolo.pk})
+ def get_initial(self):
+ initial = super().get_initial()
+
+ initial['user_data_hora_manual'] = self.request.user.username
+ initial['ip_data_hora_manual'] = get_client_ip(self.request)
+ initial['data'] = timezone.localdate(timezone.now())
+ initial['hora'] = timezone.localtime(timezone.now())
+ return initial
+
def form_valid(self, form):
protocolo = form.save(commit=False)
username = self.request.user.username
@@ -719,6 +748,16 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView):
protocolo.observacao = self.request.POST['observacao']
protocolo.assunto_ementa = self.request.POST['assunto_ementa']
+ if form.cleaned_data['data_hora_manual'] == 'True':
+ protocolo.timestamp = None
+ protocolo.user_data_hora_manual = username
+ protocolo.ip_data_hora_manual = get_client_ip(self.request)
+ else:
+ protocolo.data = None
+ protocolo.hora = None
+ protocolo.user_data_hora_manual = ''
+ protocolo.ip_data_hora_manual = ''
+
protocolo.save()
data = form.cleaned_data
if data['vincular_materia'] == 'True':
@@ -1168,4 +1207,4 @@ class FichaSelecionaAdmView(PermissionRequiredMixin, FormView):
context['documento'] = documento
return gerar_pdf_impressos(self.request, context,
- 'materia/impressos/ficha_adm_pdf.html')
\ No newline at end of file
+ 'materia/impressos/ficha_adm_pdf.html')
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index 0c5dfd377..f4bc8cda2 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -1,7 +1,7 @@
+from datetime import datetime as dt
import html
-import re
import logging
-from datetime import datetime as dt
+import re
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404, HttpResponse
@@ -581,7 +581,6 @@ def get_sessao_plenaria(sessao, casa):
if dic_expedientes:
lst_expedientes.append(dic_expedientes)
-
# Lista das matérias do Expediente, incluindo o resultado das votacoes
lst_expediente_materia = []
for expediente_materia in ExpedienteMateria.objects.filter(
@@ -612,7 +611,8 @@ def get_sessao_plenaria(sessao, casa):
dic_expediente_materia["nom_autor"] = ''
autoria = materia.autoria_set.all()
- dic_expediente_materia['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor'
+ dic_expediente_materia['num_autores'] = 'Autores' if len(
+ autoria) > 1 else 'Autor'
if autoria:
for a in autoria:
if a.autor.nome:
@@ -687,7 +687,7 @@ def get_sessao_plenaria(sessao, casa):
numeracao = materia.numeracao_set.first()
if numeracao:
-
+
dic_votacao["des_numeracao"] = (
str(numeracao.numero_materia) +
'/' +
@@ -762,7 +762,6 @@ def get_sessao_plenaria(sessao, casa):
lst_ocorrencias.append(o)
-
return (inf_basicas_dic,
lst_mesa,
lst_presenca_sessao,
@@ -810,10 +809,12 @@ def relatorio_sessao_plenaria(request, pk):
imagem = get_imagem(casa)
try:
- logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(pk))
+ logger.debug("user=" + username +
+ ". Tentando obter SessaoPlenaria com id={}.".format(pk))
sessao = SessaoPlenaria.objects.get(id=pk)
except ObjectDoesNotExist as e:
- logger.error("user=" + username + ". Essa SessaoPlenaria não existe (pk={}). ".format(pk) + str(e))
+ logger.error("user=" + username +
+ ". Essa SessaoPlenaria não existe (pk={}). ".format(pk) + str(e))
raise Http404('Essa página não existe')
(inf_basicas_dic,
@@ -828,11 +829,10 @@ def relatorio_sessao_plenaria(request, pk):
lst_oradores,
lst_ocorrencias) = get_sessao_plenaria(sessao, casa)
-
for idx in range(len(lst_expedientes)):
txt_expedientes = lst_expedientes[idx]['txt_expediente']
txt_expedientes = TrocaTag(txt_expedientes, '', 6, 6,
- 'expedientes', '')
lst_expedientes[idx]['txt_expediente'] = txt_expedientes
pdf = pdf_sessao_plenaria_gerar.principal(
@@ -868,7 +868,7 @@ def get_protocolos(prots):
ts.strftime("%H:%m")
else:
dic['data'] = protocolo.data.strftime("%d/%m/%Y") + ' - Horário: ' \
- + protocolo.hora.strftime("%H:%m")
+ + protocolo.hora.strftime("%H:%m")
dic['txt_assunto'] = protocolo.assunto_ementa
@@ -979,8 +979,8 @@ def get_etiqueta_protocolos(prots):
dic['titulo'] = str(p.numero) + '/' + str(p.ano)
- tz_hora = timezone.localtime(p.timestamp)
if p.timestamp:
+ tz_hora = timezone.localtime(p.timestamp)
dic['data'] = 'Data: ' + tz_hora.strftime(
"%d/%m/%Y") + ' - Horário: ' + tz_hora.strftime("%H:%M")
else:
@@ -1072,7 +1072,8 @@ def get_pauta_sessao(sessao, casa):
id=expediente_materia.materia.id).first()
dic_expediente_materia = {}
- dic_expediente_materia["tipo_materia"] = materia.tipo.sigla + ' - ' + materia.tipo.descricao
+ dic_expediente_materia["tipo_materia"] = materia.tipo.sigla + \
+ ' - ' + materia.tipo.descricao
dic_expediente_materia["num_ordem"] = str(
expediente_materia.numero_ordem)
dic_expediente_materia["id_materia"] = str(
@@ -1090,7 +1091,8 @@ def get_pauta_sessao(sessao, casa):
dic_expediente_materia["nom_autor"] = ''
autoria = materia.autoria_set.all()
- dic_expediente_materia['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor'
+ dic_expediente_materia['num_autores'] = 'Autores' if len(
+ autoria) > 1 else 'Autor'
if autoria:
for a in autoria:
if a.autor.nome:
@@ -1112,7 +1114,8 @@ def get_pauta_sessao(sessao, casa):
materia = MateriaLegislativa.objects.filter(
id=votacao.materia.id).first()
dic_votacao = {}
- dic_votacao["tipo_materia"] = materia.tipo.sigla + ' - ' + materia.tipo.descricao
+ dic_votacao["tipo_materia"] = materia.tipo.sigla + \
+ ' - ' + materia.tipo.descricao
dic_votacao["num_ordem"] = votacao.numero_ordem
dic_votacao["id_materia"] = str(
materia.numero) + "/" + str(materia.ano)
@@ -1124,7 +1127,7 @@ def get_pauta_sessao(sessao, casa):
numeracao = Numeracao.objects.filter(materia=votacao.materia).first()
if numeracao:
dic_votacao["des_numeracao"] = str(
- numeracao.numero_materia) + '/' + str(numeracao.ano_materia)
+ numeracao.numero_materia) + '/' + str(numeracao.ano_materia)
turno, tramitacao = get_turno(materia)
dic_votacao["des_turno"] = turno
diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js
index 48777c0e3..d3616a8b5 100644
--- a/sapl/static/js/app.js
+++ b/sapl/static/js/app.js
@@ -47,6 +47,7 @@ function refreshMask() {
$('.dateinput').mask('00/00/0000', {placeholder:"__/__/____"});
$('.hora').mask("00:00", {placeholder:"hh:mm"});
$('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"});
+ $('.timeinput').mask("00:00:00", {placeholder:"hh:mm:ss"});
$('.cronometro').mask("00:00:00", {placeholder:"hh:mm:ss"});
}
diff --git a/sapl/templates/protocoloadm/comprovante.html b/sapl/templates/protocoloadm/comprovante.html
index d285b4e4f..23d299ecf 100644
--- a/sapl/templates/protocoloadm/comprovante.html
+++ b/sapl/templates/protocoloadm/comprovante.html
@@ -65,7 +65,11 @@
Data / Horário
- {{ protocolo.timestamp|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }}
+ {% if protocolo.timestamp %}
+ {{ protocolo.timestamp|date:"d/m/Y" }} - {{ protocolo.timestamp|date:"H:i:s" }}
+ {% else %}
+ {{ protocolo.data|date:"d/m/Y" }} - {{ protocolo.hora|date:"H:i:s" }}
+ {% endif %}
{% if protocolo.tipo_processo == 1 %}
diff --git a/sapl/templates/protocoloadm/protocolar_documento.html b/sapl/templates/protocoloadm/protocolar_documento.html
index 5cb1fa789..49cf4933f 100644
--- a/sapl/templates/protocoloadm/protocolar_documento.html
+++ b/sapl/templates/protocoloadm/protocolar_documento.html
@@ -14,3 +14,17 @@
{% block detail_content %}
{% crispy form %}
{% endblock detail_content %}
+
+{% block extra_js %}
+
+{% endblock %}
diff --git a/sapl/templates/protocoloadm/protocolar_materia.html b/sapl/templates/protocoloadm/protocolar_materia.html
index db3785bd6..2dcb8b4f0 100644
--- a/sapl/templates/protocoloadm/protocolar_materia.html
+++ b/sapl/templates/protocoloadm/protocolar_materia.html
@@ -26,35 +26,43 @@
}
$(document).ready(function() {
- function busca_ementa() {
- var vincular_materia = $("#id_vincular_materia_1").prop("checked");
- var ano_materia = $("#id_ano_materia").val();
- var numero_materia = $("#id_numero_materia").val();
- var tipo_materia = $("#id_tipo_materia").val();
- var json_data = {
- ano : ano_materia,
- numero : numero_materia,
- tipo : tipo_materia
- }
- if (vincular_materia === true && ano_materia !== undefined &&
- numero_materia !== undefined && numero_materia !== "") {
- $.getJSON("/protocoloadm/recuperar-materia", json_data, function(data){
- if (data) {
- if (data['error'] === undefined){
- $('#id_assunto_ementa').val(data['ementa']);
- if (data['autor'] !== undefined) {
- $('#id_autor').val(data['autor']);
- $('#id_tipo_autor').val(data['tipo_autor']);
+ $("input[name=data_hora_manual]").change(function(event) {
+ if (this.value === 'True' && this.checked)
+ $("#protocolo_data_hora_manual").removeClass('hidden');
+ else if (this.value === 'False' && this.checked)
+ $("#protocolo_data_hora_manual").addClass('hidden');
+ });
+ $("input[name=data_hora_manual]").trigger('change')
+
+ function busca_ementa() {
+ var vincular_materia = $("#id_vincular_materia_1").prop("checked");
+ var ano_materia = $("#id_ano_materia").val();
+ var numero_materia = $("#id_numero_materia").val();
+ var tipo_materia = $("#id_tipo_materia").val();
+ var json_data = {
+ ano : ano_materia,
+ numero : numero_materia,
+ tipo : tipo_materia
+ }
+ if (vincular_materia === true && ano_materia !== undefined &&
+ numero_materia !== undefined && numero_materia !== "") {
+ $.getJSON("/protocoloadm/recuperar-materia", json_data, function(data){
+ if (data) {
+ if (data['error'] === undefined){
+ $('#id_assunto_ementa').val(data['ementa']);
+ if (data['autor'] !== undefined) {
+ $('#id_autor').val(data['autor']);
+ $('#id_tipo_autor').val(data['tipo_autor']);
- }
- }
- }
- })
- }
+ }
+ }
+ }
+ })
+ }
};
- $("#id_ano_materia").blur(busca_ementa);
- $("#id_numero_materia").blur(busca_ementa);
- $("#id_tipo_materia").change(busca_ementa);
+ $("#id_ano_materia").blur(busca_ementa);
+ $("#id_numero_materia").blur(busca_ementa);
+ $("#id_tipo_materia").change(busca_ementa);
$("#id_tipo_autor").change(function() {
var tipo_selecionado = $("#id_tipo_autor").val();
diff --git a/sapl/templates/protocoloadm/protocolo_mostrar.html b/sapl/templates/protocoloadm/protocolo_mostrar.html
index 2cac987f3..d22464397 100644
--- a/sapl/templates/protocoloadm/protocolo_mostrar.html
+++ b/sapl/templates/protocoloadm/protocolo_mostrar.html
@@ -4,6 +4,14 @@
{% load crispy_forms_tags %}
{% load static %}
+{% block actions %}
+
+ {{ block.super }}
+
+{% endblock %}
+
{% block detail_content %}
Protocolo: {{ protocolo.numero|stringformat:'06d' }}/{{ protocolo.ano }} -
@@ -12,7 +20,7 @@
{% if protocolo.timestamp %}
Data Protocolo: {{ protocolo.timestamp|localtime|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ protocolo.timestamp|localtime|date:"G:i:s" }}
{% else %}
- Data Protocolo: {{ protocolo.data|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ protocolo.hora|date:"G:i:s" }}
+ Data Protocolo: {{ protocolo.data|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ protocolo.hora|date:"G:i:s" }} - {% if not protocolo.timestamp %} Informado Manualmente por: {{protocolo.user_data_hora_manual}}{% endif %}
{% endif %}
{% if protocolo.tipo_processo == 0 %}
diff --git a/sapl/utils.py b/sapl/utils.py
index 706d5cb65..eb26cadb1 100644
--- a/sapl/utils.py
+++ b/sapl/utils.py
@@ -18,6 +18,7 @@ from django.core.exceptions import ValidationError
from django.core.mail import get_connection
from django.db import models
from django.db.models import Q
+from django.forms.widgets import SplitDateTimeWidget
from django.utils import six, timezone
from django.utils.translation import ugettext_lazy as _
import django_filters
@@ -234,6 +235,23 @@ class RangeWidgetOverride(forms.MultiWidget):
return '%s
' % html
+class CustomSplitDateTimeWidget(SplitDateTimeWidget):
+ def render(self, name, value, attrs=None, renderer=None):
+ rendered_widgets = []
+ for i, x in enumerate(self.widgets):
+ x.attrs['class'] += ' form-control'
+ rendered_widgets.append(
+ x.render(
+ '%s_%d' % (name, i), self.decompress(
+ value)[i] if value else ''
+ )
+ )
+
+ html = '%s
%s
'\
+ % tuple(rendered_widgets)
+ return '%s
' % html
+
+
def register_all_models_in_admin(module_name, exclude_list=[]):
appname = module_name.split('.')
appname = appname[1] if appname[0] == 'sapl' else appname[0]
From 5bbfbc4b74819351d8474a9d4f5fd42234b7f0eb Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 10 Jan 2019 20:51:51 -0200
Subject: [PATCH 087/222] =?UTF-8?q?add=20informa=C3=A7=C3=A3o=20na=20lista?=
=?UTF-8?q?=20de=20protocolos?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/protocoloadm/protocolo_filter.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/protocoloadm/protocolo_filter.html b/sapl/templates/protocoloadm/protocolo_filter.html
index 316003075..d3d1968d8 100644
--- a/sapl/templates/protocoloadm/protocolo_filter.html
+++ b/sapl/templates/protocoloadm/protocolo_filter.html
@@ -47,7 +47,7 @@
{% if p.timestamp%}
Data Protocolo: {{ p.timestamp|localtime|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ p.timestamp|localtime|date:"G:i:s" }}
{% else %}
- Data Protocolo: {{ p.data|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ p.hora|date:"G:i:s" }}
+ Data Protocolo: {{ p.data|date:"d/m/Y"|default_if_none:"Não informado" }} - Horário: {{ p.hora|date:"G:i:s" }} - {% if not p.timestamp %} Informado Manualmente por: {{p.user_data_hora_manual}}{% endif %}
{% endif %}
{% if p.tipo_processo == 0 %}
Interessado: {{ p.interessado|default_if_none:"Não informado" }}
From 091f566688363e3c8693c8d315e1b4ed898dfe38 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Fri, 11 Jan 2019 12:07:40 -0200
Subject: [PATCH 088/222] HOT-FIX: insere EMAIL_SEND_USER em docs e envs.
---
config/env-sample | 1 +
config/env_dockerfile | 1 +
docker-compose.yml | 1 +
docs/instalacao31.rst | 1 +
sapl/.env_test | 1 +
sapl/env-backup | 1 +
6 files changed, 6 insertions(+)
diff --git a/config/env-sample b/config/env-sample
index bde081a92..aeb8c38c4 100644
--- a/config/env-sample
+++ b/config/env-sample
@@ -5,4 +5,5 @@ EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST = ''
EMAIL_HOST_USER = ''
+EMAIL_SEND_USER = ''
EMAIL_HOST_PASSWORD = ''
diff --git a/config/env_dockerfile b/config/env_dockerfile
index c83fc88f1..134beb274 100644
--- a/config/env_dockerfile
+++ b/config/env_dockerfile
@@ -5,4 +5,5 @@ EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST = ''
EMAIL_HOST_USER = ''
+EMAIL_SEND_USER = ''
EMAIL_HOST_PASSWORD = ''
diff --git a/docker-compose.yml b/docker-compose.yml
index c796253d4..51af52a6b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -21,6 +21,7 @@ sapl:
EMAIL_USE_TLS: 'False'
EMAIL_HOST: smtp.dominio.net
EMAIL_HOST_USER: usuariosmtp
+ EMAIL_SEND_USER: usuariosmtp
EMAIL_HOST_PASSWORD: senhasmtp
TZ: America/Sao_Paulo
volumes:
diff --git a/docs/instalacao31.rst b/docs/instalacao31.rst
index e904f8d6c..6e9146ee4 100644
--- a/docs/instalacao31.rst
+++ b/docs/instalacao31.rst
@@ -147,6 +147,7 @@ Criação da `SECRET_KEY
Date: Wed, 16 Jan 2019 10:57:00 -0200
Subject: [PATCH 089/222] HOT-FIX: corrige form e view no cadastro de Frentes
---
sapl/parlamentares/views.py | 11 ++++++++++-
sapl/templates/parlamentares/frente_form.html | 19 +++++++++----------
2 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index c47d36566..7b09c4067 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -301,9 +301,18 @@ class FrenteCrud(Crud):
def form_valid(self, form):
return super(Crud.CreateView, self).form_valid(form)
+ class DetailView(Crud.DetailView):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['subnav_template_name'] = ''
+ return context
+
class UpdateView(Crud.UpdateView):
form_class = FrenteForm
-
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['subnav_template_name'] = ''
+ return context
class MandatoCrud(MasterDetailCrud):
diff --git a/sapl/templates/parlamentares/frente_form.html b/sapl/templates/parlamentares/frente_form.html
index bbab780ae..1d71f6b76 100644
--- a/sapl/templates/parlamentares/frente_form.html
+++ b/sapl/templates/parlamentares/frente_form.html
@@ -57,16 +57,15 @@
function selecionar_parlamentares_frente() {
// Seleciona automaticamente todos os parlamentares
// que já estão presentes naquela frente
- var update_view = {{ update_view }}
- if (update_view == 1) {
- var frente_id = {{ object.id }}
- $.get("/sistema/frente/parlamentares-frente-selected",
- {frente_id: frente_id},
- function (data) {
- id_list = data['id_list'];
- $("div.controls select").val(id_list);
- });
- }
+ {% if object.id %}
+ var frente_id = {{ object.id }}
+ $.get("/sistema/frente/parlamentares-frente-selected",
+ {frente_id: frente_id},
+ function (data) {
+ id_list = data['id_list'];
+ $("div.controls select").val(id_list);
+ });
+ {% endif %}
}
function atualiza_parlamentares() {
From a07e9ca39e156a3b0dd31dd0076feaf61f06fbdc Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 16 Jan 2019 11:11:34 -0200
Subject: [PATCH 090/222] HOT-FIX: corrige html em frente_form.html
---
sapl/static/js/app.js | 2 +-
sapl/templates/parlamentares/frente_form.html | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js
index d3616a8b5..c30f357bd 100644
--- a/sapl/static/js/app.js
+++ b/sapl/static/js/app.js
@@ -190,7 +190,7 @@ function OptionalCustomFrontEnd() {
if (_label.length === 0) {
_label = $('label[for='+this.id+']');
if (_label.length === 0) {
- _label = $(' ').insertBefore(this)
+ _label = $(' ').insertBefore(this)
}
}
diff --git a/sapl/templates/parlamentares/frente_form.html b/sapl/templates/parlamentares/frente_form.html
index 1d71f6b76..03cd79169 100644
--- a/sapl/templates/parlamentares/frente_form.html
+++ b/sapl/templates/parlamentares/frente_form.html
@@ -26,7 +26,8 @@
From 2277ba56aea29b10db6252744ab93884b09a30ea Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 16 Jan 2019 11:16:58 -0200
Subject: [PATCH 091/222] =?UTF-8?q?corrige=20pre-sele=C3=A7=C3=A3o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/parlamentares/frente_form.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/parlamentares/frente_form.html b/sapl/templates/parlamentares/frente_form.html
index 03cd79169..7f13a076e 100644
--- a/sapl/templates/parlamentares/frente_form.html
+++ b/sapl/templates/parlamentares/frente_form.html
@@ -64,7 +64,7 @@
{frente_id: frente_id},
function (data) {
id_list = data['id_list'];
- $("div.controls select").val(id_list);
+ $("id_parlamentares").val(id_list);
});
{% endif %}
}
From 836268d39d5097fd427fbf07759312ac195675c4 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 16 Jan 2019 11:16:58 -0200
Subject: [PATCH 092/222] =?UTF-8?q?corrige=20pre-sele=C3=A7=C3=A3o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/parlamentares/frente_form.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/parlamentares/frente_form.html b/sapl/templates/parlamentares/frente_form.html
index 7f13a076e..b38b487bd 100644
--- a/sapl/templates/parlamentares/frente_form.html
+++ b/sapl/templates/parlamentares/frente_form.html
@@ -64,7 +64,7 @@
{frente_id: frente_id},
function (data) {
id_list = data['id_list'];
- $("id_parlamentares").val(id_list);
+ $("#id_parlamentares").val(id_list);
});
{% endif %}
}
From 8ef52003c30baa487e360d07010ceb0209b1b0cf Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 16 Jan 2019 11:26:53 -0200
Subject: [PATCH 093/222] retira menu de parlamentares do cadastro de
FrenteCrud
---
sapl/parlamentares/views.py | 115 ++++++++++++++++++++++--------------
1 file changed, 71 insertions(+), 44 deletions(-)
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index 7b09c4067..aa636df79 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -1,6 +1,6 @@
+from datetime import datetime
import json
import logging
-from datetime import datetime
from django.contrib import messages
from django.contrib.contenttypes.models import ContentType
@@ -35,6 +35,7 @@ from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa,
NivelInstrucao, Parlamentar, Partido, SessaoLegislativa,
SituacaoMilitar, TipoAfastamento, TipoDependente, Votante)
+
CargoMesaCrud = CrudAux.build(CargoMesa, 'cargo_mesa')
PartidoCrud = CrudAux.build(Partido, 'partidos')
TipoDependenteCrud = CrudAux.build(TipoDependente, 'tipo_dependente')
@@ -45,6 +46,7 @@ TipoMilitarCrud = CrudAux.build(SituacaoMilitar, 'tipo_situa_militar')
DependenteCrud = MasterDetailCrud.build(
Dependente, 'parlamentar', 'dependente')
+
class SessaoLegislativaCrud(CrudAux):
model = SessaoLegislativa
@@ -54,6 +56,7 @@ class SessaoLegislativaCrud(CrudAux):
class UpdateView(CrudAux.UpdateView):
form_class = SessaoLegislativaForm
+
class VotanteView(MasterDetailCrud):
model = Votante
parent_field = 'parlamentar'
@@ -89,6 +92,7 @@ class FrenteList(MasterDetailCrud):
class BaseMixin(Crud.PublicMixin, MasterDetailCrud.BaseMixin):
list_field_names = ['nome', 'data_criacao', 'data_extincao']
+
@classmethod
def url_name(cls, suffix):
return '%s_parlamentar_%s' % (cls.model._meta.model_name, suffix)
@@ -276,13 +280,16 @@ def parlamentares_frente_selected(request):
logger = logging.getLogger(__name__)
username = request.user.username
try:
- logger.info("user=" + username + ". Tentando objet objeto Frente com id={}.".format(request.GET['frente_id']))
+ logger.info("user=" + username +
+ ". Tentando objet objeto Frente com id={}.".format(request.GET['frente_id']))
frente = Frente.objects.get(id=int(request.GET['frente_id']))
except ObjectDoesNotExist:
- logger.error("user=" + username + ". Frente buscada (id={}) não existe. Retornada lista vazia.".format(request.GET['frente_id']))
+ logger.error("user=" + username +
+ ". Frente buscada (id={}) não existe. Retornada lista vazia.".format(request.GET['frente_id']))
lista_parlamentar_id = []
else:
- logger.info("user=" + username + ". Frente (id={}) encontrada com sucesso.".format(request.GET['frente_id']))
+ logger.info("user=" + username +
+ ". Frente (id={}) encontrada com sucesso.".format(request.GET['frente_id']))
lista_parlamentar_id = frente.parlamentares.all().values_list(
'id', flat=True)
return JsonResponse({'id_list': list(lista_parlamentar_id)})
@@ -292,8 +299,14 @@ class FrenteCrud(Crud):
model = Frente
help_topic = 'tipo_situa_militar'
public = [RP_DETAIL, RP_LIST]
- list_field_names = ['nome', 'data_criacao', 'data_extincao', 'parlamentares']
+ list_field_names = ['nome', 'data_criacao',
+ 'data_extincao', 'parlamentares']
+ class BaseMixin(Crud.BaseMixin):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context['subnav_template_name'] = ''
+ return context
class CreateView(Crud.CreateView):
form_class = FrenteForm
@@ -301,18 +314,8 @@ class FrenteCrud(Crud):
def form_valid(self, form):
return super(Crud.CreateView, self).form_valid(form)
- class DetailView(Crud.DetailView):
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context['subnav_template_name'] = ''
- return context
-
class UpdateView(Crud.UpdateView):
form_class = FrenteForm
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context['subnav_template_name'] = ''
- return context
class MandatoCrud(MasterDetailCrud):
@@ -369,7 +372,7 @@ class ComposicaoColigacaoCrud(MasterDetailCrud):
class LegislaturaCrud(CrudAux):
-
+
model = Legislatura
help_topic = 'legislatura'
@@ -380,11 +383,13 @@ class LegislaturaCrud(CrudAux):
def get_initial(self):
username = self.request.user.username
try:
- self.logger.error("user=" + username + ". Tentando obter última Legislatura.")
+ self.logger.error("user=" + username +
+ ". Tentando obter última Legislatura.")
ultima_legislatura = Legislatura.objects.latest('numero')
numero = ultima_legislatura.numero + 1
except Legislatura.DoesNotExist:
- self.logger.error("user=" + username + ". Legislatura não encontrada. Número definido como 1.")
+ self.logger.error(
+ "user=" + username + ". Legislatura não encontrada. Número definido como 1.")
numero = 1
return {'numero': numero}
@@ -485,10 +490,12 @@ class ParlamentarCrud(Crud):
def take_legislatura_id(self):
username = self.request.user.username
try:
- self.logger.debug("user=" + username + ". Tentando obter id da legislatura.")
+ self.logger.debug("user=" + username +
+ ". Tentando obter id da legislatura.")
return int(self.request.GET['pk'])
except:
- self.logger.error("user=" + username + ". Legislatura não possui ID. Buscando em todas as entradas.")
+ self.logger.error(
+ "user=" + username + ". Legislatura não possui ID. Buscando em todas as entradas.")
legislaturas = Legislatura.objects.all()
for l in legislaturas:
if l.atual():
@@ -510,14 +517,17 @@ class ParlamentarCrud(Crud):
mandato_titular=F('mandato__titular')).distinct()
else:
try:
- self.logger.debug("user=" + username + ". Tentando obter o mais recente registro do objeto Legislatura.")
+ self.logger.debug(
+ "user=" + username + ". Tentando obter o mais recente registro do objeto Legislatura.")
l = Legislatura.objects.all().order_by(
'-data_inicio').first()
except ObjectDoesNotExist:
- self.logger.error("user=" + username + ". Objeto não encontrado. Retornando todos os registros.")
+ self.logger.error(
+ "user=" + username + ". Objeto não encontrado. Retornando todos os registros.")
return Legislatura.objects.all()
else:
- self.logger.info("user=" + username + ". Objeto encontrado com sucesso.")
+ self.logger.info("user=" + username +
+ ". Objeto encontrado com sucesso.")
if l is None:
return Legislatura.objects.all()
return queryset.filter(mandato__legislatura_id=l).annotate(
@@ -556,8 +566,8 @@ class ParlamentarCrud(Crud):
# ou igual a data de fim da legislatura
try:
self.logger.debug("user=" + username + ". Tentando obter filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
- "ou (data<={} e data_desfiliacao=Null))."
- .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
+ "ou (data<={} e data_desfiliacao=Null))."
+ .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
filiacao = parlamentar.filiacao_set.get(Q(
data__lte=legislatura.data_fim,
data_desfiliacao__gte=legislatura.data_fim) | Q(
@@ -583,7 +593,8 @@ class ParlamentarCrud(Crud):
# Caso encontre UMA filiação nessas condições
else:
- self.logger.debug("user=" + username + ". Filiação encontrada com sucesso.")
+ self.logger.debug("user=" + username +
+ ". Filiação encontrada com sucesso.")
row[1] = (filiacao.partido.sigla, None, None)
return context
@@ -615,13 +626,16 @@ class ParlamentarMateriasView(FormView):
parlamentar_pk = kwargs['pk']
username = request.user.username
try:
- self.logger.debug("user=" + username + ". Tentando obter Autor (object_id={}).".format(parlamentar_pk))
+ self.logger.debug(
+ "user=" + username + ". Tentando obter Autor (object_id={}).".format(parlamentar_pk))
autor = Autor.objects.get(
content_type=ContentType.objects.get_for_model(Parlamentar),
object_id=parlamentar_pk)
except ObjectDoesNotExist:
- mensagem = _('Este Parlamentar (pk={}) não é Autor de matéria.'.format(parlamentar_pk))
- self.logger.error("user=" + username + ". Este Parlamentar (pk={}) não é Autor de matéria.".format(parlamentar_pk))
+ mensagem = _(
+ 'Este Parlamentar (pk={}) não é Autor de matéria.'.format(parlamentar_pk))
+ self.logger.error(
+ "user=" + username + ". Este Parlamentar (pk={}) não é Autor de matéria.".format(parlamentar_pk))
messages.add_message(request, messages.ERROR, mensagem)
return HttpResponseRedirect(
reverse(
@@ -709,7 +723,8 @@ class MesaDiretoraView(FormView):
sessao_atual = sessoes.filter(data_inicio__year__lte=year).exclude(
data_inicio__gt=timezone.now()).order_by('-data_inicio').first()
- mesa = sessao_atual.composicaomesa_set.all().order_by('cargo_id') if sessao_atual else []
+ mesa = sessao_atual.composicaomesa_set.all().order_by(
+ 'cargo_id') if sessao_atual else []
cargos_ocupados = [m.cargo for m in mesa]
cargos = CargoMesa.objects.all()
@@ -765,7 +780,8 @@ def altera_field_mesa(request):
else:
year = timezone.now().year
try:
- logger.debug("user=" + username + ". Tentando obter id de sessoes com data_inicio.ano={}.".format(year))
+ logger.debug(
+ "user=" + username + ". Tentando obter id de sessoes com data_inicio.ano={}.".format(year))
sessao_selecionada = sessoes.get(data_inicio__year=year).id
except ObjectDoesNotExist:
logger.error("user=" + username + ". Id de sessoes com data_inicio.ano={} não encontrado. "
@@ -818,24 +834,29 @@ def insere_parlamentar_composicao(request):
composicao = ComposicaoMesa()
try:
- logger.debug("user=" + username + ". Tentando obter SessaoLegislativa com id={}.".format(request.POST['sessao']))
+ logger.debug(
+ "user=" + username + ". Tentando obter SessaoLegislativa com id={}.".format(request.POST['sessao']))
composicao.sessao_legislativa = SessaoLegislativa.objects.get(
id=int(request.POST['sessao']))
except MultiValueDictKeyError:
- logger.error("user=" + username + ". 'MultiValueDictKeyError', nenhuma sessão foi inserida!")
+ logger.error(
+ "user=" + username + ". 'MultiValueDictKeyError', nenhuma sessão foi inserida!")
return JsonResponse({'msg': ('Nenhuma sessão foi inserida!', 0)})
try:
- logger.debug("user=" + username + ". Tentando obter Parlamentar com id={}.".format(request.POST['parlamentar']))
+ logger.debug(
+ "user=" + username + ". Tentando obter Parlamentar com id={}.".format(request.POST['parlamentar']))
composicao.parlamentar = Parlamentar.objects.get(
id=int(request.POST['parlamentar']))
except MultiValueDictKeyError:
- logger.error("user=" + username + ". 'MultiValueDictKeyError', nenhum parlamentar foi inserido!")
+ logger.error(
+ "user=" + username + ". 'MultiValueDictKeyError', nenhum parlamentar foi inserido!")
return JsonResponse({
'msg': ('Nenhum parlamentar foi inserido!', 0)})
try:
- logger.info("user=" + username + ". Tentando obter CargoMesa com id={}.".format(request.POST['cargo']))
+ logger.info("user=" + username +
+ ". Tentando obter CargoMesa com id={}.".format(request.POST['cargo']))
composicao.cargo = CargoMesa.objects.get(
id=int(request.POST['cargo']))
parlamentar_ja_inserido = ComposicaoMesa.objects.filter(
@@ -848,14 +869,16 @@ def insere_parlamentar_composicao(request):
composicao.save()
except MultiValueDictKeyError:
- logger.error("user=" + username + ". 'MultiValueDictKeyError', nenhum cargo foi inserido!")
+ logger.error("user=" + username +
+ ". 'MultiValueDictKeyError', nenhum cargo foi inserido!")
return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)})
logger.info("user=" + username + ". Parlamentar inserido com sucesso!")
return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)})
else:
- logger.error("user=" + username + " não tem permissão para esta operação!")
+ logger.error("user=" + username +
+ " não tem permissão para esta operação!")
return JsonResponse(
{'msg': ('Você não tem permissão para esta operação!', 0)})
@@ -873,7 +896,8 @@ def remove_parlamentar_composicao(request):
if 'composicao_mesa' in request.POST:
try:
- logger.debug("user=" + username + ". Tentando obter ComposicaoMesa com id={}.".format(request.POST['composicao_mesa']))
+ logger.debug("user=" + username + ". Tentando obter ComposicaoMesa com id={}.".format(
+ request.POST['composicao_mesa']))
composicao = ComposicaoMesa.objects.get(
id=request.POST['composicao_mesa'])
except ObjectDoesNotExist:
@@ -885,12 +909,14 @@ def remove_parlamentar_composicao(request):
composicao.delete()
- logger.info("user=" + username + ". ComposicaoMesa com id={} excluido com sucesso!".format(request.POST['composicao_mesa']))
+ logger.info("user=" + username + ". ComposicaoMesa com id={} excluido com sucesso!".format(
+ request.POST['composicao_mesa']))
return JsonResponse(
{'msg': (
'Parlamentar excluido com sucesso!', 1)})
else:
- logger.info("user=" + username + ". Nenhum parlamentar escolhido para ser excluído.")
+ logger.info("user=" + username +
+ ". Nenhum parlamentar escolhido para ser excluído.")
return JsonResponse(
{'msg': (
'Selecione algum parlamentar para ser excluido!', 0)})
@@ -909,8 +935,8 @@ def partido_parlamentar_sessao_legislativa(sessao, parlamentar):
logger = logging.getLogger(__name__)
try:
logger.debug("Tentando obter filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
- "ou (data<={} e data_desfiliacao=Null))."
- .format(sessao.data_fim, sessao.data_fim, sessao.data_fim))
+ "ou (data<={} e data_desfiliacao=Null))."
+ .format(sessao.data_fim, sessao.data_fim, sessao.data_fim))
logger.info("Tentando obter filiação correspondente.")
filiacao = parlamentar.filiacao_set.get(Q(
@@ -966,7 +992,8 @@ def altera_field_mesa_public_view(request):
else:
try:
year = timezone.now().year
- logger.info("user=" + username + ". Tentando obter sessões com data_inicio.ano = {}.".format(year))
+ logger.info("user=" + username +
+ ". Tentando obter sessões com data_inicio.ano = {}.".format(year))
sessao_selecionada = sessoes.get(data_inicio__year=year).id
except ObjectDoesNotExist:
logger.error("user=" + username + ". Sessões não encontradas com com data_inicio.ano = {}. "
From e8ccbc74d85e2253c1a16eea218dd4859df5304e Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 16 Jan 2019 17:12:38 -0200
Subject: [PATCH 094/222] =?UTF-8?q?resolve=20FIXME=20em=20confirma=C3=A7?=
=?UTF-8?q?=C3=A3o=20de=20proposi=C3=A7=C3=B5es?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
uma proposição, quando incorporada com a opção protocolar sempre, ou
opcionamente, da mais usabilidade ao usuário do protocolo
que sua tela seja redirecionada para o detail do protocolo e não o
detail da matéria. Era um fixme antigo que aguardava conclusão da app
protocolo.
---
sapl/materia/forms.py | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index a043d024d..d00a83d70 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -2046,15 +2046,10 @@ class ConfirmarProposicaoForm(ProposicaoForm):
self.instance.results['messages']['success'].append(_(
'Protocolo realizado com sucesso'))
- # FIXME qdo protocoloadm estiver homologado, verifique a necessidade
- # de redirecionamento para o protocolo.
- # complete e libere código abaixo para tal.
-
- """
self.instance.results['url'] = reverse(
- 'sapl.protocoloadm:...',
+ 'sapl.protocoloadm:protocolo_mostrar',
kwargs={'pk': protocolo.pk})
- """
+
conteudo_gerado.numero_protocolo = protocolo.numero
conteudo_gerado.save()
From d9f93230b2f1d8859661475bbbe202fcaea2b74e Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 16 Jan 2019 22:26:05 -0200
Subject: [PATCH 095/222] adequa widget ao django 1.11
---
sapl/materia/forms.py | 43 ++++++++-----------------------------------
1 file changed, 8 insertions(+), 35 deletions(-)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index d00a83d70..c89d82336 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -1298,41 +1298,14 @@ class TipoProposicaoForm(ModelForm):
class TipoProposicaoSelect(Select):
- def render_tipo_option(self, selected_choices, option_value, option_label,
- data_has_perfil=False):
- if option_value is None:
- option_value = ''
- option_value = force_text(option_value)
- if option_value in selected_choices:
- selected_html = mark_safe(' selected="selected"')
- if not self.allow_multiple_selected:
- # Only allow for a single selection.
- selected_choices.remove(option_value)
- else:
- selected_html = ''
- return format_html(
- '{} ',
- option_value,
- selected_html,
- str(data_has_perfil),
- force_text(option_label))
-
- def render_options(self, selected_choices):
- # Normalize to strings.
- selected_choices = set(force_text(v) for v in selected_choices)
- output = []
- output.append(
- self.render_tipo_option(
- selected_choices, '', self.choices.field.empty_label))
-
- for tipo in self.choices.queryset.all():
- output.append(
- self.render_tipo_option(
- selected_choices,
- str(tipo.pk),
- str(tipo),
- data_has_perfil=tipo.perfis.exists()))
- return '\n'.join(output)
+ def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
+ option = super().create_option(name, value, label, selected,
+ index, subindex=subindex, attrs=attrs)
+ if value:
+ tipo = TipoProposicao.objects.get(id=value)
+ option['attrs']['data-has-perfil'] = str(tipo.perfis.exists())
+
+ return option
class ProposicaoForm(forms.ModelForm):
From 15542b438736a7d56b7144f9eaefd8c7c6e794a0 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 17 Jan 2019 16:27:34 -0200
Subject: [PATCH 096/222] =?UTF-8?q?Fix=20#2451=20-=20adequa=C3=A7=C3=A3o?=
=?UTF-8?q?=20ao=20django=201.11?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/materia/views.py | 2 +-
sapl/norma/views.py | 22 +++++++++++++---------
2 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 0f856ede3..c3036d52e 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -2175,7 +2175,7 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name)
- html = template.render(RequestContext(request, context))
+ html = template.render(context, request)
pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri()
).write_pdf()
diff --git a/sapl/norma/views.py b/sapl/norma/views.py
index 0e0ed23e4..c145705b5 100644
--- a/sapl/norma/views.py
+++ b/sapl/norma/views.py
@@ -1,8 +1,6 @@
import logging
import re
-import sapl
-import weasyprint
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.exceptions import ObjectDoesNotExist
@@ -15,7 +13,10 @@ from django.views.generic import TemplateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
+import weasyprint
+
from sapl import settings
+import sapl
from sapl.base.models import AppConfig
from sapl.compilacao.views import IntegracaoTaView
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
@@ -108,7 +109,8 @@ 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
+ context['USE_SOLR'] = settings.USE_SOLR if hasattr(
+ settings, 'USE_SOLR') else False
return context
@@ -196,9 +198,8 @@ class NormaCrud(Crud):
estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas
if estatisticas_acesso_normas == 'S':
NormaEstatisticas.objects.create(usuario=str(self.request.user),
- norma_id=kwargs['pk'])
+ norma_id=kwargs['pk'])
return super().get(request, *args, **kwargs)
-
class DeleteView(Crud.DeleteView):
@@ -218,12 +219,14 @@ class NormaCrud(Crud):
username = self.request.user.username
try:
- self.logger.debug('user=' + username + '. Tentando obter objeto de modelo da esfera da federação.')
+ self.logger.debug(
+ 'user=' + username + '. Tentando obter objeto de modelo da esfera da federação.')
esfera = sapl.base.models.AppConfig.objects.last(
).esfera_federacao
self.initial['esfera_federacao'] = esfera
except:
- self.logger.error('user=' + username + '. Erro ao obter objeto de modelo da esfera da federação.')
+ self.logger.error(
+ 'user=' + username + '. Erro ao obter objeto de modelo da esfera da federação.')
pass
self.initial['complemento'] = False
return self.initial
@@ -233,7 +236,7 @@ class NormaCrud(Crud):
class ListView(Crud.ListView, RedirectView):
def get_redirect_url(self, *args, **kwargs):
- namespace = self.model._meta.app_config.name
+ namespace = self.model._meta.app_config.name
return reverse('%s:%s' % (namespace, 'norma_pesquisa'))
def get(self, request, *args, **kwargs):
@@ -332,6 +335,7 @@ class AutoriaNormaCrud(MasterDetailCrud):
})
return initial
+
class ImpressosView(PermissionRequiredMixin, TemplateView):
template_name = 'materia/impressos/impressos.html'
permission_required = ('materia.can_access_impressos', )
@@ -339,7 +343,7 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name)
- html = template.render(RequestContext(request, context))
+ html = template.render(context, request)
pdf = weasyprint.HTML(string=html, base_url=request.build_absolute_uri()
).write_pdf()
From a645e0a12c0399843338b29ccd4aeefbf533d919 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 17 Jan 2019 17:11:22 -0200
Subject: [PATCH 097/222] =?UTF-8?q?corrige=20leitura=20de=20permissoes=20n?=
=?UTF-8?q?as=20tabelas=20auxili=C3=A1res?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/compilacao/tipotextoarticulado_list.html | 4 ++--
sapl/templates/crud/list_tabaux.html | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/sapl/templates/compilacao/tipotextoarticulado_list.html b/sapl/templates/compilacao/tipotextoarticulado_list.html
index 509c9c0d3..3445306f5 100644
--- a/sapl/templates/compilacao/tipotextoarticulado_list.html
+++ b/sapl/templates/compilacao/tipotextoarticulado_list.html
@@ -15,7 +15,7 @@
{% endblock actions %}
-
- {% if not mes in meses_sem_acesso %}
@@ -53,10 +48,6 @@
{% endfor %}
- {% else %}
- {% trans 'Nenhuma norma deste mês teve acessos.'%}
-
- {% endif %}
{% endfor %}
{% endif %}
From f84ac62c4a5b7fc1ca538125b7b2b9c4c0cb9bae Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Mon, 21 Jan 2019 17:36:26 -0200
Subject: [PATCH 103/222] adiciona ultimo ano com norma como default em
relatorios de normas por mes
---
sapl/base/forms.py | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index 798e24e11..c63163801 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -704,11 +704,17 @@ class RelatorioAtasFilterSet(django_filters.FilterSet):
)
+def ultimo_ano_com_norma():
+ anos_normas = choice_anos_com_normas()
+ return anos_normas[0]
+
+
class RelatorioNormasMesFilterSet(django_filters.FilterSet):
ano = django_filters.ChoiceFilter(required=True,
label='Ano da Norma',
- choices=choice_anos_com_normas)
+ choices=choice_anos_com_normas,
+ initial=ultimo_ano_com_norma)
class Meta:
model = NormaJuridica
@@ -765,11 +771,6 @@ class EstatisticasAcessoNormasForm(Form):
return self.cleaned_data
-def ultimo_ano_com_norma():
- anos_normas = choice_anos_com_normas()
- return anos_normas[0]
-
-
class RelatorioNormasVigenciaFilterSet(django_filters.FilterSet):
ano = django_filters.ChoiceFilter(required=True,
From 53507cc01c52a102349434ff0c50cb8a303deef4 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Mon, 21 Jan 2019 17:46:05 -0200
Subject: [PATCH 104/222] fix commit #f84ac62
---
sapl/base/forms.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index c63163801..d603ffc45 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -706,8 +706,11 @@ class RelatorioAtasFilterSet(django_filters.FilterSet):
def ultimo_ano_com_norma():
anos_normas = choice_anos_com_normas()
- return anos_normas[0]
+ if anos_normas:
+ return anos_normas[0]
+ return ''
+
class RelatorioNormasMesFilterSet(django_filters.FilterSet):
From 35780b0faceffaabfa080c453189928224e752a7 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 21 Jan 2019 21:11:35 -0200
Subject: [PATCH 105/222] move javascript para dentro do bloco correto
---
sapl/templates/base/login.html | 13 +++++--------
sapl/templates/compilacao/text_list.html | 2 +-
.../compilacao/text_list__embedded.html | 11 ++++++++---
.../compilacao/text_list__print_version.html | 2 +-
sapl/templates/index.html | 18 +++++++++++-------
sapl/templates/norma/normajuridica_filter.html | 11 +++++++----
.../sessao/votacao/nominal_detail.html | 2 +-
.../templates/sessao/votacao/nominal_edit.html | 2 +-
.../sessao/votacao/nominal_transparencia.html | 2 +-
.../votacao/simbolica_transparencia.html | 2 +-
10 files changed, 37 insertions(+), 28 deletions(-)
diff --git a/sapl/templates/base/login.html b/sapl/templates/base/login.html
index c2c7aa2c6..5db419fce 100644
--- a/sapl/templates/base/login.html
+++ b/sapl/templates/base/login.html
@@ -57,13 +57,10 @@
{% endblock base_content %}
- {% block javascript %}
-
-
+{% block extra_js %}
-
- {% endblock %}
+{% endblock %}
diff --git a/sapl/templates/compilacao/text_list.html b/sapl/templates/compilacao/text_list.html
index 7d3526cc1..c0ab6209e 100644
--- a/sapl/templates/compilacao/text_list.html
+++ b/sapl/templates/compilacao/text_list.html
@@ -113,7 +113,7 @@
{% endblock base_content %}
-{% block foot_js %}
+{% block extra_js %}
{{block.super}}
diff --git a/sapl/templates/compilacao/text_list__embedded.html b/sapl/templates/compilacao/text_list__embedded.html
index a448c9dd4..33b19695c 100644
--- a/sapl/templates/compilacao/text_list__embedded.html
+++ b/sapl/templates/compilacao/text_list__embedded.html
@@ -78,9 +78,14 @@
{% include 'compilacao/text_list_bloco.html'%}
-
-
+
+
+{% block extra_js %}
+
+
{% if perms.compilacao.add_nota %}
- {% endif %}
\ No newline at end of file
+ {% endif %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/sapl/templates/compilacao/text_list__print_version.html b/sapl/templates/compilacao/text_list__print_version.html
index 8aad1409c..aaf49babb 100644
--- a/sapl/templates/compilacao/text_list__print_version.html
+++ b/sapl/templates/compilacao/text_list__print_version.html
@@ -15,7 +15,7 @@
{% block footer_container %}{% endblock %}
-{% block foot_js %}{{block.super}}
+{% block extra_js %}{{block.super}}
{% endblock %}
diff --git a/sapl/templates/index.html b/sapl/templates/index.html
index 69c53e075..9dd611471 100644
--- a/sapl/templates/index.html
+++ b/sapl/templates/index.html
@@ -192,11 +192,15 @@
-
+
+{% endblock %}
+
+{% block extra_js %}
+
{% endblock %}
diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html
index 0c7547661..a2a9c5f82 100644
--- a/sapl/templates/norma/normajuridica_filter.html
+++ b/sapl/templates/norma/normajuridica_filter.html
@@ -91,6 +91,12 @@
{% endif %}
{% endif %}
+{% endblock detail_content %}
+
+{% block table_content %}
+{% endblock table_content %}
+
+{% block extra_js %}
-{% endblock detail_content %}
-
-{% block table_content %}
-{% endblock table_content %}
+{% endblock table_content %}
\ No newline at end of file
diff --git a/sapl/templates/sessao/votacao/nominal_detail.html b/sapl/templates/sessao/votacao/nominal_detail.html
index 53d41084b..17ccb1f69 100644
--- a/sapl/templates/sessao/votacao/nominal_detail.html
+++ b/sapl/templates/sessao/votacao/nominal_detail.html
@@ -52,7 +52,7 @@
{% endblock detail_content %}
-{% block foot_js %}
+{% block extra_js %}
diff --git a/sapl/templates/sessao/votacao/nominal_edit.html b/sapl/templates/sessao/votacao/nominal_edit.html
index f751e21d9..c9d543c15 100644
--- a/sapl/templates/sessao/votacao/nominal_edit.html
+++ b/sapl/templates/sessao/votacao/nominal_edit.html
@@ -83,7 +83,7 @@
{% endblock detail_content %}
-{% block foot_js %}
+{% block extra_js %}
diff --git a/sapl/templates/sessao/votacao/nominal_transparencia.html b/sapl/templates/sessao/votacao/nominal_transparencia.html
index e373e7b03..920710a3e 100644
--- a/sapl/templates/sessao/votacao/nominal_transparencia.html
+++ b/sapl/templates/sessao/votacao/nominal_transparencia.html
@@ -58,7 +58,7 @@
{% endblock detail_content %}
-{% block foot_js %}
+{% block extra_js %}
diff --git a/sapl/templates/sessao/votacao/simbolica_transparencia.html b/sapl/templates/sessao/votacao/simbolica_transparencia.html
index 159dc1f94..57829dc3d 100644
--- a/sapl/templates/sessao/votacao/simbolica_transparencia.html
+++ b/sapl/templates/sessao/votacao/simbolica_transparencia.html
@@ -49,7 +49,7 @@
{% endblock detail_content %}
-{% block foot_js %}
+{% block extra_js %}
From 1badaeb31276237811fcb73a6420d69b0a3f0add Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 21 Jan 2019 21:18:47 -0200
Subject: [PATCH 106/222] corrige endblock
---
sapl/templates/norma/normajuridica_filter.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/templates/norma/normajuridica_filter.html b/sapl/templates/norma/normajuridica_filter.html
index a2a9c5f82..674f43a9c 100644
--- a/sapl/templates/norma/normajuridica_filter.html
+++ b/sapl/templates/norma/normajuridica_filter.html
@@ -108,4 +108,4 @@
});
});
-{% endblock table_content %}
\ No newline at end of file
+{% endblock extra_js %}
\ No newline at end of file
From 87dce29d1072482f845cbfc117b6008781433c6e Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 21 Jan 2019 22:24:44 -0200
Subject: [PATCH 107/222] =?UTF-8?q?adequa=20form=20de=20notas=20de=20compi?=
=?UTF-8?q?la=C3=A7=C3=A3o=20ao=20form=20do=20django=201.11?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/compilacao/forms.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py
index f7889604a..1b90374bc 100644
--- a/sapl/compilacao/forms.py
+++ b/sapl/compilacao/forms.py
@@ -251,6 +251,8 @@ class NotaForm(ModelForm):
('publicidade', 6),
('publicacao', 3),
('efetividade', 3),
+ ('dispositivo', 0),
+ ('pk', 0),
])
buttons = FormActions(
From 09e40439ca9d8ee58513fef9e819c326c0a19b5d Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Mon, 21 Jan 2019 22:29:29 -0200
Subject: [PATCH 108/222] =?UTF-8?q?adequa=20form=20de=20vides=20de=20compi?=
=?UTF-8?q?la=C3=A7=C3=A3o=20ao=20form=20do=20django=201.11?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/compilacao/forms.py | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py
index 1b90374bc..3c4275bee 100644
--- a/sapl/compilacao/forms.py
+++ b/sapl/compilacao/forms.py
@@ -359,13 +359,15 @@ class VideForm(ModelForm):
self.helper = FormHelper()
self.helper.layout = Layout(
Div(
- Div(HTML(_('Vides')), css_class='panel-heading'),
+ Div(HTML(_('Vides')), css_class='car-header'),
Div(
to_column((fields_form[0], 6)),
to_column((fields_form[1], 6)),
- css_class="panel-body"
+ to_column(('dispositivo_base', 0)),
+ to_column(('pk', 0)),
+ css_class="card-body"
),
- css_class="panel panel-primary"
+ css_class="card bg-light"
)
)
From e01ba09e4d579382e7afbdb804599333d3623856 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Tue, 22 Jan 2019 00:09:59 -0200
Subject: [PATCH 109/222] =?UTF-8?q?aplica=20convers=C3=A3o=20autom=C3=A1ti?=
=?UTF-8?q?ca=20de=20html=20mal=20formado=20nos=20dispositivos=20de=20TAs?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/compilacao/models.py | 10 ++++++++++
sapl/compilacao/views.py | 6 ++----
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py
index bb504934b..f36e406f9 100644
--- a/sapl/compilacao/models.py
+++ b/sapl/compilacao/models.py
@@ -1,4 +1,5 @@
+from bs4 import BeautifulSoup
from django.contrib import messages
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
@@ -1105,6 +1106,15 @@ class Dispositivo(BaseModel, TimestampedMixin):
self.contagem_continua = self.tipo_dispositivo.contagem_continua
+ try:
+ if self.texto:
+ self.texto = str(BeautifulSoup(self.texto, "html.parser"))
+ if self.texto_atualizador:
+ self.texto_atualizador = str(BeautifulSoup(
+ self.texto_atualizador, "html.parser"))
+ except:
+ pass
+
return super().save(
force_insert=force_insert, force_update=force_update, using=using,
update_fields=update_fields, clean=clean)
diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index 7d28f619a..897e18cd6 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -4,6 +4,7 @@ import logging
import sys
from braces.views import FormMessagesMixin
+from bs4 import BeautifulSoup
from django import forms
from django.conf import settings
from django.contrib import messages
@@ -2940,13 +2941,10 @@ class DispositivoDinamicEditView(
if texto != texto_atualizador else ''
visibilidade = request.POST['visibilidade']
- # if d.texto != '':
- # d.texto = texto
- # d.save()
- # return self.get(request, *args, **kwargs)
d_texto = d.texto
d.texto = texto.strip()
d.texto_atualizador = texto_atualizador.strip()
+
d.visibilidade = not visibilidade or visibilidade == 'True'
d.save()
From aa36931b1f4d448238ab451a188acb0502f66a77 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Tue, 22 Jan 2019 11:10:05 -0200
Subject: [PATCH 110/222] HOT-FIX: adiciona .dockerignore ao projeto
---
.dockerignore | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 .dockerignore
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..8f4c8f147
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,4 @@
+media
+collected_static
+.git
+whoosh
From 0948eaf8d47723f687cabc8949ba6046350296a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?=
Date: Thu, 24 Jan 2019 14:34:45 -0200
Subject: [PATCH 111/222] HOT-FIX: adiciona paths para .vscode em .gitignore
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index cb6cce48e..dfdeb2b5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -88,6 +88,7 @@ target/
.ipynb_checkpoints/
*.ipynb
.vscode/*
+*/.vscode/*
# specific to this project
whoosh_index
From 7fe678622fe24fd2f7c5ccdc16c892e187058eae Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Thu, 24 Jan 2019 17:13:30 -0200
Subject: [PATCH 112/222] Fix #2452
---
sapl/materia/forms.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index c89d82336..0e841504b 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -802,7 +802,7 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
o = MateriaPesquisaOrderingFilter(help_text='')
tipo_listagem = forms.ChoiceField(
- required=True,
+ required=False,
choices=CHOICE_TIPO_LISTAGEM,
label=_('Tipo da Listagem do Resultado da Pesquisa'))
From 12acabd13fe2993d3cb2c5879b14bb496582fd38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?=
Date: Thu, 24 Jan 2019 17:15:09 -0200
Subject: [PATCH 113/222] =?UTF-8?q?HOT-FIX:=20corrige=20o=20fechamento=20d?=
=?UTF-8?q?o=20coment=C3=A1rio?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.github/ISSUE_TEMPLATE.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 8d64c275c..c549f2bd4 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -26,11 +26,11 @@
## Imagens do Ocorrido
-
## Seu Ambiente
* Versão usada (_Release_):
* Nome e versão do navegador:
* Nome e versão do Sistema Operacional (desktop ou mobile):
-* Link para o seu projeto (Caso de fork deste projeto):
\ No newline at end of file
+* Link para o seu projeto (Caso de fork deste projeto):
From ed50c00193f980742d5f877ff13832535298b634 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Mon, 28 Jan 2019 14:09:58 -0200
Subject: [PATCH 114/222] fix #2453 (#2457)
---
sapl/materia/forms.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index 0e841504b..9a1e4eda7 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -202,7 +202,8 @@ class MateriaLegislativaForm(ModelForm):
widget=forms.HiddenInput())
self.fields['autor'] = forms.CharField(required=False,
widget=forms.HiddenInput())
- self.fields['numero_protocolo'].widget.attrs['readonly'] = True
+ if kwargs['instance'].numero_protocolo:
+ self.fields['numero_protocolo'].widget.attrs['readonly'] = True
def clean(self):
super(MateriaLegislativaForm, self).clean()
From 2434f3266cb570f2aee1c68ba1f6fd1ba176c9ae Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Tue, 29 Jan 2019 15:00:54 -0200
Subject: [PATCH 115/222] HOTFIX - Retira erro para Legislatura com data_fim
vazia
---
sapl/parlamentares/models.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sapl/parlamentares/models.py b/sapl/parlamentares/models.py
index b1ee14629..d88f2fd87 100644
--- a/sapl/parlamentares/models.py
+++ b/sapl/parlamentares/models.py
@@ -28,10 +28,14 @@ class Legislatura(models.Model):
def atual(self):
current_year = timezone.now().year
+ if not self.data_fim:
+ self.data_fim = timezone.now().date()
return self.data_inicio.year <= current_year <= self.data_fim.year
@vigencia_atual
def __str__(self):
+ if not self.data_fim:
+ self.data_fim = timezone.now().date()
return _('%(numero)sª (%(start)s - %(end)s)') % {
'numero': self.numero,
'start': self.data_inicio.year,
From 0cc296f6a2dbc65288db026ac5cd343fd7d152b3 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Tue, 29 Jan 2019 20:11:11 -0200
Subject: [PATCH 116/222] =?UTF-8?q?Fix=202461=20-=20Logotipo=20em=20relat?=
=?UTF-8?q?=C3=B3rios=20(#2463)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* fix erro ao gerar pdf sem logotipo
* retira ipdb e ajusta codigo
---
.../templates/pdf_documento_administrativo_gerar.py | 6 ++++--
sapl/relatorios/templates/pdf_espelho_gerar.py | 6 ++++--
sapl/relatorios/templates/pdf_materia_gerar.py | 4 +++-
sapl/relatorios/templates/pdf_ordem_dia_gerar.py | 7 ++++---
sapl/relatorios/templates/pdf_pauta_sessao_gerar.py | 6 ++++--
sapl/relatorios/templates/pdf_protocolo_gerar.py | 4 +++-
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py | 7 +++++--
sapl/relatorios/views.py | 3 +--
8 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/sapl/relatorios/templates/pdf_documento_administrativo_gerar.py b/sapl/relatorios/templates/pdf_documento_administrativo_gerar.py
index b102322ab..2dc8d363e 100755
--- a/sapl/relatorios/templates/pdf_documento_administrativo_gerar.py
+++ b/sapl/relatorios/templates/pdf_documento_administrativo_gerar.py
@@ -8,6 +8,7 @@
versão: 1.0
"""
import time
+import os
from trml2pdf import parseString
@@ -15,8 +16,9 @@ from trml2pdf import parseString
def cabecalho(dic_cabecalho, imagem):
"""Gera o codigo rml do cabecalho"""
tmp_data = ''
- tmp_data += '\t\t\t\t \n'
+ if os.path.isfile(imagem):
+ tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t2cm 25.4cm 19cm 25.4cm \n'
tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t' + \
diff --git a/sapl/relatorios/templates/pdf_espelho_gerar.py b/sapl/relatorios/templates/pdf_espelho_gerar.py
index ba3cd373c..769d56790 100644
--- a/sapl/relatorios/templates/pdf_espelho_gerar.py
+++ b/sapl/relatorios/templates/pdf_espelho_gerar.py
@@ -7,6 +7,7 @@
versão: 1.0
"""
import time
+import os
from trml2pdf import parseString
@@ -14,8 +15,9 @@ from trml2pdf import parseString
def cabecalho(dic_cabecalho, imagem):
"""Gera o codigo rml do cabecalho"""
tmp_data = ''
- tmp_data += '\t\t\t\t \n'
+ if os.path.isfile(imagem):
+ tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t2cm 25cm 19cm 25cm \n'
tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t' + \
diff --git a/sapl/relatorios/templates/pdf_materia_gerar.py b/sapl/relatorios/templates/pdf_materia_gerar.py
index 125d147e6..cadc6501c 100755
--- a/sapl/relatorios/templates/pdf_materia_gerar.py
+++ b/sapl/relatorios/templates/pdf_materia_gerar.py
@@ -7,6 +7,7 @@
versão: 1.0
"""
import time
+import os
from trml2pdf import parseString
@@ -14,7 +15,8 @@ from trml2pdf import parseString
def cabecalho(dic_cabecalho, imagem):
"""Gera o codigo rml do cabecalho"""
tmp_data = ''
- tmp_data += '\t\t\t\t \n'
+ if os.path.isfile(imagem):
+ tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t2cm 25cm 19cm 25cm \n'
tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t' + \
diff --git a/sapl/relatorios/templates/pdf_ordem_dia_gerar.py b/sapl/relatorios/templates/pdf_ordem_dia_gerar.py
index 559a2d979..41cf8f2eb 100755
--- a/sapl/relatorios/templates/pdf_ordem_dia_gerar.py
+++ b/sapl/relatorios/templates/pdf_ordem_dia_gerar.py
@@ -6,8 +6,8 @@
Empresa: Interlegis
versão: 1.0
"""
-import os
import time
+import os
from trml2pdf import parseString
@@ -16,8 +16,9 @@ def cabecalho(dic_cabecalho, dat_ordem, imagem):
"""Gera o codigo rml do cabecalho"""
tmp = ''
- tmp += '\t\t\t\t \n'
+ if os.path.isfile(imagem):
+ tmp += '\t\t\t\t \n'
tmp += '\t\t\t\t2cm 25cm 19cm 25cm \n'
tmp += '\t\t\t\t \n'
#tmp+='\t\t\t\t' + str(dic_cabecalho['nom_casa']) + ' \n'
diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
index 24cd5ed4a..e570e38ea 100755
--- a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
+++ b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
@@ -4,6 +4,7 @@
versão: 1.0
"""
import time
+import os
from trml2pdf import parseString
@@ -12,8 +13,9 @@ def cabecalho(inf_basicas_dic, imagem):
"""
"""
tmp = ''
- tmp += '\t\t\t\t \n'
+ if os.path.isfile(imagem):
+ tmp += '\t\t\t\t \n'
tmp += '\t\t\t\t2cm 25.4cm 19cm 25.4cm \n'
tmp += '\t\t\t\t \n'
tmp += '\t\t\t\t' + \
diff --git a/sapl/relatorios/templates/pdf_protocolo_gerar.py b/sapl/relatorios/templates/pdf_protocolo_gerar.py
index a3fc82dd1..752f19c9a 100755
--- a/sapl/relatorios/templates/pdf_protocolo_gerar.py
+++ b/sapl/relatorios/templates/pdf_protocolo_gerar.py
@@ -7,6 +7,7 @@
versão: 1.0
"""
import time
+import os
from trml2pdf import parseString
@@ -14,7 +15,8 @@ from trml2pdf import parseString
def cabecalho(dic_cabecalho, imagem):
"""Gera o codigo rml do cabecalho"""
tmp_data = ''
- tmp_data += '\t\t\t\t \n'
+ if os.path.isfile(imagem):
+ tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t2cm 25.4cm 19cm 25.4cm \n'
tmp_data += '\t\t\t\t \n'
tmp_data += '\t\t\t\t' + \
diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
index 3a3512764..c1be7c3f9 100644
--- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
+++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
@@ -5,6 +5,7 @@
versão: 1.0
"""
import time
+import os
from django.template.defaultfilters import safe
from django.utils.html import strip_tags
@@ -18,8 +19,10 @@ def cabecalho(inf_basicas_dic, imagem):
"""
"""
tmp = ''
- tmp += '\t\t\t\t \n'
+
+ if os.path.isfile(imagem):
+ tmp += '\t\t\t\t \n'
tmp += '\t\t\t\t2cm 25.4cm 19cm 25.4cm \n'
tmp += '\t\t\t\t \n'
tmp += '\t\t\t\t' + \
diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py
index f4bc8cda2..aad44fc1d 100755
--- a/sapl/relatorios/views.py
+++ b/sapl/relatorios/views.py
@@ -55,8 +55,7 @@ def get_cabecalho(casa):
def get_imagem(casa):
if casa.logotipo:
return casa.logotipo.path
- else:
- return STATIC_ROOT + '/img/brasao_transp.gif'
+ return STATIC_ROOT + '/img/brasao_transp.gif'
def get_rodape(casa):
From 57d8d337055f60f90d9f8cd466dc1f1349a78f8e Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Fri, 1 Feb 2019 14:24:06 -0200
Subject: [PATCH 117/222] =?UTF-8?q?HOTFIX=20-=20Erro=20na=20cria=C3=A7?=
=?UTF-8?q?=C3=A3o=20de=20documento=20administrativo?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/protocoloadm/forms.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 8f476d443..9710a08ee 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -831,10 +831,10 @@ class DocumentoAdministrativoForm(ModelForm):
if not self.instance.pk or mudanca_doc:
doc_exists = DocumentoAdministrativo.objects.filter(numero=numero_documento,
tipo=tipo_documento,
- ano=ano_protocolo).exists()
+ ano=ano_documento).exists()
if doc_exists:
self.logger.error("DocumentoAdministrativo (numero={}, tipo={} e ano={}) já existe."
- .format(numero_documento, tipo_documento, ano_protocolo))
+ .format(numero_documento, tipo_documento, ano_documento))
raise ValidationError(_('Documento já existente'))
# campos opcionais, mas que se informados devem ser válidos
From 8c1655b44cde7df1962488eacd5ca47c22af4af3 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Fri, 1 Feb 2019 14:31:11 -0200
Subject: [PATCH 118/222] HOTFIX - Mensagem de erro mal formatada
---
sapl/protocoloadm/forms.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 9710a08ee..640d20613 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -855,8 +855,8 @@ class DocumentoAdministrativoForm(ModelForm):
self.logger.error("Existe mais de um Protocolo com este ano ({}) e número ({}).".format(
ano_protocolo, numero_protocolo))
msg = _(
- 'Existe mais de um Protocolo com este ano e número.' % (
- numero_protocolo, ano_protocolo))
+ 'Existe mais de um Protocolo com este ano ({}) e número({}).' % (
+ ano_protocolo, numero_protocolo))
raise ValidationError(msg)
inst = self.instance.protocolo
From 70a26293d33eee6741f4a21c81d97cbc74ff3b8e Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Fri, 1 Feb 2019 14:33:41 -0200
Subject: [PATCH 119/222] fix commit #8c1655b
---
sapl/protocoloadm/forms.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 640d20613..77ec1b7bf 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -855,7 +855,7 @@ class DocumentoAdministrativoForm(ModelForm):
self.logger.error("Existe mais de um Protocolo com este ano ({}) e número ({}).".format(
ano_protocolo, numero_protocolo))
msg = _(
- 'Existe mais de um Protocolo com este ano ({}) e número({}).' % (
+ 'Existe mais de um Protocolo com este ano (%s) e número (%s).' % (
ano_protocolo, numero_protocolo))
raise ValidationError(msg)
From 46b151d3963498ab6868d2ad878b4b2f83f6470c Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Fri, 1 Feb 2019 15:44:53 -0200
Subject: [PATCH 120/222] desativa checkbox e radiobox do druken
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
drunken será desativa totalmente apos o PR do branch 1540-migra-frontend
---
sapl/static/js/app.js | 2 +-
sapl/static/js/compilacao.js | 4 ++--
sapl/static/js/compilacao_edit.js | 2 +-
sapl/templates/base.html | 3 ---
4 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js
index c30f357bd..9a7e41604 100644
--- a/sapl/static/js/app.js
+++ b/sapl/static/js/app.js
@@ -231,7 +231,7 @@ $(document).ready(function(){
autorModal();
initTinymce("texto-rico");
- OptionalCustomFrontEnd();
+ //OptionalCustomFrontEnd();
});
diff --git a/sapl/static/js/compilacao.js b/sapl/static/js/compilacao.js
index a5dd9be1b..1769fce9f 100644
--- a/sapl/static/js/compilacao.js
+++ b/sapl/static/js/compilacao.js
@@ -118,7 +118,7 @@ function DispostivoSearch(opts) {
insertWaitAjax('.result-busca-dispositivo')
$.get(url, formData).done(function( data ) {
$('.result-busca-dispositivo').html(data);
- //OptionalCustomFrontEnd().init();
+ ////OptionalCustomFrontEnd().init();
if (data_type_selection == 'checkbox') {
var tas = $('.result-busca-dispositivo').find('input[name="ta_select_all"]');
tas.off();
@@ -168,7 +168,7 @@ function DispostivoSearch(opts) {
$.get(opts['url_form'], function(data) {
container_ds.html(data);
var modal_ds = $('#modal-ds');
- OptionalCustomFrontEnd().init();
+ //OptionalCustomFrontEnd().init();
modal_ds.find("select[name='tipo_ta']").change(function(event) {
var url = '';
diff --git a/sapl/static/js/compilacao_edit.js b/sapl/static/js/compilacao_edit.js
index 58e05280b..540b0c48d 100644
--- a/sapl/static/js/compilacao_edit.js
+++ b/sapl/static/js/compilacao_edit.js
@@ -229,7 +229,7 @@ function DispositivoEdit() {
if (editortype == 'tinymce' ) {
initTinymce();
}
- OptionalCustomFrontEnd().init();
+ //OptionalCustomFrontEnd().init();
}
dpt.trigger(trigger);
}).always(function() {
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 807f97786..84deb4b60 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -241,9 +241,6 @@
-
-
-
From 59bc7d75b07812be04f7956c285e60f64aad0cb0 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Mon, 4 Feb 2019 14:11:20 -0200
Subject: [PATCH 121/222] HOT-FIX: set default uploaded file permissions to 644
---
sapl/settings.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sapl/settings.py b/sapl/settings.py
index 782cbb0f4..d616a446f 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -278,6 +278,8 @@ STATICFILES_FINDERS = (
MEDIA_ROOT = PROJECT_DIR.child("media")
MEDIA_URL = '/media/'
+FILE_UPLOAD_PERMISSIONS = 0o644
+
DAB_FIELD_RENDERER = \
'django_admin_bootstrapped.renderers.BootstrapFieldRenderer'
CRISPY_TEMPLATE_PACK = 'bootstrap3'
From 095b1165c2a05a8d5b888bedef808e2620cafe22 Mon Sep 17 00:00:00 2001
From: Edward
Date: Mon, 4 Feb 2019 18:20:43 -0200
Subject: [PATCH 122/222] =?UTF-8?q?Evita=20quebra=20de=20relat=C3=B3rio=20?=
=?UTF-8?q?em=20ementas=20enormes=20(#2468)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/relatorios/templates/pdf_pauta_sessao_gerar.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
index e570e38ea..208b2bf3f 100755
--- a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
+++ b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
@@ -129,6 +129,8 @@ def expediente_materia(lst_expediente_materia):
expediente_materia['id_materia'] + '\n' + '' + expediente_materia['num_autores'] + ': ' + \
expediente_materia['nom_autor'] + ' \n'
txt_ementa = expediente_materia['txt_ementa'].replace('&', '&')
+ if len(txt_ementa) > 1600:
+ txt_ementa = txt_ementa[:1600] + "..."
tmp += '' + txt_ementa + ' ' + '' + expediente_materia['ordem_observacao'] + ' \n'
tmp += '' + \
str(expediente_materia['des_situacao']) + ' \n'
@@ -156,6 +158,8 @@ def votacao(lst_votacao):
str(votacao['des_turno']) + '\n' + ''+votacao['num_autores']+': ' + \
str(votacao['nom_autor']) + ' \n'
txt_ementa = votacao['txt_ementa'].replace('&', '&')
+ if len(txt_ementa) > 1600:
+ txt_ementa = txt_ementa[:1600] + "..."
tmp += '' + txt_ementa + ' ' + '' + votacao['ordem_observacao'] + ' \n'
tmp += '' + \
str(votacao['des_situacao']) + ' \n'
From 9a1f3f770f61bee07081777c4cd0e5a0a0f02666 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 6 Feb 2019 13:56:20 -0200
Subject: [PATCH 123/222] HOT-FIX: corrige erro introduzido em c2ebae0
---
sapl/norma/forms.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py
index c49f94889..bf676c242 100644
--- a/sapl/norma/forms.py
+++ b/sapl/norma/forms.py
@@ -356,7 +356,8 @@ class NormaRelacionadaForm(ModelForm):
def save(self, commit=False):
relacionada = super(NormaRelacionadaForm, self).save(commit)
relacionada.norma_relacionada = self.cleaned_data['norma_relacionada']
- relacionada.norma_relacionada.data_vigencia = relacionada.norma_principal.data
+ if relacionada.tipo_vinculo.revoga_integralmente:
+ relacionada.norma_relacionada.data_vigencia = relacionada.norma_principal.data
relacionada.norma_relacionada.save()
relacionada.save()
return relacionada
From c1d3f88c858689e3a725a676aab4cf817931b33b Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 6 Feb 2019 14:02:10 -0200
Subject: [PATCH 124/222] =?UTF-8?q?corrige=20formul=C3=A1rio=20de=20add=20?=
=?UTF-8?q?doc=20acess=20em=20lote?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/templates/materia/em_lote/acessorio.html | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/sapl/templates/materia/em_lote/acessorio.html b/sapl/templates/materia/em_lote/acessorio.html
index cdf7a85c1..738010083 100644
--- a/sapl/templates/materia/em_lote/acessorio.html
+++ b/sapl/templates/materia/em_lote/acessorio.html
@@ -20,45 +20,58 @@
Documento Acessório
+
Tipo*
{% for t in tipos_docs %} {{t}} {% endfor %}
+
+
-
+
Matérias para inclusão do Documento Acessório
From d6eb7968932f9dee55b57285b633fb7d46ac6ee3 Mon Sep 17 00:00:00 2001
From: Ricardo Lima Canela
Date: Wed, 6 Feb 2019 14:12:04 -0300
Subject: [PATCH 125/222] Insere excecoes no log (#2473)
* adicionando ao log qualquer excecao que ocorra no django
* apagando comentarios desnecessarios
---
sapl/settings.py | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/sapl/settings.py b/sapl/settings.py
index d616a446f..237b137d7 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -340,6 +340,11 @@ LOGGING = {
'level': 'INFO',
'propagate': True,
},
+ 'django': {
+ 'handlers': ['applogfile'],
+ 'level': 'ERROR',
+ 'propagate': True,
+ },
}
}
@@ -358,15 +363,3 @@ def remove_warnings():
remove_warnings()
-
-
-def uncaught_exceptions(type, value, error_traceback):
- import traceback
- logger = logging.getLogger(__name__)
- error_msg = ''.join(traceback.format_tb(error_traceback))
- logger.error(error_msg)
- print(error_msg)
-
-
-# captura exceções que não foram tratadas
-sys.excepthook = uncaught_exceptions
From 88aec7b54278c6176b2424a60ba33908bdf21f32 Mon Sep 17 00:00:00 2001
From: Cesar Augusto de Carvalho
Date: Wed, 6 Feb 2019 15:12:40 -0200
Subject: [PATCH 126/222] =?UTF-8?q?Evita=20quebra=20de=20relat=C3=B3rio=20?=
=?UTF-8?q?em=20ementas=20enormes=20(#2469)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Evita quebra de relatório em ementas enormes
* fix form e pdf resumo
* retirada de linha em branco
* fix form e pdf resumo
* retirada de linha em branco
---
sapl/materia/forms.py | 2 ++
sapl/relatorios/templates/pdf_pauta_sessao_gerar.py | 8 ++++----
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py | 4 ++++
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index 9a1e4eda7..c8ba3e4cf 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -196,6 +196,8 @@ class MateriaLegislativaForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MateriaLegislativaForm, self).__init__(*args, **kwargs)
+
+ self.fields['ementa'].widget.attrs['maxlength'] = 1000
if self.instance and self.instance.pk:
self.fields['tipo_autor'] = forms.CharField(required=False,
diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
index 208b2bf3f..81e0aa70d 100755
--- a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
+++ b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py
@@ -129,8 +129,8 @@ def expediente_materia(lst_expediente_materia):
expediente_materia['id_materia'] + '\n' + '' + expediente_materia['num_autores'] + ': ' + \
expediente_materia['nom_autor'] + ' \n'
txt_ementa = expediente_materia['txt_ementa'].replace('&', '&')
- if len(txt_ementa) > 1600:
- txt_ementa = txt_ementa[:1600] + "..."
+ if len(txt_ementa) > 1000:
+ txt_ementa = txt_ementa[:1000] + "..."
tmp += '' + txt_ementa + ' ' + '' + expediente_materia['ordem_observacao'] + ' \n'
tmp += '' + \
str(expediente_materia['des_situacao']) + ' \n'
@@ -158,8 +158,8 @@ def votacao(lst_votacao):
str(votacao['des_turno']) + '\n' + ''+votacao['num_autores']+': ' + \
str(votacao['nom_autor']) + ' \n'
txt_ementa = votacao['txt_ementa'].replace('&', '&')
- if len(txt_ementa) > 1600:
- txt_ementa = txt_ementa[:1600] + "..."
+ if len(txt_ementa) > 1000:
+ txt_ementa = txt_ementa[:1000] + "..."
tmp += '' + txt_ementa + ' ' + '' + votacao['ordem_observacao'] + ' \n'
tmp += '' + \
str(votacao['des_situacao']) + ' \n'
diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
index c1be7c3f9..02cea969d 100644
--- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
+++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
@@ -208,6 +208,8 @@ def expediente_materia(lst_expediente_materia):
tmp += '' + str(expediente_materia['num_ordem']) + ' - ' + expediente_materia['id_materia'] + ' \n' + 'Turno: ' + expediente_materia[
'des_turno'] + ' \n' + ''+ expediente_materia['num_autores'] + ': ' + str(expediente_materia['nom_autor']) + ' \n'
txt_ementa = expediente_materia['txt_ementa'].replace('&', '&')
+ if len(txt_ementa) > 1000:
+ txt_ementa = txt_ementa[:1000] + "..."
tmp += '' + txt_ementa + ' ' + '' + expediente_materia['ordem_observacao'] + ' \n'
tmp += '' + \
str(expediente_materia['nom_resultado']) + \
@@ -271,6 +273,8 @@ def votacao(lst_votacao):
tmp += '' + str(votacao['num_ordem']) + ' - ' + votacao['id_materia'] + ' \n' + 'Turno: ' + votacao[
'des_turno'] + ' \n' + ''+ votacao['num_autores'] +': ' + str(votacao['nom_autor']) + ' \n'
txt_ementa = votacao['txt_ementa'].replace('&', '&')
+ if len(txt_ementa) > 1000:
+ txt_ementa = txt_ementa[:1000] + "..."
tmp += '' + txt_ementa + ' ' + '' + votacao['ordem_observacao'] + ' \n'
tmp += '' + \
str(votacao['nom_resultado']) + \
From da83ff91c67d990db4876f42294c4580750b2c77 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 6 Feb 2019 15:22:54 -0200
Subject: [PATCH 127/222] ajusta checkbox de autoria multicreate
---
sapl/templates/materia/autoria_multicreate_form.html | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/sapl/templates/materia/autoria_multicreate_form.html b/sapl/templates/materia/autoria_multicreate_form.html
index 59c3ece91..105d42d51 100644
--- a/sapl/templates/materia/autoria_multicreate_form.html
+++ b/sapl/templates/materia/autoria_multicreate_form.html
@@ -26,21 +26,23 @@
if (autores_pre_cadastrados.indexOf(obj.value) !== -1)
return ;
- $(' ')
+ let input = $(' ')
.attr('type', 'checkbox')
.attr('name','autor')
.attr('id', 'id_autor_'+idx)
.attr('value', obj.value)
.appendTo(
- $(' ').text(obj.text)
+ $(' ')
.appendTo(
$('')
- .appendTo($("#div_id_autor .controls")
+ .appendTo(
+ $("#div_id_autor .controls")
+ )
)
- )
)
+ .after(obj.text)
+
});
- $('[type=checkbox]').checkbox();
}
});
}
From 09719f7d96cb3bb0bb44bab7b06ccb71b2d6e3f6 Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 6 Feb 2019 16:39:17 -0200
Subject: [PATCH 128/222] HOT-FIX: conserta erro introduzido em 956e08
---
sapl/templates/auth/user_list.html | 1 +
1 file changed, 1 insertion(+)
diff --git a/sapl/templates/auth/user_list.html b/sapl/templates/auth/user_list.html
index 949e544cb..960d17003 100644
--- a/sapl/templates/auth/user_list.html
+++ b/sapl/templates/auth/user_list.html
@@ -31,4 +31,5 @@
{% endif %}
Criar Usuário
+ {% include 'paginacao.html'%}
{% endblock base_content %}
From 350475a1dbd27071a0f4c4b7407d85ab0fab432a Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 6 Feb 2019 16:58:26 -0200
Subject: [PATCH 129/222] =?UTF-8?q?corrige=20l=C3=B3gica=20de=20tratamento?=
=?UTF-8?q?=20de=20despachos=20iniciais?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/materia/forms.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index c8ba3e4cf..cdb21021d 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -196,7 +196,7 @@ class MateriaLegislativaForm(ModelForm):
def __init__(self, *args, **kwargs):
super(MateriaLegislativaForm, self).__init__(*args, **kwargs)
-
+
self.fields['ementa'].widget.attrs['maxlength'] = 1000
if self.instance and self.instance.pk:
@@ -989,8 +989,9 @@ class DespachoInicialForm(ModelForm):
if DespachoInicial.objects.filter(
materia=self.instance.materia,
comissao=self.cleaned_data['comissao'],
- ).exists():
- msg = _('Esse Despacho já foi cadastrado.')
+ ).exclude(pk=self.instance.pk).exists():
+ msg = _('Já existe um Despacho cadastrado para %s' %
+ self.cleaned_data['comissao'])
raise ValidationError(msg)
return self.cleaned_data
From efe2a39d5c6cac2eecd87564ffa892a8492937cb Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Wed, 6 Feb 2019 17:10:26 -0200
Subject: [PATCH 130/222] Fix #2474
---
sapl/base/forms.py | 15 ++++++++++-----
sapl/materia/forms.py | 9 +++++----
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index d603ffc45..f24868ff6 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -18,14 +18,15 @@ from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy as _
import django_filters
+from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica
from sapl.base.models import Autor, TipoAutor
from sapl.comissoes.models import Reuniao, Comissao
+from sapl.comissoes.models import Reuniao, Comissao
from sapl.crispy_layout_mixin import (SaplFormLayout, form_actions, to_column,
to_row)
-from sapl.audiencia.models import AudienciaPublica,TipoAudienciaPublica
-from sapl.comissoes.models import Reuniao, Comissao
-from sapl.materia.models import (MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
+from sapl.materia.models import (
+ MateriaLegislativa, UnidadeTramitacao, StatusTramitacao)
from sapl.norma.models import (NormaJuridica, NormaEstatisticas)
from sapl.parlamentares.models import SessaoLegislativa
from sapl.sessao.models import SessaoPlenaria
@@ -706,7 +707,7 @@ class RelatorioAtasFilterSet(django_filters.FilterSet):
def ultimo_ano_com_norma():
anos_normas = choice_anos_com_normas()
-
+
if anos_normas:
return anos_normas[0]
return ''
@@ -754,7 +755,7 @@ class EstatisticasAcessoNormasForm(Form):
class Meta:
fields = ['ano']
-
+
def __init__(self, *args, **kwargs):
super(EstatisticasAcessoNormasForm, self).__init__(
*args, **kwargs)
@@ -857,7 +858,11 @@ class RelatorioHistoricoTramitacaoFilterSet(django_filters.FilterSet):
self.filters['tipo'].label = 'Tipo de Matéria'
+ self.filters['tramitacao__unidade_tramitacao_local'
+ ].label = _('Unidade Local (Último Local)')
+ self.filters['tramitacao__status'].label = _('Status')
row1 = to_row([('tramitacao__data_tramitacao', 12)])
+
row2 = to_row(
[('tipo', 4),
('tramitacao__unidade_tramitacao_local', 4),
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index cdb21021d..85659ff78 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -1160,10 +1160,11 @@ class TramitacaoEmLoteFilterSet(django_filters.FilterSet):
super(TramitacaoEmLoteFilterSet, self).__init__(
*args, **kwargs)
- self.filters['tipo'].label = 'Tipo de Matéria'
- self.filters['data_apresentacao'].label = 'Data (Inicial - Final)'
+ self.filters['tipo'].label = _('Tipo de Matéria')
+ self.filters['data_apresentacao'].label = _('Data (Inicial - Final)')
self.filters['tramitacao__unidade_tramitacao_destino'
- ].label = 'Unidade Destino (Último Destino)'
+ ].label = _('Unidade Destino (Último Destino)')
+ self.filters['tramitacao__status'].label = _('Status')
self.form.fields['tipo'].required = True
self.form.fields['data_apresentacao'].required = False
self.form.fields['tramitacao__status'].required = True
@@ -1180,7 +1181,7 @@ class TramitacaoEmLoteFilterSet(django_filters.FilterSet):
self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Tramitação em Lote'),
- row1, row2, form_actions(label='Pesquisar')))
+ row1, row2, form_actions(label=_('Pesquisar'))))
class TipoProposicaoForm(ModelForm):
From 6d01901ef240e7e5194ca84a2c7e3ab689d01d9c Mon Sep 17 00:00:00 2001
From: Edward Ribeiro
Date: Wed, 6 Feb 2019 17:51:54 -0200
Subject: [PATCH 131/222] Release: 3.1.143
---
docker-compose.yml | 2 +-
sapl/templates/base.html | 2 +-
setup.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 5b0ee2315..ab841b87b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,7 +11,7 @@ sapldb:
ports:
- "5432:5432"
sapl:
- image: interlegis/sapl:3.1.142
+ image: interlegis/sapl:3.1.143
restart: always
environment:
ADMIN_PASSWORD: interlegis
diff --git a/sapl/templates/base.html b/sapl/templates/base.html
index 84deb4b60..b13a9e3b4 100644
--- a/sapl/templates/base.html
+++ b/sapl/templates/base.html
@@ -184,7 +184,7 @@
Desenvolvido pelo Interlegis em software livre e aberto.
- Release: 3.1.142
+ Release: 3.1.143
diff --git a/setup.py b/setup.py
index 31cf08684..fb680f72c 100644
--- a/setup.py
+++ b/setup.py
@@ -51,7 +51,7 @@ install_requires = [
]
setup(
name='interlegis-sapl',
- version='3.1.142',
+ version='3.1.143',
packages=find_packages(),
include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',
From 719d4c928a9bd8cfd3746f447f0bc5451de03ad7 Mon Sep 17 00:00:00 2001
From: Cesar Carvalho
Date: Fri, 8 Feb 2019 15:58:23 -0200
Subject: [PATCH 132/222] HOTFIX - Erro de data do timestamp de protocoloadm
---
sapl/materia/models.py | 2 ++
sapl/materia/views.py | 8 +++++++-
sapl/protocoloadm/views.py | 5 ++---
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
index 221078811..1adb21ea5 100644
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -269,6 +269,8 @@ class MateriaLegislativa(models.Model):
if protocolo:
if protocolo.timestamp:
return protocolo.timestamp.date()
+ elif protocolo.timestamp_data_hora_manual:
+ return protocolo.timestamp_data_hora_manual.date()
elif protocolo.data:
return protocolo.data
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index c3036d52e..47cb857af 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -211,7 +211,13 @@ class CriarProtocoloMateriaView(CreateView):
context['form'].fields['tipo'].initial = protocolo.tipo_materia
context['form'].fields['numero'].initial = numero
context['form'].fields['ano'].initial = protocolo.ano
- context['form'].fields['data_apresentacao'].initial = protocolo.timestamp.date()
+ if protocolo:
+ if protocolo.timestamp:
+ context['form'].fields['data_apresentacao'].initial = protocolo.timestamp.date()
+ elif protocolo.timestamp_data_hora_manual:
+ context['form'].fields['data_apresentacao'].initial = protocolo.timestamp_data_hora_manual.date()
+ elif protocolo.data:
+ context['form'].fields['data_apresentacao'].initial = protocolo.data
context['form'].fields['numero_protocolo'].initial = protocolo.numero
context['form'].fields['ementa'].initial = protocolo.assunto_ementa
diff --git a/sapl/protocoloadm/views.py b/sapl/protocoloadm/views.py
index f91ee5227..a750d1881 100755
--- a/sapl/protocoloadm/views.py
+++ b/sapl/protocoloadm/views.py
@@ -730,8 +730,8 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView):
if protocolo.numero < (numero['numero__max'] + 1):
self.logger.error("user=" + username + ". Número de protocolo ({}) é menor que {}"
.format(protocolo.numero, numero['numero__max']))
- msg = _('Número de protocolo deve ser maior que {}').format(
- numero['numero__max'])
+ msg = _('Número de protocolo deve ser maior que {}'.format(
+ numero['numero__max']))
messages.add_message(self.request, messages.ERROR, msg)
return self.render_to_response(self.get_context_data())
protocolo.ano = timezone.now().year
@@ -757,7 +757,6 @@ class ProtocoloMateriaView(PermissionRequiredMixin, CreateView):
protocolo.hora = None
protocolo.user_data_hora_manual = ''
protocolo.ip_data_hora_manual = ''
-
protocolo.save()
data = form.cleaned_data
if data['vincular_materia'] == 'True':
From 9e62f0626346700345eec0310dda9f926adb0260 Mon Sep 17 00:00:00 2001
From: Edward
Date: Fri, 8 Feb 2019 18:40:39 -0200
Subject: [PATCH 133/222] Fixes #2482 (#2483)
---
sapl/templates/search/search.html | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/sapl/templates/search/search.html b/sapl/templates/search/search.html
index a5103d47d..12b7e07fb 100644
--- a/sapl/templates/search/search.html
+++ b/sapl/templates/search/search.html
@@ -42,7 +42,11 @@
{% if query %}
- Resultados
+ Resultados - Foram encontrados {{ page.paginator.count }} registros
+ {% if page.paginator.count %}
+ Registros {{ page.start_index }} a {{ page.end_index }} de {{ page.paginator.count }}
+ {% endif %}
+
{% for result in page.object_list %}
From 4cdc78788f8985d37da34ede4bcebb2fa5954615 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sat, 9 Feb 2019 22:01:08 -0200
Subject: [PATCH 134/222] =?UTF-8?q?ajustas=20heran=C3=A7as=20de=20sele?=
=?UTF-8?q?=C3=A7=C3=A3o=20baseada=20em=20content=5Ftypes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- muda BancadaCrud(Crud) para BancadaCrud(CrudAux) e BlocoCrud(Crud)
para BlocoCrud(CrudAux) e adequa forma de buscar TipoAutor em metodos
save de formulários que criam Autores automaticamente.
---
sapl/comissoes/forms.py | 118 +++++++++++++++++++-----------------
sapl/materia/forms.py | 2 +-
sapl/parlamentares/forms.py | 61 ++++++++++---------
sapl/sessao/forms.py | 4 +-
sapl/sessao/views.py | 17 ++----
5 files changed, 102 insertions(+), 100 deletions(-)
diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py
index 14d42f53e..cef967102 100644
--- a/sapl/comissoes/forms.py
+++ b/sapl/comissoes/forms.py
@@ -13,10 +13,13 @@ from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio,
Participacao, Reuniao, Periodo)
from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
+
class ComposicaoForm(forms.ModelForm):
- comissao = forms.CharField(required=False, label='Comissao', widget=forms.HiddenInput())
+ comissao = forms.CharField(
+ required=False, label='Comissao', widget=forms.HiddenInput())
logger = logging.getLogger(__name__)
+
class Meta:
model = Composicao
exclude = []
@@ -43,8 +46,8 @@ class ComposicaoForm(forms.ModelForm):
if intersecao_periodo:
self.logger.error('O período informado ({} a {})'
- 'choca com períodos já '
- 'cadastrados para esta comissão'.format(periodo.data_inicio, periodo.data_fim))
+ 'choca com períodos já '
+ 'cadastrados para esta comissão'.format(periodo.data_inicio, periodo.data_fim))
raise ValidationError('O período informado '
'choca com períodos já '
'cadastrados para esta comissão')
@@ -55,6 +58,7 @@ class ComposicaoForm(forms.ModelForm):
class PeriodoForm(forms.ModelForm):
logger = logging.getLogger(__name__)
+
class Meta:
model = Periodo
exclude = []
@@ -70,31 +74,29 @@ class PeriodoForm(forms.ModelForm):
if data_fim and data_fim < data_inicio:
self.logger.error('A Data Final ({}) é menor que '
- 'a Data Inicial({}).'.format(data_fim, data_inicio))
+ 'a Data Inicial({}).'.format(data_fim, data_inicio))
raise ValidationError('A Data Final não pode ser menor que '
- 'a Data Inicial')
+ 'a Data Inicial')
# Evita NoneType exception se não preenchida a data_fim
if not data_fim:
data_fim = data_inicio
legislatura = Legislatura.objects.filter(data_inicio__lte=data_inicio,
- data_fim__gte=data_fim,
- )
+ data_fim__gte=data_fim,
+ )
if not legislatura:
self.logger.error('O período informado ({} a {})'
- 'não está contido em uma única '
- 'legislatura existente'.format(data_inicio, data_fim))
+ 'não está contido em uma única '
+ 'legislatura existente'.format(data_inicio, data_fim))
raise ValidationError('O período informado '
'deve estar contido em uma única '
'legislatura existente')
-
return cleaned_data
-
class ParticipacaoCreateForm(forms.ModelForm):
logger = logging.getLogger(__name__)
@@ -122,9 +124,9 @@ class ParticipacaoCreateForm(forms.ModelForm):
parlamentares = Mandato.objects.filter(qs,
parlamentar__ativo=True
).prefetch_related('parlamentar').\
- values_list('parlamentar',
- flat=True
- ).distinct()
+ values_list('parlamentar',
+ flat=True
+ ).distinct()
qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\
exclude(id__in=id_part)
@@ -137,7 +139,6 @@ class ParticipacaoCreateForm(forms.ModelForm):
qs = Parlamentar.objects.filter(id__in=ids)
self.fields['parlamentar'].queryset = qs
-
def clean(self):
cleaned_data = super(ParticipacaoCreateForm, self).clean()
@@ -148,22 +149,23 @@ class ParticipacaoCreateForm(forms.ModelForm):
data_desligamento = cleaned_data['data_desligamento']
if data_desligamento and \
- data_designacao > data_desligamento:
+ data_designacao > data_desligamento:
self.logger.error('Data de designação ({}) superior '
- 'à data de desligamento ({})'.format(data_designacao, data_desligamento))
+ 'à data de desligamento ({})'.format(data_designacao, data_desligamento))
raise ValidationError(_('Data de designação não pode ser superior '
- 'à data de desligamento'))
+ 'à data de desligamento'))
composicao = Composicao.objects.get(id=self.initial['parent_pk'])
- cargos_unicos = [c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
+ cargos_unicos = [
+ c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
if cleaned_data['cargo'].nome in cargos_unicos:
msg = _('Este cargo é único para esta Comissão.')
- self.logger.error('Este cargo ({}) é único para esta Comissão.'.format(cleaned_data['cargo'].nome))
+ self.logger.error('Este cargo ({}) é único para esta Comissão.'.format(
+ cleaned_data['cargo'].nome))
raise ValidationError(msg)
return cleaned_data
-
def create_participacao(self):
composicao = Composicao.objects.get(id=self.initial['parent_pk'])
data_inicio_comissao = composicao.periodo.data_inicio
@@ -237,9 +239,9 @@ class ParticipacaoEditForm(forms.ModelForm):
if data_desligamento and \
data_designacao > data_desligamento:
self.logger.error('Data de designação ({}) superior '
- 'à data de desligamento ({})'.format(data_designacao, data_desligamento))
+ 'à data de desligamento ({})'.format(data_designacao, data_desligamento))
raise ValidationError(_('Data de designação não pode ser superior '
- 'à data de desligamento'))
+ 'à data de desligamento'))
composicao_id = self.instance.composicao_id
@@ -250,7 +252,7 @@ class ParticipacaoEditForm(forms.ModelForm):
if cleaned_data['cargo'].nome in cargos_unicos:
msg = _('Este cargo é único para esta Comissão.')
self.logger.error('Este cargo ({}) é único para esta Comissão (id={}).'
- .format(cleaned_data['cargo'].nome, composicao_id))
+ .format(cleaned_data['cargo'].nome, composicao_id))
raise ValidationError(msg)
return cleaned_data
@@ -259,6 +261,7 @@ class ParticipacaoEditForm(forms.ModelForm):
class ComissaoForm(forms.ModelForm):
logger = logging.getLogger(__name__)
+
class Meta:
model = Comissao
fields = '__all__'
@@ -274,8 +277,6 @@ class ComissaoForm(forms.ModelForm):
self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled'
self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled'
-
-
def clean(self):
super(ComissaoForm, self).clean()
@@ -283,51 +284,54 @@ class ComissaoForm(forms.ModelForm):
return self.cleaned_data
if len(self.cleaned_data['nome']) > 100:
- msg = _('Nome da Comissão informado ({}) tem mais de 50 caracteres.'.format(self.cleaned_data['nome']))
- self.logger.error('Nome da Comissão deve ter no máximo 50 caracteres.')
+ msg = _('Nome da Comissão informado ({}) tem mais de 50 caracteres.'.format(
+ self.cleaned_data['nome']))
+ self.logger.error(
+ 'Nome da Comissão deve ter no máximo 50 caracteres.')
raise ValidationError(msg)
if (self.cleaned_data['data_extincao'] and
self.cleaned_data['data_extincao'] <
self.cleaned_data['data_criacao']):
- msg = _('Data de extinção não pode ser menor que a de criação')
- self.logger.error('Data de extinção ({}) não pode ser menor que a de criação ({}).'
- .format(self.cleaned_data['data_extincao'],self.cleaned_data['data_criacao']))
- raise ValidationError(msg)
+ msg = _('Data de extinção não pode ser menor que a de criação')
+ self.logger.error('Data de extinção ({}) não pode ser menor que a de criação ({}).'
+ .format(self.cleaned_data['data_extincao'], self.cleaned_data['data_criacao']))
+ raise ValidationError(msg)
if (self.cleaned_data['data_final_prevista_temp'] and
self.cleaned_data['data_final_prevista_temp'] <
self.cleaned_data['data_criacao']):
- msg = _('Data Prevista para Término não pode ser menor que a de criação')
- self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de criação ({}).'
- .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_criacao']))
- raise ValidationError(msg)
+ msg = _('Data Prevista para Término não pode ser menor que a de criação')
+ self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de criação ({}).'
+ .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_criacao']))
+ raise ValidationError(msg)
if (self.cleaned_data['data_prorrogada_temp'] and
self.cleaned_data['data_prorrogada_temp'] <
self.cleaned_data['data_criacao']):
- msg = _('Data Novo Prazo não pode ser menor que a de criação')
- self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de criação ({}).'
- .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_criacao']))
- raise ValidationError(msg)
+ msg = _('Data Novo Prazo não pode ser menor que a de criação')
+ self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de criação ({}).'
+ .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_criacao']))
+ raise ValidationError(msg)
if (self.cleaned_data['data_instalacao_temp'] and
self.cleaned_data['data_instalacao_temp'] <
self.cleaned_data['data_criacao']):
- msg = _('Data de Instalação não pode ser menor que a de criação')
- self.logger.error('Data de Instalação ({}) não pode ser menor que a de criação ({}).'
- .format(self.cleaned_data['data_instalacao_temp'], self.cleaned_data['data_criacao']))
- raise ValidationError(msg)
+ msg = _('Data de Instalação não pode ser menor que a de criação')
+ self.logger.error('Data de Instalação ({}) não pode ser menor que a de criação ({}).'
+ .format(self.cleaned_data['data_instalacao_temp'], self.cleaned_data['data_criacao']))
+ raise ValidationError(msg)
if (self.cleaned_data['data_final_prevista_temp'] and self.cleaned_data['data_instalacao_temp'] and
self.cleaned_data['data_final_prevista_temp'] <
self.cleaned_data['data_instalacao_temp']):
- msg = _('Data Prevista para Término não pode ser menor que a de Instalação.')
- self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de Instalação ({}).'
- .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_instalacao_temp']))
- raise ValidationError(msg)
+ msg = _(
+ 'Data Prevista para Término não pode ser menor que a de Instalação.')
+ self.logger.error('Data Prevista para Término ({}) não pode ser menor que a de Instalação ({}).'
+ .format(self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_instalacao_temp']))
+ raise ValidationError(msg)
if (self.cleaned_data['data_prorrogada_temp'] and self.cleaned_data['data_instalacao_temp'] and
self.cleaned_data['data_prorrogada_temp'] <
self.cleaned_data['data_instalacao_temp']):
- msg = _('Data Novo Prazo não pode ser menor que a de Instalação.')
- self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de Instalação ({}).'
- .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_instalacao_temp']))
- raise ValidationError(msg)
+ msg = _('Data Novo Prazo não pode ser menor que a de Instalação.')
+ self.logger.error('Data Novo Prazo ({}) não pode ser menor que a de Instalação ({}).'
+ .format(self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_instalacao_temp']))
+ raise ValidationError(msg)
return self.cleaned_data
@transaction.atomic
@@ -337,7 +341,7 @@ class ComissaoForm(forms.ModelForm):
comissao = super(ComissaoForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Comissao)
object_id = comissao.pk
- tipo = TipoAutor.objects.get(descricao__icontains='Comiss')
+ tipo = TipoAutor.objects.get(content_type=content_type)
nome = comissao.sigla + ' - ' + comissao.nome
Autor.objects.create(
content_type=content_type,
@@ -363,7 +367,6 @@ class ReuniaoForm(ModelForm):
def clean(self):
super(ReuniaoForm, self).clean()
-
if not self.is_valid():
return self.cleaned_data
@@ -371,12 +374,14 @@ class ReuniaoForm(ModelForm):
if self.cleaned_data['hora_fim']:
if (self.cleaned_data['hora_fim'] <
self.cleaned_data['hora_inicio']):
- msg = _('A hora de término da reunião não pode ser menor que a de início')
+ msg = _(
+ 'A hora de término da reunião não pode ser menor que a de início')
self.logger.error("A hora de término da reunião ({}) não pode ser menor que a de início ({})."
- .format(self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio']))
+ .format(self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio']))
raise ValidationError(msg)
return self.cleaned_data
+
class DocumentoAcessorioCreateForm(forms.ModelForm):
parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput())
@@ -395,7 +400,6 @@ class DocumentoAcessorioCreateForm(forms.ModelForm):
documentos = reuniao.documentoacessorio_set.all()
return self.create_documentoacessorio()
-
def create_documentoacessorio(self):
reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index 85659ff78..7e6b5afe0 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -96,7 +96,7 @@ class OrgaoForm(ModelForm):
orgao = super(OrgaoForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Orgao)
object_id = orgao.pk
- tipo = TipoAutor.objects.get(descricao='Órgão')
+ tipo = TipoAutor.objects.get(content_type=content_type)
nome = orgao.nome + ' - ' + orgao.sigla
Autor.objects.create(
content_type=content_type,
diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py
index a15a4e305..a0ef549a4 100755
--- a/sapl/parlamentares/forms.py
+++ b/sapl/parlamentares/forms.py
@@ -1,6 +1,5 @@
-import logging
-
from datetime import timedelta
+import logging
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Fieldset, Layout
@@ -46,8 +45,8 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None):
# Verifica se data de eleição < inicio < fim
if inicio >= fim or eleicao >= inicio:
logger.error('A data início ({}) deve ser menor que a ' +
- 'data fim ({}) e a data eleição ({}) deve ser ' +
- 'menor que a data início ({})'.format(inicio, fim, eleicao, inicio))
+ 'data fim ({}) e a data eleição ({}) deve ser ' +
+ 'menor que a data início ({})'.format(inicio, fim, eleicao, inicio))
msg_error = _('A data início deve ser menor que a ' +
'data fim e a data eleição deve ser ' +
'menor que a data início')
@@ -66,7 +65,8 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None):
# Verifica se há alguma outra data de eleição cadastrada
if Legislatura.objects.filter(
data_eleicao=eleicao).exclude(pk=pk).exists():
- logger.error("Esta data de eleição ({}) já foi cadastrada.".format(eleicao))
+ logger.error(
+ "Esta data de eleição ({}) já foi cadastrada.".format(eleicao))
msg_error = _('Esta data de eleição já foi cadastrada')
return (False, msg_error)
@@ -75,6 +75,7 @@ def validar_datas_legislatura(eleicao, inicio, fim, pk=None):
class MandatoForm(ModelForm):
logger = logging.getLogger(__name__)
+
class Meta:
model = Mandato
fields = ['legislatura', 'coligacao', 'votos_recebidos',
@@ -108,30 +109,30 @@ class MandatoForm(ModelForm):
if (data_fim_mandato < legislatura.data_inicio or
data_fim_mandato > legislatura.data_fim):
self.logger.error("Data fim mandato ({}) fora do intervalo"
- " de legislatura informada ({} a {})."
- .format(data_fim_mandato, legislatura.data_inicio, legislatura.data_fim))
+ " de legislatura informada ({} a {})."
+ .format(data_fim_mandato, legislatura.data_inicio, legislatura.data_fim))
raise ValidationError(_("Data fim mandato fora do intervalo de"
" legislatura informada"))
data_expedicao_diploma = data['data_expedicao_diploma']
if (data_expedicao_diploma and
data_expedicao_diploma > data_inicio_mandato):
- self.logger.error("A data da expedição do diploma ({}) deve ser anterior "
- "a data de início do mandato ({}).".format(data_expedicao_diploma, data_inicio_mandato))
- raise ValidationError(_("A data da expedição do diploma deve ser anterior "
- "a data de início do mandato"))
+ self.logger.error("A data da expedição do diploma ({}) deve ser anterior "
+ "a data de início do mandato ({}).".format(data_expedicao_diploma, data_inicio_mandato))
+ raise ValidationError(_("A data da expedição do diploma deve ser anterior "
+ "a data de início do mandato"))
coligacao = data['coligacao']
if coligacao and not coligacao.legislatura == legislatura:
- self.logger.error("A coligação selecionada ({}) não está cadastrada "
- "na mesma legislatura ({}) que o presente mandato ({}), "
- "favor verificar a coligação ou fazer o cadastro "
- "de uma nova coligação na legislatura correspondente"
- .format(coligacao, coligacao.legislatura, legislatura))
- raise ValidationError(_("A coligação selecionada não está cadastrada "
- "na mesma legislatura que o presente mandato, "
- "favor verificar a coligação ou fazer o cadastro "
- "de uma nova coligação na legislatura correspondente"))
+ self.logger.error("A coligação selecionada ({}) não está cadastrada "
+ "na mesma legislatura ({}) que o presente mandato ({}), "
+ "favor verificar a coligação ou fazer o cadastro "
+ "de uma nova coligação na legislatura correspondente"
+ .format(coligacao, coligacao.legislatura, legislatura))
+ raise ValidationError(_("A coligação selecionada não está cadastrada "
+ "na mesma legislatura que o presente mandato, "
+ "favor verificar a coligação ou fazer o cadastro "
+ "de uma nova coligação na legislatura correspondente"))
existe_mandato = Mandato.objects.filter(
parlamentar=data['parlamentar'],
@@ -158,7 +159,6 @@ class LegislaturaForm(ModelForm):
if not self.is_valid():
return self.cleaned_data
-
numero = data['numero']
data_inicio = data['data_inicio']
data_fim = data['data_fim']
@@ -166,7 +166,6 @@ class LegislaturaForm(ModelForm):
pk = self.instance.pk
-
ultima_legislatura = Legislatura.objects.filter(data_inicio__lt=data_inicio
).order_by('-data_inicio').first()
proxima_legislatura = Legislatura.objects.filter(data_fim__gt=data_fim
@@ -175,13 +174,14 @@ class LegislaturaForm(ModelForm):
if ultima_legislatura and ultima_legislatura.numero >= numero:
self.logger.error("Número ({}) deve ser maior que o da legislatura anterior ({})."
.format(numero, ultima_legislatura.numero))
- raise ValidationError(_("Número deve ser maior que o da legislatura anterior"))
+ raise ValidationError(
+ _("Número deve ser maior que o da legislatura anterior"))
elif proxima_legislatura and proxima_legislatura.numero <= numero:
self.logger.error("O Número ({}) deve ser menor que {}, pois existe uma "
"legislatura afrente cronologicamente desta que está sendo criada!"
.format(numero, proxima_legislatura.numero))
msg_erro = "O Número deve ser menor que {}, pois existe uma " \
- "legislatura afrente cronologicamente desta que está sendo criada!"
+ "legislatura afrente cronologicamente desta que está sendo criada!"
msg_erro = msg_erro.format(proxima_legislatura.numero)
raise ValidationError(_(msg_erro))
@@ -241,7 +241,7 @@ class ParlamentarCreateForm(ParlamentarForm):
data_expedicao_diploma=self.cleaned_data['data_expedicao_diploma'])
content_type = ContentType.objects.get_for_model(Parlamentar)
object_id = parlamentar.pk
- tipo = TipoAutor.objects.get(descricao='Parlamentar')
+ tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
@@ -385,6 +385,7 @@ class ComposicaoColigacaoForm(ModelForm):
class FrenteForm(ModelForm):
logger = logging.getLogger(__name__)
+
def __init__(self, *args, **kwargs):
super(FrenteForm, self).__init__(*args, **kwargs)
self.fields['parlamentares'].queryset = Parlamentar.objects.filter(
@@ -404,15 +405,16 @@ class FrenteForm(ModelForm):
if cd['data_extincao'] and cd['data_criacao'] >= cd['data_extincao']:
self.logger.error("Data Dissolução ({}) não pode ser anterior a Data Criação ({})."
- .format(cd['data_extincao'],cd['data_criacao']))
- raise ValidationError(_("Data Dissolução não pode ser anterior a Data Criação"))
+ .format(cd['data_extincao'], cd['data_criacao']))
+ raise ValidationError(
+ _("Data Dissolução não pode ser anterior a Data Criação"))
return cd
@transaction.atomic
def save(self, commit=True):
frente = super(FrenteForm, self).save(commit)
-
+
if not self.instance.pk:
frente = super(FrenteForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Frente)
@@ -466,7 +468,8 @@ class VotanteForm(ModelForm):
username = cd['username']
user = get_user_model().objects.filter(username=username)
if not user.exists():
- self.logger.error("Não foi possível vincular usuário. Usuário {} não existe.".format(username))
+ self.logger.error(
+ "Não foi possível vincular usuário. Usuário {} não existe.".format(username))
raise ValidationError(_(
"{} [{}] {}".format(
'Não foi possível vincular usuário. Usuário',
diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py
index 68f6d3222..2b8ec4742 100644
--- a/sapl/sessao/forms.py
+++ b/sapl/sessao/forms.py
@@ -317,7 +317,7 @@ class BancadaForm(ModelForm):
bancada = super(BancadaForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Bancada)
object_id = bancada.pk
- tipo = TipoAutor.objects.get(descricao__icontains='Bancada')
+ tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
@@ -352,7 +352,7 @@ class BlocoForm(ModelForm):
bloco = super(BlocoForm, self).save(commit)
content_type = ContentType.objects.get_for_model(Bloco)
object_id = bloco.pk
- tipo = TipoAutor.objects.get(descricao__icontains='Bloco')
+ tipo = TipoAutor.objects.get(content_type=content_type)
Autor.objects.create(
content_type=content_type,
object_id=object_id,
diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py
index b4665429b..096130162 100755
--- a/sapl/sessao/views.py
+++ b/sapl/sessao/views.py
@@ -614,26 +614,20 @@ class OradorCrud(OradorCrud):
return initial
-class BancadaCrud(Crud):
+class BancadaCrud(CrudAux):
model = Bancada
- class ListView(Crud.ListView):
- template_name = 'crud/list_tabaux.html'
-
- class CreateView(Crud.CreateView):
+ class CreateView(CrudAux.CreateView):
form_class = BancadaForm
def get_success_url(self):
return reverse('sapl.sessao:bancada_list')
-class BlocoCrud(Crud):
+class BlocoCrud(CrudAux):
model = Bloco
- class ListView(Crud.ListView):
- template_name = 'crud/list_tabaux.html'
-
- class CreateView(Crud.CreateView):
+ class CreateView(CrudAux.CreateView):
form_class = BlocoForm
def get_success_url(self):
@@ -1902,7 +1896,8 @@ class VotacaoView(SessaoPermissionMixin):
qtde_presentes -= 1
if (qtde_votos > qtde_presentes or qtde_votos < qtde_presentes):
- msg = _('O total de votos não corresponde com a quantidade de presentes!')
+ msg = _(
+ 'O total de votos não corresponde com a quantidade de presentes!')
messages.add_message(request, messages.ERROR, msg)
return self.render_to_response(context)
elif (qtde_presentes == qtde_votos):
From 9b422f14c79e2dd1e5ed305b47a8de44c459cdb2 Mon Sep 17 00:00:00 2001
From: Leandro Roberto
Date: Sun, 10 Feb 2019 15:37:54 -0200
Subject: [PATCH 135/222] =?UTF-8?q?Refatora=20Manuten=C3=A7=C3=A3o=20de=20?=
=?UTF-8?q?Tipos=20de=20Textos=20Articulados?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sapl/compilacao/urls.py | 16 +--
sapl/compilacao/views.py | 109 +++++-------------
sapl/templates/compilacao/layouts.yaml | 8 ++
.../tipotextoarticulado_detail.html | 73 ------------
.../compilacao/tipotextoarticulado_list.html | 50 --------
sapl/templates/menu_tabelas_auxiliares.yaml | 2 +-
6 files changed, 41 insertions(+), 217 deletions(-)
delete mode 100644 sapl/templates/compilacao/tipotextoarticulado_detail.html
delete mode 100644 sapl/templates/compilacao/tipotextoarticulado_list.html
diff --git a/sapl/compilacao/urls.py b/sapl/compilacao/urls.py
index 781a6d80e..9364985aa 100644
--- a/sapl/compilacao/urls.py
+++ b/sapl/compilacao/urls.py
@@ -3,7 +3,8 @@ from django.conf.urls import include, url
from sapl.compilacao import views
from sapl.compilacao.views import (TipoDispositivoCrud, TipoNotaCrud,
TipoPublicacaoCrud, TipoVideCrud,
- VeiculoPublicacaoCrud)
+ VeiculoPublicacaoCrud,
+ TipoTextoArticuladoCrud)
from .apps import AppConfig
@@ -113,14 +114,7 @@ urlpatterns = [
include(TipoPublicacaoCrud.get_urls())),
url(r'^sistema/ta/config/veiculo-publicacao/',
include(VeiculoPublicacaoCrud.get_urls())),
- url(r'^sistema/ta/config/tipo-textoarticulado$',
- views.TipoTaListView.as_view(), name='tipo_ta_list'),
- url(r'^sistema/ta/config/tipo-textoarticulado/create$',
- views.TipoTaCreateView.as_view(), name='tipo_ta_create'),
- url(r'^sistema/ta/config/tipo-textoarticulado/(?P[0-9]+)$',
- views.TipoTaDetailView.as_view(), name='tipo_ta_detail'),
- url(r'^sistema/ta/config/tipo-textoarticulado/(?P[0-9]+)/edit$',
- views.TipoTaUpdateView.as_view(), name='tipo_ta_edit'),
- url(r'^sistema/ta/config/tipo-textoarticulado/(?P[0-9]+)/delete$',
- views.TipoTaDeleteView.as_view(), name='tipo_ta_delete'),
+ url(r'^sistema/ta/config/tipo/',
+ include(TipoTextoArticuladoCrud.get_urls())),
+
]
diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index 897e18cd6..f09ed8a4f 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -50,7 +50,8 @@ from sapl.compilacao.models import (STATUS_TA_EDITION, STATUS_TA_PRIVATE,
from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED,
DISPOSITIVO_SELECT_RELATED_EDIT,
get_integrations_view_names)
-from sapl.crud.base import Crud, CrudAux, CrudListView, make_pagination
+from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, CrudListView,\
+ make_pagination
from sapl.settings import BASE_DIR
@@ -431,88 +432,32 @@ class CompMixin(PermissionRequiredMixin):
return rr
-class TipoTaListView(CompMixin, ListView):
+class TipoTextoArticuladoCrud(CrudAux):
model = TipoTextoArticulado
- paginate_by = 10
- verbose_name = model._meta.verbose_name
- permission_required = 'compilacao.list_tipotextoarticulado'
-
- @property
- def title(self):
- return self.model._meta.verbose_name_plural
-
- @property
- def create_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_create')
-
-
-class TipoTaCreateView(CompMixin, FormMessagesMixin, CreateView):
- model = TipoTextoArticulado
- form_class = TipoTaForm
- template_name = "crud/form.html"
- form_valid_message = _('Registro criado com sucesso!')
- form_invalid_message = _('O registro não foi criado.')
- permission_required = 'compilacao.add_tipotextoarticulado'
-
- def get(self, request, *args, **kwargs):
- self.object = None
- form = self.get_form()
- form.fields['content_type'] = forms.ChoiceField(
- choices=choice_models_in_extenal_views(),
- label=_('Modelo Integrado'), required=False)
-
- return self.render_to_response(self.get_context_data(form=form))
-
- def get_success_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_detail',
- kwargs={'pk': self.object.id})
-
- @property
- def cancel_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_list')
-
-
-class TipoTaDetailView(CompMixin, DetailView):
- model = TipoTextoArticulado
- permission_required = 'compilacao.detail_tipotextoarticulado'
-
-
-class TipoTaUpdateView(CompMixin, UpdateView):
- model = TipoTextoArticulado
- form_class = TipoTaForm
- template_name = "crud/form.html"
- permission_required = 'compilacao.change_tipotextoarticulado'
-
- def get(self, request, *args, **kwargs):
- self.object = self.get_object()
- form = self.get_form()
- form.fields['content_type'] = forms.ChoiceField(
- choices=choice_models_in_extenal_views(),
- label=_('Modelo Integrado'), required=False)
- return self.render_to_response(self.get_context_data(form=form))
-
- def get_success_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_detail',
- kwargs={'pk': self.kwargs['pk']})
-
- @property
- def cancel_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_detail',
- kwargs={'pk': self.kwargs['pk']})
-
-
-class TipoTaDeleteView(CompMixin, DeleteView):
- model = TipoTextoArticulado
- template_name = "crud/confirm_delete.html"
- permission_required = 'compilacao.delete_tipotextoarticulado'
-
- @property
- def detail_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_detail',
- kwargs={'pk': self.kwargs['pk']})
-
- def get_success_url(self):
- return reverse_lazy('sapl.compilacao:tipo_ta_list')
+ public = [RP_LIST, RP_DETAIL, ]
+
+ class CreateView(CrudAux.CreateView):
+ form_class = TipoTaForm
+
+ def get(self, request, *args, **kwargs):
+ self.object = None
+ form = self.get_form()
+ form.fields['content_type'] = forms.ChoiceField(
+ choices=choice_models_in_extenal_views(),
+ label=_('Modelo Integrado'), required=False)
+
+ return self.render_to_response(self.get_context_data(form=form))
+
+ class UpdateView(CrudAux.UpdateView):
+ form_class = TipoTaForm
+
+ def get(self, request, *args, **kwargs):
+ self.object = self.get_object()
+ form = self.get_form()
+ form.fields['content_type'] = forms.ChoiceField(
+ choices=choice_models_in_extenal_views(),
+ label=_('Modelo Integrado'), required=False)
+ return self.render_to_response(self.get_context_data(form=form))
class TaListView(CompMixin, ListView):
diff --git a/sapl/templates/compilacao/layouts.yaml b/sapl/templates/compilacao/layouts.yaml
index 60895b185..20446ba19 100644
--- a/sapl/templates/compilacao/layouts.yaml
+++ b/sapl/templates/compilacao/layouts.yaml
@@ -37,3 +37,11 @@ TipoDispositivo:
- rotulo_separador_variacao23:5 formato_variacao3
- rotulo_separador_variacao34:5 formato_variacao4
- rotulo_separador_variacao45:5 formato_variacao5
+
+
+TipoTextoArticulado:
+ {% trans 'Identificação Básica' %}:
+ - sigla:3 descricao:5 content_type:4
+ {% trans 'Funcionalidaes' %}:
+ - participacao_social publicacao_func
+ - perfis
diff --git a/sapl/templates/compilacao/tipotextoarticulado_detail.html b/sapl/templates/compilacao/tipotextoarticulado_detail.html
deleted file mode 100644
index 5deffd227..000000000
--- a/sapl/templates/compilacao/tipotextoarticulado_detail.html
+++ /dev/null
@@ -1,73 +0,0 @@
-{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %}
-{% load common_tags %}
-
-{% block base_content %}
-
- {% block sections_nav %}
- {% endblock %}
-
-
- {% block actions %}
-
- {% endblock actions %}
-
-
- {% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
-
- {%trans 'Identificação Básica'%}
-
-
-
-
{% field_verbose_name object 'sigla' %}
-
{{ object.sigla}}
-
-
-
-
-
-
{% field_verbose_name object 'descricao' %}
-
{{ object.descricao}}
-
-
-
-
-
-
{% field_verbose_name object 'content_type' %}
-
{{ object.content_type|default:""}}
-
-
-
-
- {%trans 'Funcionalidades'%}
-
-
-
-
{% field_verbose_name object 'participacao_social' %}
-
{{ object.get_participacao_social_display}}
-
-
-
-
-
{% field_verbose_name object 'publicacao_func' %}
-
{{ object.get_publicacao_func_display}}
-
-
-
-
-
-
-
{% field_verbose_name object 'perfis' %}
-
- {% for perfil in object.perfis.all %}
- {{perfil}}
- {% endfor %}
-
-
-
-
-
- {% endblock detail_content %}
-{% endblock base_content %}
diff --git a/sapl/templates/compilacao/tipotextoarticulado_list.html b/sapl/templates/compilacao/tipotextoarticulado_list.html
deleted file mode 100644
index 3445306f5..000000000
--- a/sapl/templates/compilacao/tipotextoarticulado_list.html
+++ /dev/null
@@ -1,50 +0,0 @@
-{% extends "base.html" %}
-{% load i18n compilacao_filters common_tags menus%}
-
-{% block base_content %}
-
-
- {% block actions %}
- {% if perms.compilacao.add_tipotextoarticulado %}
-
- {% endif %}
- {% endblock actions %}
-
-
-
- {% if not object_list %}
-
{{ NO_ENTRIES_MSG }}
- {% else %}
-
-
-
- {% fieldclass_verbose_name 'sapl.compilacao.models.TipoTextoArticulado' 'sigla' %}
- {% fieldclass_verbose_name 'sapl.compilacao.models.TipoTextoArticulado' 'descricao' %}
- {% fieldclass_verbose_name 'sapl.compilacao.models.TipoTextoArticulado' 'content_type' %}
-
-
-
- {% for tipo_ta in object_list %}
-
- {{ tipo_ta.sigla }}
- {{ tipo_ta.descricao }}
- {{ tipo_ta.content_type }}
-
- {% endfor %}
-
-
- {%endif%}
- {% include 'paginacao.html'%}
-
- {% if perms.base.view_tabelas_auxiliares %}
-
- {% endif %}
-
-{% endblock %}
diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml
index 6c8734805..2e8eb6045 100644
--- a/sapl/templates/menu_tabelas_auxiliares.yaml
+++ b/sapl/templates/menu_tabelas_auxiliares.yaml
@@ -126,7 +126,7 @@
css_class: head_title
children:
- title: {% trans 'Tipos de Textos Articulados' %}
- url: sapl.compilacao:tipo_ta_list
+ url: sapl.compilacao:tipotextoarticulado_list
css_class: btn btn-link
- title: {% trans 'Tipos de Publicação' %}
url: sapl.compilacao:tipopublicacao_list
From 2ba8a37873b2bbaa61baa074ff6f78b60a058d05 Mon Sep 17 00:00:00 2001
From: Leandro Roberto da Silva
Date: Sun, 10 Feb 2019 16:41:56 -0200
Subject: [PATCH 136/222] Fix #1540 migra frontend (#2485)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* retira django-bootstrap3 do projeto sapl
* retira bower sass-processor e libsass do projeto sapl
* altera origem do django-admin-bootstrapped
* commenta todas as entradas css e js em base.html
* vue create sapl-frontend
* add e configura django-webpack-loader
* add vue.config.js e configura comunicação com webpack-loader
* adequa staticfiles_dirs e ignora webpack-stats
* cria bloco de expansão para vue_content
* remove rotas do app hellow e impl multiplas entradas
* add nova entrada para gereciamento de temas
* cria plugin para carregar THEME_CUSTOM em .env
* add bootstrap ao projeto e a configuração fixa de temas
* add imports básicos para bootstrap
* move assets para sapl-frontend
* move assets para projetosexterno de tema e configura sapl project para leitura de temas através do .env
* remove theme do sapl frontend project
* retira link simbólico de entre projeto frontend e projeto de tema
* retira scss do projeto django
* altera btn-default/bootstrap3 para btn-outline-dark/bootstrap4
* altera btns de outline-dark para outlink-primary
* migra pull-right para float-right
* migra pull-left para float-left
* migra btn-excluir para btn-outline-danger
* add global entry and configure jquery
* add jquery na entrada global e migra getCookie
* remove row-fluid
* muda active para link a
* ajustes do botão salvar
* ajuste botão add participação em comissão
* ajuste do layout das mensagens de alerta e botao add detail detail
* ajusta script de votação individual
* ajuste eslint
* altera origem da imagem para etiqueta.png
* corrige eslint
* migra tela de busca de autores para sapl-frontend
* corrige fragmento de html para paginação
* ajuste de js e html em protocolo
* ajuste de layout no menu protocolo
* ajuste no formulário de proposições para sapl_frontend
* migra jquery-mask-plugin
* remove código antigo do jquery-mask-plugin
* migra jquery e algumas funções dependentes
* migra tinymce
* ajustes eslint
* ajuste de sub menus
* add campo de hora em mask
* move jquery.runner.js para sapl-frontend
* primeira versão com jquery runner funcionando
* ajusta painel ao sapl-frontend
* ajuste de tela de login
* cria entr compilação p sapl-frontend e migra jsdiff
* migra js das notas
* add import bootstrap em module global
* altera nome de função para iniciar editor de texto rico
* move scss de compilação do tema para o frontend
* adequa crud de notas de compilação ao form do django 1.11
* retira render padrão scripts css e js de image_cropping
* integra jquery runner e image cropping com jquery e lodash global
* ajustes de eslint em compilação
* ajuste de layout para notas e de código eslint
* ajuste de layout para Vides da app compilação
* altera configurações para pasta público de tema ser importada no build
* ajustes de eslint
* ajusta TAs embedded de normas para sapl-frontend
* migra botões de compilação para bootstrap4
* migra componente alert para bootstrap 4
* altera chamada a jQuery e resolve conflito com bootstrap
* altera travis.yaml
* corrige entrada doo sapl-oficial-theme para instalação trivial
* testa modo de definir versão do node no travis
* teste de configuração do travis
* ajuste de teste e das telas de erro 404 e 500
* Configura sapl-frontend e webpackloader
Configura sapl-frontend e webpack-loader com código de produção já
esportado para a sapl/static. Desta forma, tanto no travis como no
docker não existe a necessidade de instalação de node, npm e/ou yarn
* configura docker e localização do webpack-stats.json
* inicia migração da edição de dispositivos
* ajuste de chunks
* resume forma de lidar com com chunks css e js
* cria template tag para tratar chunk-vendors
* corrige menu de configuração dos TAs
* migra barra inferior da vigencia
* migra linha do tempo de vigências
* ajuste nos menus do topo da edição dinamica da compilação
* frontend produção
* ajuste de blocos
* migra layout da edição dinamica de dispositivos originais
* ajuste da seleção de tipos de vigências
* migra frontend de edição dinâmica de dispositivos
* ajst dropdown de seleção de editor de dispositivos
* migra subnav da edição avançada de dispositivos
* separa frontend em outro projeto
* Altera how-to de instalação do ambiente dev
Altera how-to de instalação do ambiente de desenvolvimento com novas instruções para colaboração com o sapl-frontend
* migra barra de navegação de parents de dispositivos
* Alterações no how-to para colab com sapl-frontend
Alterações no how-to para colab com sapl-frontend
* ajuste de docs
* sapl-frontend reinseriu language pt-br datepicker
* ajuste no form autoria multicreate para sapl-frontend
* add webpack blocks no index de painel
* refatora layout do painel para bootstrap4
* migra cadastro de autor
* migra frontend da manutenção de tipos de proposição
* migra tela de incorporação
* remove templates de compilação
* ajusta layout do form de pesquisa textual
* ajustes de layout no painel
* primeira versão checada do frontend
---
.gitignore | 1 +
.travis.yml | 2 -
Dockerfile | 13 +-
docs/instalacao31.rst | 106 +-
requirements/requirements.txt | 13 +-
sapl/base/forms.py | 8 +-
sapl/base/templatetags/common_tags.py | 12 +
sapl/base/tests/test_login.py | 8 +-
sapl/compilacao/forms.py | 65 +-
sapl/crispy_layout_mixin.py | 13 +-
sapl/crud/base.py | 2 +-
sapl/crud/tests/stub_app/templates/base.html | 4 +-
sapl/materia/forms.py | 113 +-
.../migrations/0039_auto_20190209_2346.py | 21 +
sapl/materia/models.py | 16 +-
sapl/materia/views.py | 2 +-
sapl/parlamentares/views.py | 4 +
sapl/protocoloadm/forms.py | 6 +-
sapl/settings.py | 54 +-
sapl/static/css/chunk-vendors.f109b7f2.css | 101 +
sapl/static/css/compilacao.1e862898.css | 1 +
sapl/static/css/global.d2e0a784.css | 1 +
sapl/static/css/painel.61177241.css | 1 +
sapl/static/fonts/fa-brands-400.3186ebd2.eot | Bin 0 -> 125320 bytes
.../static/fonts/fa-brands-400.662c24d0.woff2 | Bin 0 -> 72148 bytes
sapl/static/fonts/fa-brands-400.a995bae1.ttf | Bin 0 -> 125016 bytes
sapl/static/fonts/fa-brands-400.c7d7a2a1.woff | Bin 0 -> 84568 bytes
.../fonts/fa-regular-400.6a9d786e.woff2 | Bin 0 -> 13608 bytes
.../static/fonts/fa-regular-400.72f15fa7.woff | Bin 0 -> 16812 bytes
sapl/static/fonts/fa-regular-400.80efa56b.eot | Bin 0 -> 34388 bytes
sapl/static/fonts/fa-regular-400.fcb220ee.ttf | Bin 0 -> 34092 bytes
sapl/static/fonts/fa-solid-900.20c189aa.ttf | Bin 0 -> 186228 bytes
sapl/static/fonts/fa-solid-900.3638e62e.woff2 | Bin 0 -> 74320 bytes
sapl/static/fonts/fa-solid-900.9a52a4e9.eot | Bin 0 -> 186512 bytes
sapl/static/fonts/fa-solid-900.9c73abbd.woff | Bin 0 -> 96248 bytes
sapl/static/img/fa-brands-400.e4fed0a5.svg | 3300 ++++++++++++
sapl/static/img/fa-regular-400.304f31f4.svg | 803 +++
sapl/static/img/fa-solid-900.c8ea4c79.svg | 4520 +++++++++++++++++
.../img/ui-icons_2694e8_256x240.274157b3.png | Bin 0 -> 4676 bytes
.../img/ui-icons_2e83ff_256x240.602e5d4d.png | Bin 0 -> 4676 bytes
.../img/ui-icons_3d80b3_256x240.24fcd129.png | Bin 0 -> 4676 bytes
.../img/ui-icons_72a7cf_256x240.55a4c5ce.png | Bin 0 -> 4676 bytes
.../img/ui-icons_ffffff_256x240.bb2a88be.png | Bin 0 -> 6487 bytes
sapl/static/js/app.js | 252 -
sapl/static/js/chunk-vendors.406f40ec.js | 2572 ++++++++++
sapl/static/js/compilacao.9bf86742.js | 240 +
sapl/static/js/compilacao.js | 276 -
sapl/static/js/compilacao_edit.js | 610 ---
sapl/static/js/compilacao_notas.js | 143 -
sapl/static/js/compilacao_view.js | 178 -
sapl/static/js/global.594a728f.js | 274 +
sapl/static/js/jquery.runner.js | 296 --
sapl/static/js/painel.518bdc14.js | 192 +
sapl/static/styles/_header.scss | 5 -
sapl/static/styles/_home_index.scss | 188 -
sapl/static/styles/app.scss | 468 --
sapl/static/styles/compilacao.scss | 1542 ------
sapl/templates/404.html | 46 +-
sapl/templates/500.html | 44 +-
sapl/templates/auth/user_list.html | 2 +-
sapl/templates/base.html | 144 +-
.../base/EstatisticasAcessoNormas_filter.html | 4 +-
sapl/templates/base/RelatorioAtas_filter.html | 4 +-
.../base/RelatorioAudiencia_filter.html | 4 +-
...elatorioDataFimPrazoTramitacao_filter.html | 4 +-
.../RelatorioHistoricoTramitacao_filter.html | 4 +-
...latorioMateriasPorAnoAutorTipo_filter.html | 4 +-
.../RelatorioMateriasPorAutor_filter.html | 4 +-
...RelatorioMateriasPorTramitacao_filter.html | 4 +-
.../base/RelatorioNormaMes_filter.html | 4 +-
.../base/RelatorioNormasVigencia_filter.html | 4 +-
.../base/RelatorioPresencaSessao_filter.html | 4 +-
.../base/RelatorioReuniao_filter.html | 4 +-
sapl/templates/base/autor_form.html | 6 +-
sapl/templates/base/casalegislativa_list.html | 4 +-
sapl/templates/base/login.html | 12 +-
.../bootstrap4/layout/formactions.html | 13 +
sapl/templates/comissoes/composicao_list.html | 8 +-
.../compilacao/ajax_actions_dinamic_edit.html | 133 +-
.../ajax_actions_registro_inclusao.html | 2 +-
.../templates/compilacao/base_compilacao.html | 12 +
.../compilacao/dispositivo_form.html | 62 +-
.../dispositivo_form_alteracao.html | 4 +-
.../dispositivo_form_definidor_vigencia.html | 2 +-
.../dispositivo_form_edicao_basica.html | 2 +-
.../compilacao/dispositivo_form_parents.html | 24 +-
.../compilacao/dispositivo_form_search.html | 6 +-
.../dispositivo_form_search_fragment.html | 2 +-
.../compilacao/dispositivo_form_vigencia.html | 2 +-
.../layout/bootstrap_btn_checkbox.html | 2 +-
sapl/templates/compilacao/messages.html | 4 +-
.../compilacao/publicacao_detail.html | 6 +-
.../templates/compilacao/publicacao_list.html | 4 +-
sapl/templates/compilacao/subnav.html | 25 +
sapl/templates/compilacao/text_edit.html | 24 +-
.../templates/compilacao/text_edit_bloco.html | 4 +-
sapl/templates/compilacao/text_list.html | 96 +-
.../compilacao/text_list__embedded.html | 113 +-
.../compilacao/text_list__print_version.html | 8 -
.../compilacao/text_notificacoes.html | 8 +-
.../compilacao/textoarticulado_detail.html | 34 +-
.../compilacao/textoarticulado_list.html | 4 +-
.../textoarticulado_menu_config.html | 16 +-
sapl/templates/crud/confirm_delete.html | 2 +-
sapl/templates/crud/detail.html | 20 +-
sapl/templates/crud/detail_detail.html | 20 +-
sapl/templates/crud/list.html | 8 +-
.../floppyforms/image_thumbnail.html | 2 +-
sapl/templates/index.html | 361 +-
.../materia/adicionar_varias_autorias.html | 4 +-
sapl/templates/materia/autoria_list.html | 2 +-
.../materia/autoria_multicreate_form.html | 6 +-
.../materia/confirmar_proposicao.html | 6 +-
.../materia/materialegislativa_detail.html | 2 +-
.../materia/materialegislativa_filter.html | 8 +-
.../materia/materialegislativa_list.html | 2 +-
.../materia/proposicao_confirm_return.html | 4 +-
sapl/templates/materia/proposicao_detail.html | 20 +-
sapl/templates/materia/proposicao_form.html | 2 +-
sapl/templates/materia/relatoria_form.html | 2 +-
.../materia/tipoproposicao_form.html | 5 +-
sapl/templates/menu_tabelas_auxiliares.yaml | 2 +-
sapl/templates/menus/nav.html | 10 +-
sapl/templates/menus/subnav.html | 12 +-
.../templates/norma/normajuridica_detail.html | 30 +-
.../templates/norma/normajuridica_filter.html | 8 +-
sapl/templates/paginacao.html | 66 +-
sapl/templates/painel/index.html | 180 +-
sapl/templates/painel/mensagem.html | 162 +-
sapl/templates/painel/parlamentares.html | 60 +-
sapl/templates/painel/votacao.html | 199 +-
sapl/templates/painel/voto_nominal.html | 24 +-
.../parlamentares/composicaomesa_form.html | 10 +-
sapl/templates/parlamentares/frente_form.html | 10 +-
.../parlamentar_perfil_publico.html | 2 +-
.../templates/parlamentares/votante_list.html | 4 +-
.../protocoloadm/MateriaTemplate.html | 2 +-
.../protocoloadm/anular_protocoloadm.html | 13 +-
.../protocoloadm/detail_doc_detail.html | 8 +-
.../documentoadministrativo_filter.html | 8 +-
.../pesquisa_documento_detail.html | 4 +-
.../protocoloadm/proposicoes_detail.html | 10 +-
.../protocoloadm/protocolar_documento.html | 19 +-
.../protocoloadm/protocolar_materia.html | 14 +-
.../protocoloadm/protocolo_filter.html | 17 +-
.../protocoloadm/protocolo_list.html | 6 +-
.../protocoloadm/protocolo_mostrar.html | 12 +-
.../protocoloadm/protocoloadm_detail.html | 33 +-
.../tramitacaoadministrativo_detail.html | 8 +-
sapl/templates/search/search.html | 208 +-
.../adicionar_varias_materias_expediente.html | 8 +-
.../adicionar_varias_materias_ordem.html | 8 +-
sapl/templates/sessao/expediente.html | 6 +-
.../sessao/expedientemateria_form.html | 4 +-
.../sessao/expedientemateria_list.html | 4 +-
sapl/templates/sessao/mesa.html | 8 +-
sapl/templates/sessao/ocorrencia_sessao.html | 2 +-
sapl/templates/sessao/ordemdia_list.html | 4 +-
sapl/templates/sessao/painel.html | 3 +-
.../sessao/sessaoplenaria_filter.html | 12 +-
.../templates/sessao/sessaoplenaria_list.html | 2 +-
sapl/templates/sessao/votacao/nominal.html | 2 +-
.../sessao/votacao/votacao_nominal_bloco.html | 2 +-
.../votacao/votacao_simbolica_bloco.html | 2 +-
sapl/utils.py | 2 +-
setup.py | 13 +-
start.sh | 5 -
webpack-stats.json | 1 +
168 files changed, 13551 insertions(+), 5506 deletions(-)
create mode 100644 sapl/materia/migrations/0039_auto_20190209_2346.py
create mode 100644 sapl/static/css/chunk-vendors.f109b7f2.css
create mode 100644 sapl/static/css/compilacao.1e862898.css
create mode 100644 sapl/static/css/global.d2e0a784.css
create mode 100644 sapl/static/css/painel.61177241.css
create mode 100644 sapl/static/fonts/fa-brands-400.3186ebd2.eot
create mode 100644 sapl/static/fonts/fa-brands-400.662c24d0.woff2
create mode 100644 sapl/static/fonts/fa-brands-400.a995bae1.ttf
create mode 100644 sapl/static/fonts/fa-brands-400.c7d7a2a1.woff
create mode 100644 sapl/static/fonts/fa-regular-400.6a9d786e.woff2
create mode 100644 sapl/static/fonts/fa-regular-400.72f15fa7.woff
create mode 100644 sapl/static/fonts/fa-regular-400.80efa56b.eot
create mode 100644 sapl/static/fonts/fa-regular-400.fcb220ee.ttf
create mode 100644 sapl/static/fonts/fa-solid-900.20c189aa.ttf
create mode 100644 sapl/static/fonts/fa-solid-900.3638e62e.woff2
create mode 100644 sapl/static/fonts/fa-solid-900.9a52a4e9.eot
create mode 100644 sapl/static/fonts/fa-solid-900.9c73abbd.woff
create mode 100644 sapl/static/img/fa-brands-400.e4fed0a5.svg
create mode 100644 sapl/static/img/fa-regular-400.304f31f4.svg
create mode 100644 sapl/static/img/fa-solid-900.c8ea4c79.svg
create mode 100644 sapl/static/img/ui-icons_2694e8_256x240.274157b3.png
create mode 100644 sapl/static/img/ui-icons_2e83ff_256x240.602e5d4d.png
create mode 100644 sapl/static/img/ui-icons_3d80b3_256x240.24fcd129.png
create mode 100644 sapl/static/img/ui-icons_72a7cf_256x240.55a4c5ce.png
create mode 100644 sapl/static/img/ui-icons_ffffff_256x240.bb2a88be.png
delete mode 100644 sapl/static/js/app.js
create mode 100644 sapl/static/js/chunk-vendors.406f40ec.js
create mode 100644 sapl/static/js/compilacao.9bf86742.js
delete mode 100644 sapl/static/js/compilacao.js
delete mode 100644 sapl/static/js/compilacao_edit.js
delete mode 100644 sapl/static/js/compilacao_notas.js
delete mode 100644 sapl/static/js/compilacao_view.js
create mode 100644 sapl/static/js/global.594a728f.js
delete mode 100644 sapl/static/js/jquery.runner.js
create mode 100644 sapl/static/js/painel.518bdc14.js
delete mode 100644 sapl/static/styles/_header.scss
delete mode 100644 sapl/static/styles/_home_index.scss
delete mode 100644 sapl/static/styles/app.scss
delete mode 100644 sapl/static/styles/compilacao.scss
create mode 100644 sapl/templates/bootstrap4/layout/formactions.html
create mode 100644 sapl/templates/compilacao/base_compilacao.html
create mode 100644 sapl/templates/compilacao/subnav.html
create mode 100644 webpack-stats.json
diff --git a/.gitignore b/.gitignore
index dfdeb2b5c..c656b3b8f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ __pycache__/
# Nodejs
node_modules/
+yarn.lock
# Distribution / packaging
.Python
diff --git a/.travis.yml b/.travis.yml
index f54ee6d20..80532c789 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,7 +10,6 @@ install:
- pip install -r requirements/test-requirements.txt
before_script:
- - npm install -g bower
- cp sapl/.env_test sapl/.env
- psql -c "CREATE USER sapl WITH PASSWORD 'sapl'" -U postgres;
- psql -c "CREATE DATABASE sapl OWNER sapl;" -U postgres
@@ -18,7 +17,6 @@ before_script:
script:
- ./manage.py migrate
- - ./manage.py bower install
- py.test --create-db
# - ./scripts/django/test_and_check_qa.sh
diff --git a/Dockerfile b/Dockerfile
index f4953de84..8c2dc0fb5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@ FROM alpine:3.8
ENV BUILD_PACKAGES postgresql-dev graphviz-dev graphviz build-base git pkgconfig \
python3-dev libxml2-dev jpeg-dev libressl-dev libffi-dev libxslt-dev \
- nodejs npm py3-lxml py3-magic postgresql-client poppler-utils antiword \
+ nodejs py3-lxml py3-magic postgresql-client poppler-utils antiword \
curl jq openssh-client vim openssh-client bash
RUN apk update --update-cache && apk upgrade
@@ -17,9 +17,7 @@ RUN apk add --no-cache python3 nginx tzdata && \
rm -f /etc/nginx/conf.d/*
RUN mkdir -p /var/interlegis/sapl && \
- apk add --update --no-cache $BUILD_PACKAGES && \
- npm install -g bower && \
- npm cache verify
+ apk add --update --no-cache $BUILD_PACKAGES
WORKDIR /var/interlegis/sapl/
@@ -37,13 +35,6 @@ COPY config/env_dockerfile /var/interlegis/sapl/sapl/.env
# Configura timezone para BRT
# RUN cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo "America/Sao_Paulo" > /etc/timezone
-# manage.py bower install bug: https://github.com/nvbn/django-bower/issues/51
-
-# compilescss - Precompile all occurrences of your SASS/SCSS files for the whole project into css files
-
-RUN python3 manage.py bower_install --allow-root && \
- python3 manage.py compilescss
-
RUN python3 manage.py collectstatic --noinput --clear
# Remove .env(fake) e sapl.db da imagem
diff --git a/docs/instalacao31.rst b/docs/instalacao31.rst
index 6e9146ee4..a9752990f 100644
--- a/docs/instalacao31.rst
+++ b/docs/instalacao31.rst
@@ -28,15 +28,7 @@ Instalar as seguintes dependências do sistema::
pkg-config postgresql postgresql-contrib pgadmin3 python-psycopg2 \
software-properties-common build-essential libxml2-dev libjpeg-dev \
libmysqlclient-dev libssl-dev libffi-dev libxslt1-dev python3-setuptools \
- python3-pip curl poppler-utils antiword default-jre python3-venv
-
- sudo -i
- curl -sL https://deb.nodesource.com/setup_8.x | bash -
- exit
- sudo apt-get install nodejs
-
- sudo npm install npm -g
- sudo npm install -g bower
+ python3-pip poppler-utils antiword default-jre python3-venv
Instalar o virtualenv usando python 3 para o projeto.
-----------------------------------------------------
@@ -153,6 +145,8 @@ Criação da `SECRET_KEY =1.11,<2.0
-django-bootstrap3==11.0.0
django-haystack==2.8.1
django-filter==2.0.0
djangorestframework==3.9.0
dj-database-url==0.5.0
-django-bower==5.2.0
django-braces==1.9.0
django-crispy-forms==1.7.2
django-floppyforms==1.7.0
django-extra-views==0.12.0
django-model-utils==3.1.2
-django-sass-processor==0.7.2
django-reversion==3.0.2
django-reversion-compare==0.8.6
django-speedinfo==1.4.0
django-extensions==2.1.4
django-image-cropping==1.2
+django-webpack-loader==0.6.0
easy-thumbnails==2.5
-libsass==0.17.0
python-decouple==3.1
psycopg2-binary==2.7.6.1
pyyaml==4.2b1
@@ -34,6 +31,10 @@ whoosh==2.7.4
git+git://github.com/interlegis/trml2pdf.git
git+git://github.com/jasperlittle/django-rest-framework-docs
-git+git://github.com/rubgombar1/django-admin-bootstrapped.git
+git+git://github.com/interlegis/django-admin-bootstrapped@custom-for-sapl31
-django-compressor==2.2
\ No newline at end of file
+#django-compressor==2.2
+#django-bootstrap3==11.0.0
+#django-bower==5.2.0
+#django-sass-processor==0.7.2
+#libsass==0.17.0
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index f24868ff6..d97ed1804 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -394,7 +394,7 @@ class AutorForm(ModelForm):
placeholder=_('Pesquisar por possíveis autores para '
'o Tipo de Autor selecionado.')),
StrictButton(
- _('Filtrar'), css_class='btn-default btn-filtrar-autor',
+ _('Filtrar'), css_class='btn-outline-primary btn-filtrar-autor',
type='button')),
css_class='hidden',
data_action='create',
@@ -402,9 +402,9 @@ class AutorForm(ModelForm):
data_field='autor_related')
autor_select = Row(to_column(('tipo', 3)),
- Div(to_column(('nome', 5)),
- to_column(('cargo', 4)),
- css_class="div_nome_cargo"),
+ Div(to_column(('nome', 7)),
+ to_column(('cargo', 5)),
+ css_class="div_nome_cargo row col"),
to_column((autor_related, 9)),
to_column((Div(
Field('autor_related'),
diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py
index 884a6968f..3c72b1654 100644
--- a/sapl/base/templatetags/common_tags.py
+++ b/sapl/base/templatetags/common_tags.py
@@ -1,5 +1,7 @@
from django import template
from django.template.defaultfilters import stringfilter
+from django.utils.safestring import mark_safe
+from webpack_loader import utils
from sapl.base.models import AppConfig
from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposicao
@@ -274,3 +276,13 @@ def filiacao_data_filter(parlamentar, data_inicio):
@register.filter
def filiacao_intervalo_filter(parlamentar, date_range):
return filiacao_data(parlamentar, date_range[0], date_range[1])
+
+
+@register.simple_tag
+def render_chunk_vendors(extension=None):
+ try:
+ tags = utils.get_as_tags(
+ 'chunk-vendors', extension=extension, config='DEFAULT', attrs='')
+ return mark_safe('\n'.join(tags))
+ except:
+ return ''
diff --git a/sapl/base/tests/test_login.py b/sapl/base/tests/test_login.py
index 91665ea8d..7fe7672e5 100755
--- a/sapl/base/tests/test_login.py
+++ b/sapl/base/tests/test_login.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
-import pytest
from django.contrib.auth import get_user_model
+import pytest
+
pytestmark = pytest.mark.django_db
@@ -12,14 +13,15 @@ def user():
def test_login_aparece_na_barra_para_usuario_nao_logado(client):
response = client.get('/')
- assert ' ' in str(
+ assert ' ' in str(
response.content)
def test_username_do_usuario_logado_aparece_na_barra(client, user):
assert client.login(username='jfirmino', password='123')
response = client.get('/')
- assert 'Login ' not in str(response.content)
+ assert 'Login ' not in str(
+ response.content)
assert 'jfirmino' in str(response.content)
assert 'Sair ' in str(response.content)
diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py
index 3c4275bee..0e4f933d7 100644
--- a/sapl/compilacao/forms.py
+++ b/sapl/compilacao/forms.py
@@ -23,7 +23,8 @@ from sapl.compilacao.models import (NOTAS_PUBLICIDADE_CHOICES,
TipoTextoArticulado, TipoVide,
VeiculoPublicacao, Vide)
from sapl.compilacao.utils import DISPOSITIVO_SELECT_RELATED
-from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row
+from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row,\
+ form_actions
from sapl.utils import YES_NO_CHOICES
error_messages = {
@@ -256,19 +257,22 @@ class NotaForm(ModelForm):
])
buttons = FormActions(
- HTML(''
- '%s ' % _('Cancelar')),
+ *[
+ HTML('%s ' % _('Cancelar'))
+ ],
Button(
'submit-form',
'Salvar',
- css_class='btn btn-primary pull-right')
+ css_class='btn btn-primary float-right'),
+ css_class='form-group row justify-content-between mr-1 ml-1'
)
self.helper = FormHelper()
self.helper.layout = Layout(
Div(
- Div(HTML(_('Notas')), css_class='panel-heading'),
+ Div(HTML(_('Notas')), css_class='card-header bg-light'),
Div(
row1,
to_row([(Field(
@@ -279,9 +283,9 @@ class NotaForm(ModelForm):
placeholder=_('URL Externa (opcional)')), 12)]),
row3,
to_row([(buttons, 12)]),
- css_class="panel-body"
+ css_class="card-body"
),
- css_class="panel panel-primary"
+ css_class="card"
)
)
@@ -328,12 +332,15 @@ class VideForm(ModelForm):
def __init__(self, *args, **kwargs):
buttons = FormActions(
- HTML(''
- '%s ' % _('Cancelar')),
+ *[
+ HTML('%s ' % _('Cancelar'))
+ ],
Button(
'submit-form',
'Salvar',
- css_class='btn-primary pull-right')
+ css_class='btn btn-primary float-right'),
+ css_class='form-group row justify-content-between mr-1 ml-1'
)
dispositivo_ref = Field(
@@ -359,15 +366,15 @@ class VideForm(ModelForm):
self.helper = FormHelper()
self.helper.layout = Layout(
Div(
- Div(HTML(_('Vides')), css_class='car-header'),
+ Div(HTML(_('Vides')), css_class='card-header bg-light'),
Div(
to_column((fields_form[0], 6)),
to_column((fields_form[1], 6)),
to_column(('dispositivo_base', 0)),
to_column(('pk', 0)),
- css_class="card-body"
+ css_class="card-body row"
),
- css_class="card bg-light"
+ css_class="card"
)
)
@@ -671,7 +678,7 @@ class DispositivoEdicaoBasicaForm(ModelForm):
cancel_label = _('Fechar')
more = [
- HTML('%s ' %
+ HTML('%s ' %
cancel_label),
]
@@ -680,7 +687,7 @@ class DispositivoEdicaoBasicaForm(ModelForm):
if not (inst.tipo_dispositivo.dispositivo_de_alteracao and
inst.tipo_dispositivo.dispositivo_de_articulacao):
btns_excluir = [
- HTML('%s ' %
+ HTML('%s ' %
_('Cancelar')),
]
- more.append(Submit('salvar', _('Salvar'), css_class='pull-right'))
+ more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
buttons = FormActions(*more, css_class='form-group')
- _fields = [Div(*layout, css_class="row-fluid")] + \
+ _fields = [Div(*layout, css_class="row")] + \
[to_row([(buttons, 12)])]
self.helper = FormHelper()
@@ -1414,14 +1421,14 @@ class DispositivoRegistroRevogacaoForm(Form):
layout.append(Field('dispositivo_search_form'))
more = [
- HTML('%s ' %
+ HTML('%s ' %
_('Cancelar')),
]
- more.append(Submit('salvar', _('Salvar'), css_class='pull-right'))
+ more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
buttons = FormActions(*more, css_class='form-group')
- _fields = [Div(*layout, css_class="row-fluid")] + \
+ _fields = [Div(*layout, css_class="row")] + \
[to_row([(buttons, 12)])]
self.helper = FormHelper()
@@ -1464,14 +1471,14 @@ class DispositivoRegistroInclusaoForm(Form):
layout.append(Div(css_class="allowed_inserts col-md-12"))
more = [
- HTML('%s ' %
+ HTML('%s ' %
_('Cancelar')),
]
- # more.append(Submit('salvar', _('Salvar'), css_class='pull-right'))
+ # more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
buttons = FormActions(*more, css_class='form-group')
- _fields = [Div(*layout, css_class="row-fluid")] + \
+ _fields = [Div(*layout, css_class="row")] + \
[to_row([(buttons, 12)])]
self.helper = FormHelper()
diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py
index 9b2f0867b..245be6b82 100644
--- a/sapl/crispy_layout_mixin.py
+++ b/sapl/crispy_layout_mixin.py
@@ -1,6 +1,5 @@
from math import ceil
-import rtyaml
from crispy_forms.bootstrap import FormActions
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit
@@ -8,6 +7,7 @@ from django import template
from django.core.urlresolvers import reverse, reverse_lazy
from django.utils import formats
from django.utils.translation import ugettext as _
+import rtyaml
def heads_and_tails(list_of_lists):
@@ -21,7 +21,7 @@ def to_column(name_span):
def to_row(names_spans):
- return Div(*map(to_column, names_spans), css_class='row-fluid')
+ return Div(*map(to_column, names_spans), css_class='row')
def to_fieldsets(fields):
@@ -35,7 +35,8 @@ def to_fieldsets(fields):
def form_actions(more=[Div(css_class='clearfix')],
- label=_('Salvar'), name='salvar', css_class='pull-right', disabled=True):
+ label=_('Salvar'), name='salvar',
+ css_class='float-right', disabled=True):
if disabled:
doubleclick = 'this.form.submit();this.disabled=true;'
@@ -43,10 +44,12 @@ def form_actions(more=[Div(css_class='clearfix')],
doubleclick = 'return true;'
return FormActions(
+ *more,
Submit(name, label, css_class=css_class,
# para impedir resubmissão do form
onclick=doubleclick),
- *more)
+ css_class='form-group row justify-content-between'
+ )
class SaplFormLayout(Layout):
@@ -58,7 +61,7 @@ class SaplFormLayout(Layout):
if not buttons:
buttons = form_actions(label=save_label, more=[
HTML('%s ' % cancel_label)
+ ' class="btn btn-dark">%s' % cancel_label)
if cancel_label else None])
_fields = list(to_fieldsets(fields))
diff --git a/sapl/crud/base.py b/sapl/crud/base.py
index faa0e1287..ca5469bf0 100644
--- a/sapl/crud/base.py
+++ b/sapl/crud/base.py
@@ -160,7 +160,7 @@ class ListWithSearchForm(forms.Form):
placeholder=_('Filtrar Lista'),
css_class='input-lg'),
StrictButton(
- _('Filtrar'), css_class='btn-default btn-lg',
+ _('Filtrar'), css_class='btn-outline-primary btn-lg',
type='submit'))
)
diff --git a/sapl/crud/tests/stub_app/templates/base.html b/sapl/crud/tests/stub_app/templates/base.html
index 8a9dc002b..fcf92e5eb 100644
--- a/sapl/crud/tests/stub_app/templates/base.html
+++ b/sapl/crud/tests/stub_app/templates/base.html
@@ -12,9 +12,9 @@
{# Feedback messages #}
{% for message in messages %}
-
+
-
+ ×
{{ message|safe }}
diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py
index 7e6b5afe0..2a95a47ba 100644
--- a/sapl/materia/forms.py
+++ b/sapl/materia/forms.py
@@ -5,7 +5,7 @@ import os
from crispy_forms.bootstrap import Alert, InlineRadios
from crispy_forms.helper import FormHelper
from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset,
- Layout)
+ Layout, Row)
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist, ValidationError
@@ -1191,7 +1191,8 @@ class TipoProposicaoForm(ModelForm):
content_type = forms.ModelChoiceField(
queryset=ContentType.objects.all(),
label=TipoProposicao._meta.get_field('content_type').verbose_name,
- required=True)
+ required=True,
+ help_text=TipoProposicao._meta.get_field('content_type').help_text)
tipo_conteudo_related_radio = ChoiceWithoutValidationField(
label="Seleção de Tipo",
@@ -1215,13 +1216,30 @@ class TipoProposicaoForm(ModelForm):
def __init__(self, *args, **kwargs):
- tipo_select = Fieldset(TipoProposicao._meta.verbose_name,
- Div(to_column(('descricao', 5)),
- to_column(('content_type', 7)),
- css_class='clearfix'),
- to_column(('tipo_conteudo_related_radio', 6)),
-
- to_column(('perfis', 6)))
+ tipo_select = Fieldset(
+ TipoProposicao._meta.verbose_name,
+ Row(
+ to_column(
+ (
+ Row(
+ to_column(('descricao', 12)),
+ to_column(('perfis', 12)),
+ ),
+ 5
+ )
+ ),
+ to_column(
+ (
+ Row(
+ to_column(('content_type', 12)),
+ to_column(('tipo_conteudo_related_radio', 12)),
+ to_column(('tipo_conteudo_related', 12)),
+ ),
+ 7
+ )
+ ),
+ )
+ )
self.helper = FormHelper()
self.helper.layout = SaplFormLayout(tipo_select)
@@ -1403,12 +1421,16 @@ class ProposicaoForm(forms.ModelForm):
fields.append(to_column((
'texto_original', 7 if self.texto_articulado_proposicao else 12)))
- fields.append(to_column((Fieldset(_('Outras informações - Vincular a Matéria Legislativa Existente'),
- to_column(('tipo_materia', 12)),
- to_column(('numero_materia', 6)),
- to_column(('ano_materia', 6))
- ), 12)),
- )
+ fields.append(
+ to_column(
+ (
+ Fieldset(
+ _('Outras informações - Vincular a Matéria Legislativa Existente'),
+ to_row([('tipo_materia', 12), ]),
+ to_row([('numero_materia', 6),
+ ('ano_materia', 6)]),
+ ), 12)),
+ )
self.helper = FormHelper()
self.helper.layout = SaplFormLayout(*fields)
@@ -1552,7 +1574,7 @@ class DevolverProposicaoForm(forms.ModelForm):
to_column(
(form_actions(label=_('Devolver'),
name='devolver',
- css_class='btn-danger pull-right'), 12)
+ css_class='btn-danger float-right'), 12)
)
)
)
@@ -1681,31 +1703,42 @@ class ConfirmarProposicaoForm(ProposicaoForm):
fields = [
Fieldset(
_('Dados Básicos'),
- to_column(('tipo_readonly', 4)),
- to_column(('data_envio', 3)),
- to_column(('autor_readonly', 5)),
- to_column(('descricao', 12)),
- to_column(('observacao', 12)))]
+ to_row(
+ [
+ ('tipo_readonly', 4),
+ ('data_envio', 3),
+ ('autor_readonly', 5),
+ ('descricao', 12),
+ ('observacao', 12)
+ ]
+ )
+ )
+ ]
fields.append(
- Fieldset(_('Vinculado a Matéria Legislativa'),
- to_column(('tipo_materia', 3)),
- to_column(('numero_materia', 2)),
- to_column(('ano_materia', 2)),
- to_column(
- (Alert(_('O responsável pela incorporação pode '
- 'alterar a anexação. Limpar os campos '
- 'de Vinculação gera um %s independente '
- 'sem anexação se for possível para esta '
- 'Proposição. Não sendo, a rotina de incorporação '
- 'não permitirá estes campos serem vazios.'
- ) % self.instance.tipo.content_type,
- css_class="alert-info",
- dismiss=False), 5)),
- to_column(
- (Alert('',
- css_class="ementa_materia hidden alert-info",
- dismiss=False), 12))))
+ Fieldset(
+ _('Vinculado a Matéria Legislativa'),
+ to_row(
+ [
+ ('tipo_materia', 3),
+ ('numero_materia', 2),
+ ('ano_materia', 2),
+ (Alert(_('O responsável pela incorporação pode '
+ 'alterar a anexação. Limpar os campos '
+ 'de Vinculação gera um %s independente '
+ 'sem anexação se for possível para esta '
+ 'Proposição. Não sendo, a rotina de incorporação '
+ 'não permitirá estes campos serem vazios.'
+ ) % self.instance.tipo.content_type,
+ css_class="alert-info",
+ dismiss=False), 5),
+ (Alert('',
+ css_class="ementa_materia hidden alert-info",
+ dismiss=False), 12),
+ ]
+ )
+ )
+ )
itens_incorporacao = []
if self.instance.tipo.content_type.model_class() == \
@@ -1727,7 +1760,7 @@ class ConfirmarProposicaoForm(ProposicaoForm):
)
fields.append(
- Fieldset(_('Registro de Incorporação'), *itens_incorporacao))
+ Fieldset(_('Registro de Incorporação'), Row(*itens_incorporacao)))
self.helper = FormHelper()
self.helper.layout = Layout(*fields)
diff --git a/sapl/materia/migrations/0039_auto_20190209_2346.py b/sapl/materia/migrations/0039_auto_20190209_2346.py
new file mode 100644
index 000000000..f83290bee
--- /dev/null
+++ b/sapl/materia/migrations/0039_auto_20190209_2346.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-02-10 01:46
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('materia', '0038_auto_20190108_1606'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='tipoproposicao',
+ name='content_type',
+ field=models.ForeignKey(default=None, help_text='\n Quando uma proposição é incorporada, ela é convertida de proposição\n para outro elemento dentro do Sapl. Existem alguns elementos que\n uma proposição pode se tornar. Defina este meta-tipo e em seguida\n escolha um Tipo Correspondente!\n ', on_delete=django.db.models.deletion.PROTECT, to='contenttypes.ContentType', verbose_name='Conversão de Meta-Tipos'),
+ ),
+ ]
diff --git a/sapl/materia/models.py b/sapl/materia/models.py
index 1adb21ea5..d32913f58 100644
--- a/sapl/materia/models.py
+++ b/sapl/materia/models.py
@@ -42,13 +42,21 @@ class TipoProposicao(models.Model):
error_messages={
'unique': _('Já existe um Tipo de Proposição com esta descrição.')
})
- content_type = models.ForeignKey(ContentType, default=None,
- on_delete=models.PROTECT,
- verbose_name=_('Definição de Tipo'))
+ content_type = models.ForeignKey(
+ ContentType, default=None,
+ on_delete=models.PROTECT,
+ verbose_name=_('Conversão de Meta-Tipos'),
+ help_text=_("""
+ Quando uma proposição é incorporada, ela é convertida de proposição
+ para outro elemento dentro do Sapl. Existem alguns elementos que
+ uma proposição pode se tornar. Defina este meta-tipo e em seguida
+ escolha um Tipo Correspondente!
+ """)
+ )
object_id = models.PositiveIntegerField(
blank=True, null=True, default=None)
tipo_conteudo_related = SaplGenericForeignKey(
- 'content_type', 'object_id', verbose_name=_('Seleção de Tipo'))
+ 'content_type', 'object_id', verbose_name=_('Tipo Correspondente'))
perfis = models.ManyToManyField(
PerfilEstruturalTextoArticulado,
diff --git a/sapl/materia/views.py b/sapl/materia/views.py
index 47cb857af..58b530217 100644
--- a/sapl/materia/views.py
+++ b/sapl/materia/views.py
@@ -1363,7 +1363,7 @@ def montar_helper_documento_acessorio(self):
# Adiciona novos botões dentro do form
self.helper.layout[0][3][0].insert(1, form_actions(more=[
HTML('
Cancelar ')]))
+ ' class="btn btn-dark">Cancelar')]))
class DocumentoAcessorioCrud(MasterDetailCrud):
diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py
index aa636df79..3f0146cf0 100644
--- a/sapl/parlamentares/views.py
+++ b/sapl/parlamentares/views.py
@@ -464,6 +464,10 @@ class ParlamentarCrud(Crud):
layout_key = 'ParlamentarUpdate'
+ def render_to_response(self, context, **response_kwargs):
+ context['form'].helper.include_media = False
+ return super().render_to_response(context, **response_kwargs)
+
class CreateView(Crud.CreateView):
form_class = ParlamentarCreateForm
diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py
index 77ec1b7bf..d650c7de1 100644
--- a/sapl/protocoloadm/forms.py
+++ b/sapl/protocoloadm/forms.py
@@ -411,8 +411,7 @@ class ProtocoloDocumentForm(ModelForm):
row2),
Fieldset(_('Protocolo com data e hora informados manualmente'),
row3,
- css_id='protocolo_data_hora_manual',
- css_class='hidden'),
+ css_id='protocolo_data_hora_manual'),
row4,
row5,
HTML(" "),
@@ -591,8 +590,7 @@ class ProtocoloMateriaForm(ModelForm):
row2),
Fieldset(_('Protocolo com data e hora informados manualmente'),
row3,
- css_id='protocolo_data_hora_manual',
- css_class='hidden'),
+ css_id='protocolo_data_hora_manual'),
row4,
row5,
HTML(" "),
diff --git a/sapl/settings.py b/sapl/settings.py
index 237b137d7..41d8ba019 100755
--- a/sapl/settings.py
+++ b/sapl/settings.py
@@ -28,6 +28,7 @@ host = socket.gethostbyname_ex(socket.gethostname())[0]
BASE_DIR = Path(__file__).ancestor(1)
PROJECT_DIR = Path(__file__).ancestor(2)
+
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = config('SECRET_KEY', default='')
# SECURITY WARNING: don't run with debug turned on in production!
@@ -77,11 +78,8 @@ INSTALLED_APPS = (
'django.contrib.staticfiles',
'django_extensions',
- 'djangobower',
- 'bootstrap3',
'crispy_forms',
'floppyforms',
- 'sass_processor',
'rest_framework',
'django_filters',
@@ -96,6 +94,8 @@ INSTALLED_APPS = (
'whoosh',
'speedinfo',
+ 'webpack_loader',
+
) + SAPL_APPS
# FTS = Full Text Search
@@ -262,17 +262,33 @@ LOCALE_PATHS = (
'locale',
)
-# Static files (CSS, JavaScript, Images)
-# https://docs.djangoproject.com/en/1.8/howto/static-files/
+FRONTEND_CUSTOM = config('FRONTEND_CUSTOM', default=False, cast=bool)
+
+WEBPACK_LOADER = {
+ 'DEFAULT': {
+ 'CACHE': not DEBUG,
+ 'BUNDLE_DIR_NAME': 'sapl/static/',
+ 'STATS_FILE': (PROJECT_DIR if not FRONTEND_CUSTOM else PROJECT_DIR.parent.child('sapl-frontend')).child('webpack-stats.json'),
+ 'POLL_INTERVAL': 0.1,
+ 'TIMEOUT': None,
+ 'IGNORE': [r'.+\.hot-update.js', r'.+\.map']
+ }
+}
STATIC_URL = '/static/'
STATIC_ROOT = PROJECT_DIR.child("collected_static")
-STATICFILES_DIRS = (BASE_DIR.child("static"),)
+
+STATICFILES_DIRS = (
+ BASE_DIR.child('static'),
+)
+if FRONTEND_CUSTOM:
+ STATICFILES_DIRS = (
+ PROJECT_DIR.parent.child('sapl-frontend').child('dist'),
+ )
+
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
- 'djangobower.finders.BowerFinder',
- 'sass_processor.finders.CssFinder',
)
MEDIA_ROOT = PROJECT_DIR.child("media")
@@ -282,29 +298,11 @@ FILE_UPLOAD_PERMISSIONS = 0o644
DAB_FIELD_RENDERER = \
'django_admin_bootstrapped.renderers.BootstrapFieldRenderer'
-CRISPY_TEMPLATE_PACK = 'bootstrap3'
-CRISPY_ALLOWED_TEMPLATE_PACKS = 'bootstrap3'
+CRISPY_TEMPLATE_PACK = 'bootstrap4'
+CRISPY_ALLOWED_TEMPLATE_PACKS = 'bootstrap4'
CRISPY_FAIL_SILENTLY = not DEBUG
FLOPPY_FORMS_USE_GIS = False
-BOWER_COMPONENTS_ROOT = PROJECT_DIR.child("bower")
-BOWER_INSTALLED_APPS = (
- 'jquery#3.1.1',
- 'bootstrap-sass#3.3.7',
- 'components-font-awesome#4.5.0',
- 'tinymce#4.3.8',
- 'jquery-ui#1.12.1',
- 'jQuery-Mask-Plugin#1.14.0',
- 'jsdiff#2.2.2',
- 'https://github.com/interlegis/drunken-parrot-flat-ui.git',
- 'jquery-query-object#2.2.3',
-)
-
-# Additional search paths for SASS files when using the @import statement
-SASS_PROCESSOR_INCLUDE_DIRS = (BOWER_COMPONENTS_ROOT.child(
- 'bower_components', 'bootstrap-sass', 'assets', 'stylesheets'),
-)
-
# suprime texto de ajuda default do django-filter
FILTERS_HELP_TEXT_FILTER = False
diff --git a/sapl/static/css/chunk-vendors.f109b7f2.css b/sapl/static/css/chunk-vendors.f109b7f2.css
new file mode 100644
index 000000000..6570036d8
--- /dev/null
+++ b/sapl/static/css/chunk-vendors.f109b7f2.css
@@ -0,0 +1,101 @@
+.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-brands-400.3186ebd2.eot);src:url(../fonts/fa-brands-400.3186ebd2.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-brands-400.662c24d0.woff2) format("woff2"),url(../fonts/fa-brands-400.c7d7a2a1.woff) format("woff"),url(../fonts/fa-brands-400.a995bae1.ttf) format("truetype"),url(../img/fa-brands-400.e4fed0a5.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;font-display:auto;src:url(../fonts/fa-regular-400.80efa56b.eot);src:url(../fonts/fa-regular-400.80efa56b.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-regular-400.6a9d786e.woff2) format("woff2"),url(../fonts/fa-regular-400.72f15fa7.woff) format("woff"),url(../fonts/fa-regular-400.fcb220ee.ttf) format("truetype"),url(../img/fa-regular-400.304f31f4.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;font-display:auto;src:url(../fonts/fa-solid-900.9a52a4e9.eot);src:url(../fonts/fa-solid-900.9a52a4e9.eot?#iefix) format("embedded-opentype"),url(../fonts/fa-solid-900.3638e62e.woff2) format("woff2"),url(../fonts/fa-solid-900.9c73abbd.woff) format("woff"),url(../fonts/fa-solid-900.20c189aa.ttf) format("truetype"),url(../img/fa-solid-900.c8ea4c79.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900}
+
+/*!
+ * jQuery UI CSS Framework 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ */
+
+/*!
+ * jQuery UI Draggable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+/*!
+ * jQuery UI Resizable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+/*!
+ * jQuery UI Button 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/button/#theming
+ */
+
+/*!
+ * jQuery UI Checkboxradio 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/checkboxradio/#theming
+ */
+
+/*!
+ * jQuery UI Controlgroup 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/controlgroup/#theming
+ */
+
+
+/*!
+ * jQuery UI Dialog 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/dialog/#theming
+ */
+
+/*!
+ * jQuery UI Sortable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+/*!
+ * jQuery UI Datepicker 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/datepicker/#theming
+ */
+
+/*! jQuery UI - v1.12.0 - 2016-07-08
+* http://jqueryui.com
+* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
+* Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-active,.ui-menu .ui-state-focus{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2em;-webkit-box-sizing:border-box;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus,.ui-controlgroup>.ui-controlgroup-item:focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{-webkit-box-sizing:border-box;box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{-webkit-box-shadow:inset 1px 1px 1px #ccc;box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw,.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:700;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{-webkit-filter:inherit;filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #aed0ea}.ui-widget-content{border:1px solid #ddd;background:#f2f5f7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAIpJREFUKM/tz6ENwkAUgOE/DYYJUA0KZkFUIetxqKJZgQUYguJBIQDVAQhhAESTtnf33r0mMAGakKA+/RHPZv01AYA/n2jxSMKeExXqLO9n6CI+rUYusbANkmptE8JKl/GIP8gjZviBzPWGy0OlBd0uZDqkG/u7lMlrzZaSdupTGdE0zoXw7eZP8Qbj00P2LE1L9gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMDFydjoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDBAL86GAAAAAElFTkSuQmCC) 50% top repeat-x;color:#362b36}.ui-widget-content a{color:#362b36}.ui-widget-header{border:1px solid #aed0ea;background:#deedf7 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAMFJREFUKM/lkD1qwgAYQB8fuHQpgpBO7eDgUByFdO0RuiX0Dj1DzqD0BmZyd9RFTKd2Kc2UQEUL5qdtSJOYCJ+Dh1Do9JYHDx7ZrFrsXwQA/g0CEipRG5cPwdYxvqjFGJ/vVTnYG6R1MW1C0nZhNq6ooQ4e8fVfr+kTdfLnOmF7kbfqiWihT8z5KrJVfcsmzh52kei7PjIVNXDwjsqMz/XPTfUrmDriTfQKh6WodazfMeSV8D7tVpcEQZKU5akvnTkO8y9eZNHr5WMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% 50% repeat-x;color:#222;font-weight:700}.ui-widget-header a{color:#222}.ui-button,.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,html .ui-button.ui-state-disabled:active,html .ui-button.ui-state-disabled:hover{border:1px solid #aed0ea;background:#d7ebf9 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAJhJREFUSMftzyEOggAYBeD33mZz02pwYxo1GDQT5BBsJr0RBzA4TkAyOzwBBTcx6BwGHEESSPAUTsOfvvzhHr38dy4AAAzDMIxvgzQtirrGyX9Om644QoCpuOQOM2RO2Wu2uMTltcmkkAld6cgrPDHmDZ4UMoGLfF4NWgePfXVuV9KGERbimAEmwgFrDEUHfXT+Im0YhvFDPkIzLk7A/EzKAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwMXJ2OgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMEAvzoYAAAAASUVORK5CYII=) 50% 50% repeat-x;font-weight:700;color:#2779aa}.ui-button,.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button{color:#2779aa;text-decoration:none}.ui-button:focus,.ui-button:hover,.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #74b2e2;background:#e4f1fb url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAJxJREFUSMftz60KwmAYhuHnedEkiFGwujC2uGTRYjAurAp6Ip6BmCyLO4gVk8XgYTiTf3yD/cD2gcFjEA1vutoNN16Hamf3AgCAoiiK8m2QZcY0Da5h7rY9YYENxsIBt3CFHmL4wjVTBLjNi1n7wP1Ydq2D57Q826VwxRQBjNQTe0K+qC+2EnqM6X9ijjBhhKFghD46fzGtKIryQ95Jgy/jpWK+ggAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMDFydjoAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDBAL86GAAAAAElFTkSuQmCC) 50% 50% repeat-x;font-weight:700;color:#0070a3}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,a.ui-button:focus,a.ui-button:hover{color:#0070a3;text-decoration:none}.ui-visual-focus{-webkit-box-shadow:0 0 3px 1px #5e9ed6;box-shadow:0 0 3px 1px #5e9ed6}.ui-button.ui-state-active:hover,.ui-button:active,.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active{border:1px solid #2694e8;background:#3baae3 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAI5JREFUSMdjSJq6e/fLJiYGBgYGBoZRapQapUapUYrm1M1l79//SmRi7GZczWjBxFLJ2MRQz8Ryh2kNYx8Tix3TdYbZTKwsTLqM2yHUDibWdOYIhqNMbOlM4YzH0ORYFjIxMaxkYrVjus44m6G4/7DE6/dMTIGMjIyhTIzJDNoMfIPD06PUKDVKjVIDRwEAMuIhVFSEkAcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% 50% repeat-x;font-weight:700;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#2694e8;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#ffef8f url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0T///////8JWPfcAAAAB3RJTUUH4AcIFAkwQTDFlAAAAHNJREFUKM/lkM0Jg2AQBYdXyJc+tI/EJnKyEFvwbkuBCHoQ9CDiMfA8rCGCBSSQ0zD72B8WeynquwDgj/CiEzC5FDBSfswDNwG9s0AuoAtrnQIXAS1JwPNdTALv2cM69+3DBq4HG+OIWOvZlYCV5vtf+mlsEsU1wS9R7TYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMDhUMjA6MDk6NDgrMDI6MDAxcnY6AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwQC/OhgAAAABJRU5ErkJggg==) 50% top repeat-x;color:#363636}.ui-state-checked{border:1px solid #f9dd34;background:#ffef8f}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#cd0a0a;color:#fff}.ui-state-error-text,.ui-state-error a,.ui-widget-content .ui-state-error-text,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error-text,.ui-widget-header .ui-state-error a{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon{background-image:url(../img/ui-icons_72a7cf_256x240.55a4c5ce.png)}.ui-button .ui-icon{background-image:url(../img/ui-icons_3d80b3_256x240.24fcd129.png)}.ui-button:focus .ui-icon,.ui-button:hover .ui-icon,.ui-state-default .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(../img/ui-icons_2694e8_256x240.274157b3.png)}.ui-button:active .ui-icon,.ui-state-active .ui-icon{background-image:url(../img/ui-icons_ffffff_256x240.bb2a88be.png)}.ui-button .ui-state-highlight.ui-icon,.ui-state-highlight .ui-icon{background-image:url(../img/ui-icons_2e83ff_256x240.602e5d4d.png)}.ui-state-error-text .ui-icon,.ui-state-error .ui-icon{background-image:url(../img/ui-icons_ffffff_256x240.bb2a88be.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-first,.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:6px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAAAAAD5BTvyAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0T//xSrMc0AAAAHdElNRQfgBwgUCTBBMMWUAAAAhElEQVRIx+3VMQrAIAyF4Wcmz+Y5e4Yey7E4dhGxIqWQf+iQN4ePgJKXrkM9rWhJPrXJ+5yx3AAproMcJxnLSalWkpseheFaMZZbNvRzD5DgJpDhBkhxHeQ4yVhOMpbbfGwfl09juc2G3lNhLLeAxCEzlotO8XPRKdEp0Snf5qJTftgpN3jsoxwYW8JUAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTA4VDIwOjA5OjQ4KzAyOjAwMXJ2OgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0wOFQyMDowOTo0OCswMjowMEAvzoYAAAAASUVORK5CYII=) 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #000;box-shadow:-7px -7px 7px #000}
\ No newline at end of file
diff --git a/sapl/static/css/compilacao.1e862898.css b/sapl/static/css/compilacao.1e862898.css
new file mode 100644
index 000000000..7a3cac183
--- /dev/null
+++ b/sapl/static/css/compilacao.1e862898.css
@@ -0,0 +1 @@
+a:link:after,a:visited:after{content:""}.test_import:nth-child(2n){background-color:#ccc}#wait_message{display:block;position:fixed;top:0;bottom:0;left:0;right:0;background-color:hsla(0,0%,86.3%,.75);z-index:99}#wait_message #msg{position:relative;margin:20% auto;padding:1.2em 2em;max-width:600px;text-align:center;font-size:1.5em;color:#677;border:1px solid #eee;background-color:#fff!important;-webkit-box-shadow:0 1px 2px #999;box-shadow:0 1px 2px #999}.text-center{text-align:center}.cp-notify{z-index:9999;position:fixed;top:2em;left:50%;min-width:600px;-webkit-transform:translate(-50%);transform:translate(-50%);opacity:.97}.cp-notify,.cp-notify.hide{-webkit-transition:all .4s ease;transition:all .4s ease}.cp-notify.hide{opacity:0;top:-1000px;display:block!important}.cp-notify .message{padding:1em;border:2px solid rgba(0,0,0,.1);border-radius:4px;color:rgba(0,0,0,.6);line-height:1em;font-size:1.3em;text-align:center;-webkit-box-shadow:0 0 100px rgba(0,0,0,.2);box-shadow:0 0 100px rgba(0,0,0,.2)}.cp .vigencia-active{margin-top:30px;display:block}.cp .cp-linha-vigencias{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;list-style:none;margin:4rem 0 3rem;padding:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.cp .cp-linha-vigencias ul{list-style:none;margin:0;padding:0}.cp .cp-linha-vigencias>li{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;line-height:0;background:#000;height:2px;text-align:center;max-width:4rem}.cp .cp-linha-vigencias>li .circle{display:block;width:10px;line-height:0;background:#000;height:10px;margin:-5px auto 0;border-radius:50%}.cp .cp-linha-vigencias>li>a{position:absolute;white-space:nowrap;line-height:1.8rem;text-align:center}.cp .cp-linha-vigencias>li:nth-child(2n)>a{top:100%}.cp .cp-linha-vigencias>li:nth-child(odd)>a{bottom:100%}.cp .cp-linha-vigencias>li ul{z-index:1;position:absolute;display:none;background:#fff;margin:30px 0;border:1px solid #aaa;-webkit-box-shadow:0 0 10px #aaa;box-shadow:0 0 10px #aaa;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cp .cp-linha-vigencias>li ul:before{content:" ";width:2px;height:30px;position:absolute;display:block;background-color:#aaa;bottom:100%;left:50%;margin-left:-1px}.cp .cp-linha-vigencias>li ul li{text-align:left}.cp .cp-linha-vigencias>li ul a{display:block;white-space:nowrap;line-height:2rem;padding:0 10px;font-size:1rem}.cp .cp-linha-vigencias>li ul a:hover{background:#eee}.cp .cp-linha-vigencias>li.active .circle{display:block;width:20px;line-height:0;background:#aaa;height:20px;margin:-10px auto 0}.cp .cp-linha-vigencias>li.active:not(:last-child)>a{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);margin-bottom:15px}.cp .cp-linha-vigencias>li.active>a{margin-bottom:5px}.cp .cp-linha-vigencias>li.active:nth-child(2n)>a{bottom:100%;top:auto}.cp .cp-linha-vigencias>li.active ul{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cp .cp-linha-vigencias>li.active ul li{text-align:left;width:100%}.cp .cp-vigencias .nav-link{padding:.5rem}.cp .cp-vigencias .dropdown-toggle:after{zoom:.8;margin:0}.cp .cp-vigencias .dropdown-menu{margin-left:.5rem}.cp .cp-vigencias .dropdown-item{padding:0}.cp .cp-vigencias .dropdown-item a{line-height:1;padding:.7rem}.cp .desativado .dpt-link,.cp .desativado .dpt-link *,.cp .desativado .dtxt,.cp .desativado .dtxt *,.cp .dpt .dptt>a.desativado .dpt-link,.cp .dpt .dptt>a.desativado .dpt-link *,.cp .dpt .dptt>a.desativado .dtxt,.cp .dpt .dptt>a.desativado .dtxt *{text-decoration:line-through;color:#999!important}.cp .desativado .dpt-link * table,.cp .desativado .dpt-link * table td,.cp .desativado .dpt-link table,.cp .desativado .dpt-link table td,.cp .desativado .dtxt * table,.cp .desativado .dtxt * table td,.cp .desativado .dtxt table,.cp .desativado .dtxt table td,.cp .dpt .dptt>a.desativado .dpt-link * table,.cp .dpt .dptt>a.desativado .dpt-link * table td,.cp .dpt .dptt>a.desativado .dpt-link table,.cp .dpt .dptt>a.desativado .dpt-link table td,.cp .dpt .dptt>a.desativado .dtxt * table,.cp .dpt .dptt>a.desativado .dtxt * table td,.cp .dpt .dptt>a.desativado .dtxt table,.cp .dpt .dptt>a.desativado .dtxt table td{border:1px dotted #ccc}.cp a{text-decoration:none;cursor:pointer}.cp .diff .desativado,.cp .diff .desativado *,.cp .diff .dpt .dptt>a.desativado,.cp .diff .dpt .dptt>a.desativado *,.cp .dpt .diff .dptt>a.desativado,.cp .dpt .diff .dptt>a.desativado *{text-decoration:line-through;color:#ddd!important;font-size:90%}.cp .diff .added{color:#04de2c}.cp .dpt{font-size:1em;position:relative}.cp .dpt.indent{padding-left:1em}.cp .dpt .ementa{padding:2em 0 2em 35%;font-weight:700}.cp .dpt .anexo,.cp .dpt .capitulo,.cp .dpt .disp_finais,.cp .dpt .disp_gerais,.cp .dpt .disp_preliminares,.cp .dpt .disp_transitorias,.cp .dpt .itemsecao,.cp .dpt .livro,.cp .dpt .parte,.cp .dpt .secao,.cp .dpt .subsecao,.cp .dpt .titulo,.cp .dpt .titulo_generico{text-align:center;margin-bottom:1em;font-size:1.15em;margin-top:3em}.cp .dpt .titulo{margin-top:2em}.cp .dpt .capitulo{margin-top:1.5em;font-size:1.15em}.cp .dpt .secao{margin-top:1.2em;margin-bottom:.7em;font-weight:700;font-size:1.15em}.cp .dpt .itemsecao,.cp .dpt .subsecao{margin-top:1em;margin-bottom:.6em;font-weight:700;font-size:1.15em}.cp .dpt .artigo{font-size:1.15em;float:left}.cp .dpt .artigo .dptt{position:relative}.cp .dpt .caput{margin-top:.3333em;font-size:1.15em}.cp .dpt .paragrafo{font-size:1.1em;margin-top:.2222em}.cp .dpt .inciso{font-size:1.1em;margin-top:.1667em}.cp .dpt .alinea,.cp .dpt .item{font-size:1em;margin-top:2px}.cp .dpt .assinatura,.cp .dpt .fecho_lei{margin-top:.6em;font-size:1.15em}.cp .dpt .page-break{page-break-before:always}.cp .dpt .bloco_alteracao{padding-left:10%;font-style:italic;color:#018}.cp .dpt .bloco_alteracao a{text-decoration:underline}.cp .dpt .bloco_alteracao a,.cp .dpt .bloco_alteracao table,.cp .dpt .bloco_alteracao table td{color:#018!important}.cp .dpt .card-header{font-size:1.7rem}.cp .dpt .dn{font-weight:400;position:relative;font-size:70%}.cp .dpt .dn p,.cp .dpt .dn ul{font-weight:400;margin:0 0 0 0;list-style:none;padding:0}.cp .dpt .dn .dnl{display:block;text-align:left!important}.cp .dpt .dn .dnl *{display:inline}.cp .dpt .dn .dnl .bullet{padding:0 .333em;display:inline-block}.cp .dpt .dn .dnl .dnli{min-height:2.5em}.cp .dpt .dn .dnl .dnli:hover ul{font-size:1rem;clip:auto;opacity:1;background:hsla(0,0%,90.2%,.9)}.cp .dpt .dn .dnl .dnli:hover ul,.cp .dpt .dn .dnl .dnli ul{-webkit-transition:opacity .5s linear,clip 0s .3s;transition:opacity .5s linear,clip 0s .3s}.cp .dpt .dn .dnl .dnli ul{clip:rect(0,0,0,0);opacity:0;position:absolute;background:transparent;right:0;padding:.2em .5em 0 .5em;border:1px solid #c7e3d3;border-top:0;font-size:1.5rem}.cp .dpt .dn .dnl .dnli ul li{display:table-cell;color:#aaa}.cp .dpt .dn .dnl .dnli ul li:hover{color:#787}.cp .dpt .dn .dnl .dnli ul li .nowner,.cp .dpt .dn .dnl .dnli ul li:hover a{color:#27ae60!important}.cp .dpt .dn .dnl .dnli .ntitulo{font-weight:700;color:#03a203;text-decoration:none}.cp .dpt .dn .dnl .dnli .ntitulo a{color:#294!important}.cp .dpt .dn .dnl .dnli .ntexto{color:#06d806}.cp .dpt .dn .dnl .dnli .ntexto a{color:#03a203!important}.cp .dpt .dn .dnl:hover,.cp .dpt .dn .dnl:hover *{display:block}.cp .dpt .dn .dnl:hover>.bullet{display:none}.cp .dpt .dn .dnl:hover .dnli{margin-top:.5em;border-top:1px solid #c7e3d3}.cp .dpt .dptt{clear:left}.cp .dpt .dptt>a{color:#000}.cp .dpt .dptt>a.nota-alteracao{color:#02baf2;font-size:.75em}.cp .dpt .dptt>a.nota-alteracao:hover{text-decoration:underline}.cp .dpt .dptt .dne{position:absolute;display:block;right:0;left:0;top:0;height:0;-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:right;transform-origin:right;-webkit-transition:all .3s ease;transition:all .3s ease;border-top:1px solid #2980b9}.cp .dpt .dptt .dne ul.btns-action{list-style:none;padding:0;position:absolute;right:0;background-color:#2980b9}.cp .dpt .dptt .dne ul.btns-action li{float:left}.cp .dpt .dptt .dne ul.btns-action li:hover{background-color:rgba(0,0,0,.1)}.cp .dpt .dptt .dne ul.btns-action li a{color:#fff;padding:.15em 1em 0;display:inline-block}.cp .dpt .dptt .dne-nota{position:relative;-webkit-transform:scaleX(1);transform:scaleX(1);height:auto;border-top:0}.cp .dpt .dptt .dne-nota ul.btns-action{display:none}.cp .dpt .dptt .dne-nota .dne-form{margin:1em -2em 0;text-align:left;font-size:1rem}.cp .dpt .dptt:hover .dne{height:.1667rem;-webkit-transform:scaleX(1);transform:scaleX(1);-webkit-transition-delay:1s;transition-delay:1s}.cp .dpt .dptt:hover .dne-nota{height:auto;-webkit-transition-delay:0s;transition-delay:0s}.cp .tipo-vigencias{margin-bottom:-6px;opacity:.8}.cp .tipo-vigencias div a{color:#fff}.cp .tipo-vigencias:hover,.cp:hover{opacity:1}.cp.cpe .desativado,.cp.cpe .dpt .dptt>a.desativado{text-decoration:line-through;color:#999!important}.cp.cpe .desativado table,.cp.cpe .desativado table td,.cp.cpe .dpt .dptt>a.desativado table,.cp.cpe .dpt .dptt>a.desativado table td{border:1px dotted #ccc}.cp.cpe a.nota-alteracao{color:#02baf2!important;font-size:.8rem}.cp.cpe .btn-sm{line-height:1rem}.cp.cpe .btn-outline-primary{background-color:#fff}.cp.cpe .btn-outline-primary:hover{background-color:#02baf2}.cp.cpe .dpt{display:block}.cp.cpe .dpt>.dpt-actions-fixed{position:absolute;right:-1em;top:-.8em;z-index:3;opacity:0}.cp.cpe .dpt>.dpt-actions-fixed .activate{display:none}.cp.cpe .dpt>.dpt-actions-fixed .deactivate{display:inline}.cp.cpe .dpt>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary{color:#333}.cp.cpe .dpt>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary:hover{color:#fff;background-color:#02baf2}.cp.cpe .dpt>.dpt-actions,.cp.cpe .dpt>.dpt-actions-bottom{display:none}.cp.cpe .dpt>.dpt-text{cursor:text;min-height:30px;border:1px solid transparent}.cp.cpe .dpt>.dpt-text.hover-fixed,.cp.cpe .dpt>.dpt-text:hover{background-color:rgba(0,0,0,.01);color:#2980b9;border:1px solid #eee;-webkit-transition:color .3s ease;transition:color .3s ease}.cp.cpe .dpt>.dpt-text.artigo{float:none}.cp.cpe .dpt>.dpt-text a.link-rotulo{color:#000}.cp.cpe .dpt:hover>.dpt-actions-fixed{opacity:1}.cp.cpe .dpt:hover>.dpt-actions-fixed:hover~.dpt-text{background-color:rgba(0,0,0,.01);color:#2980b9;border:1px solid #eee;-webkit-transition:color .3s ease;transition:color .3s ease}.cp.cpe .dpt .semtexto{font-weight:700;color:#9aaed6}.cp.cpe .dpt .semtexto:hover{color:#5f76a4}.cp.cpe .dpt-alts{margin:0;margin-bottom:1em;padding:0;background-color:transparent;min-height:100px;border:2px dashed #fff}.cp.cpe .dpt-alts:hover{border-color:#d9ddde}.cp.cpe .dpt-alts:empty{border-color:#ddd}.cp.cpe .dpt-alts.drag{width:100%!important;border-color:#d9ddde}.cp.cpe .dpt-alts.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe .dpt-alts .dpt{width:100%!important;-webkit-box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);padding:0;margin:0;background-color:#edf0f1;height:auto!important;min-height:2em;z-index:1}.cp.cpe .dpt-alts .dpt:not(:first-child){border-top:1px solid #fff}.cp.cpe .dpt-alts .dpt>.dpt-text{padding:.3em 1em;margin-top:0;margin-bottom:0}.cp.cpe .dpt-alts .dpt>.dpt-text a.link-rotulo{text-decoration:underline}.cp.cpe .dpt-alts .dpt-selected.dpt{margin:0 -.5em}.cp.cpe .dpt-selected.dpt{width:auto!important;margin:1em -.5em;border:1px solid #ddd!important;padding:0;background-color:#fafafa;border-radius:3px;z-index:4}.cp.cpe .dpt-selected.dpt>.dpt-text{border:1px solid transparent}.cp.cpe .dpt-selected.dpt>.dpt-text:hover{border:1px solid transparent;background-color:transparent}.cp.cpe .dpt-selected.dpt>.dpt-form{margin:0 1rem}.cp.cpe .dpt-selected.dpt>.dpt-actions,.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom{display:table;background-color:#e5e5e5;padding:.8rem .6rem .2rem .6rem;margin-bottom:0;width:100%}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom>.btn-action,.cp.cpe .dpt-selected.dpt>.dpt-actions>.btn-action{display:table-cell;float:none}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom .btns-excluir .btn-danger,.cp.cpe .dpt-selected.dpt>.dpt-actions .btns-excluir .btn-danger{display:inline-block;opacity:.3;color:#fff}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom .btns-excluir .btn-danger:hover,.cp.cpe .dpt-selected.dpt>.dpt-actions .btns-excluir .btn-danger:hover{opacity:1}.cp.cpe .dpt-selected.dpt>.dpt-actions-bottom{margin:0;padding-bottom:.8rem}.cp.cpe .dpt-selected .dpt-block{border-top:1px solid #e5e5e5!important;opacity:.6;-webkit-transition:opacity .4s ease;transition:opacity .4s ease}.cp.cpe .dpt-selected .dpt-block:hover{opacity:1}.cp.cpe .dpt-selected .dpt-text{opacity:.7;margin:0;padding:.7em}.cp.cpe .dpt-selected .dpt-text:hover{opacity:1;background-color:#f5f5f5}.cp.cpe .dpt-selected .dpt-alts{margin:1em}.cp.cpe .dpt-selected .dpt-alts .dpt{-webkit-box-shadow:0 0 0;box-shadow:0 0 0}.cp.cpe .dpt-selected>.dpt-actions-fixed{opacity:1;top:-15px;right:.5em}.cp.cpe .dpt-selected>.dpt-actions-fixed .activate{display:inline}.cp.cpe .dpt-selected>.dpt-actions-fixed .deactivate{display:none}.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit{padding:0 6px;line-height:1.2rem}.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary,.cp.cpe .dpt-selected>.dpt-actions-fixed .btn-dpt-edit.btn-outline-primary:hover{background-color:#fad46b;border:1px solid #444}.cp.cpe .dpt-selected .btns-tipos-editor{padding:0}.cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left{right:auto!important;left:0;padding:0}.cp.cpe .dpt-selected .dropdown-menu li{line-height:1}.cp.cpe .dpt-selected .dropdown-menu li a{display:block;line-height:1.5rem;padding:0 .5rem;white-space:nowrap}.cp.cpe .dpt-selected .dropdown-menu li a:hover{background-color:#f0f0f0}.cp.cpe .dpt-selected .dropdown-menu li:not(:last-child){border-bottom:1px solid #f0f0f0}.cp.cpe .dpt-selected .btn-group .radius-right{border-bottom-right-radius:.2rem!important;border-top-right-radius:.2rem!important}.cp.cpe .dpt-selected:hover>.dpt-actions-fixed{opacity:1}.cp.cpe1_old_apagar{margin-bottom:15em}.cp.cpe1_old_apagar .desativado,.cp.cpe1_old_apagar .desativado *,.cp.cpe1_old_apagar .dpt .dptt>a.desativado,.cp.cpe1_old_apagar .dpt .dptt>a.desativado *{text-decoration:line-through;color:#999!important}.cp.cpe1_old_apagar .desativado * table,.cp.cpe1_old_apagar .desativado * table td,.cp.cpe1_old_apagar .desativado table,.cp.cpe1_old_apagar .desativado table td,.cp.cpe1_old_apagar .dpt .dptt>a.desativado * table,.cp.cpe1_old_apagar .dpt .dptt>a.desativado * table td,.cp.cpe1_old_apagar .dpt .dptt>a.desativado table,.cp.cpe1_old_apagar .dpt .dptt>a.desativado table td{border:1px dotted #ccc}.cp.cpe1_old_apagar a{text-decoration:none;cursor:pointer}.cp.cpe1_old_apagar .dpt{position:relative;display:block}.cp.cpe1_old_apagar .dpt .semtexto{font-weight:700;color:#bfd1f6}.cp.cpe1_old_apagar .dpt .artigo{float:none}.cp.cpe1_old_apagar .dpt .caput{margin-top:0}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left,.cp.cpe1_old_apagar .dpt>.actions_right{color:#fff;right:0;position:absolute;opacity:0;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out;z-index:1000}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left a.btn-bloco,.cp.cpe1_old_apagar .dpt>.actions_right a.btn-bloco{background-color:#3498db;color:#fff!important;padding:8px 18px 6px;display:inline-block;line-height:1;float:right}.cp.cpe1_old_apagar .dpt-selected .csform .dpt>.actions_left a.btn-bloco:hover,.cp.cpe1_old_apagar .dpt>.actions_right a.btn-bloco:hover{opacity:1;background-image:-webkit-gradient(linear,left top,left bottom,from(#1c81c4),to(#0b6dad));background-image:linear-gradient(180deg,#1c81c4,#0b6dad)}.cp.cpe1_old_apagar .dpt-selected .csform .dpt:hover>.actions_left,.cp.cpe1_old_apagar .dpt:hover>.actions_right{opacity:1}.cp.cpe1_old_apagar .dpt .bloco{display:block;clear:both}.cp.cpe1_old_apagar .dpt .bloco :hover{color:#27ae60}.cp.cpe1_old_apagar .dpt .bloco .de{cursor:pointer}.cp.cpe1_old_apagar .dpt .articulacao{border-top:2px solid #e5e5e5;margin:2em 0}.cp.cpe1_old_apagar .dpt .bloco_alteracao{margin:1em 0;padding:0;background-color:transparent;min-height:100px;border:2px dashed #fff}.cp.cpe1_old_apagar .dpt .bloco_alteracao:hover{border-color:#d9ddde}.cp.cpe1_old_apagar .dpt .bloco_alteracao.drag{width:100%!important;border-color:#d9ddde}.cp.cpe1_old_apagar .dpt .bloco_alteracao.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt{width:100%!important;-webkit-box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);box-shadow:0 -1px 0 #e5e5e5,0 0 2px rgba(0,0,0,.12),0 2px 4px rgba(0,0,0,.24);padding:.3em 1em;margin:0;background-color:#edf0f1;z-index:1}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt:not(:first-child){border-top:1px solid #fff}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.ui-draggable div{cursor:pointer}.cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.dpt-comp-selected{-webkit-transition:all .3s ease;transition:all .3s ease;width:auto!important;margin:2em -3.7em;-webkit-box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32);box-shadow:0 0 6px rgba(0,0,0,.16),0 6px 12px rgba(0,0,0,.32)}.cp.cpe1_old_apagar .dpt-selected{font-size:1em;border:0 solid #ccc;margin:1em -1.8em 1em -1.8em;padding:2.2em 2.2em 1.6em 2.2em;-webkit-box-shadow:-4px 15px 15px rgba(0,0,0,.1),0 6px 6px rgba(0,0,0,.23);box-shadow:-4px 15px 15px rgba(0,0,0,.1),0 6px 6px rgba(0,0,0,.23);background-image:-webkit-gradient(linear,left top,left bottom,from(#eaeaee),to(#ddd));background-image:linear-gradient(180deg,#eaeaee,#ddd)}.cp.cpe1_old_apagar .dpt-selected ul{list-style:none;margin:0;padding:0}.cp.cpe1_old_apagar .dpt-selected .semtexto{color:#999}.cp.cpe1_old_apagar .dpt-selected .bloco{opacity:.5}.cp.cpe1_old_apagar .dpt-selected .bloco:hover{opacity:1}.cp.cpe1_old_apagar .dpt-selected .bloco a:hover{background:transparent}.cp.cpe1_old_apagar .dpt-selected>.bloco{opacity:1;margin:1em}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao{margin:0;padding:1em;border:0 transparent;background-image:-webkit-gradient(linear,left top,left bottom,from(#eaeaee),to(#ddd));background-image:linear-gradient(180deg,#eaeaee,#ddd)}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao:hover{border-color:transparent}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag{width:100%!important}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag .dpt{-webkit-transition-duration:0s!important;transition-duration:0s!important}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt{width:auto!important;-webkit-transition:all .3s ease;transition:all .3s ease;background-color:#fff}.cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt:not(:first-child){border-top:0 solid #fff}.cp.cpe1_old_apagar .dpt-selected>.dpt{padding:0}.cp.cpe1_old_apagar .dpt-selected>.dpt:last-child{padding-bottom:1em}.cp.cpe1_old_apagar .dpt-selected .csform .dpt-selected>.actions_left a.btn-bloco,.cp.cpe1_old_apagar .dpt-selected>.actions_right a.btn-bloco{display:none}.cp.cpe1_old_apagar .dpt-selected .csform{display:block;clear:both;z-index:9;position:static}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action{-webkit-animation:fadeIn 1s ease-in-out;-moz-animation:fadeIn 1s ease-in-out;-o-animation:fadeIn 1s ease-in-out;opacity:1;position:absolute;display:table;-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action a{color:#16407c;display:block;background:transparent;vertical-align:middle;text-align:center;font-weight:400;text-shadow:0 0 10px rgba(0,0,0,.3);padding:.33em .4em}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li{position:relative;display:table-cell;vertical-align:top}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li:hover{background-color:hsla(0,0%,100%,.5)}.cp.cpe1_old_apagar .dpt-selected .csform .btns-action>li:hover>a{text-shadow:0 0 5px #777;color:#0a5}.cp.cpe1_old_apagar .dpt-selected .csform .label_status{position:absolute;bottom:0;right:0;color:#889;padding:.3em;font-size:80%;text-align:right;z-index:15;display:table}.cp.cpe1_old_apagar .dpt-selected .csform .label_status li{display:table-cell;padding:0 .5em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents{z-index:11;top:0;left:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents a{padding:.62em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div,.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents li{font-size:80%;display:table-cell;vertical-align:middle;border-right:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div{padding:0 .4em;font-stretch:condensed;font-variant:small-caps;font-weight:700;text-shadow:0 0 10px #fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_parents>li:hover a{color:#16407c;font-weight:400}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top{top:0;right:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top a{padding-right:1em;padding-left:1em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li,.cp.cpe1_old_apagar .dpt-selected .csform .actions_top li{display:table-cell;vertical-align:middle;border-left:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom{top:auto;left:0;bottom:0;display:inline-block;border-top:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a{padding:0 .4em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li{border:0;border-right:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right{top:2.2em;right:0;bottom:0;display:block}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left li,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right li{width:2.2em;display:block;border-bottom:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left li:first-child,.cp.cpe1_old_apagar .dpt-selected .csform .actions_right li:first-child{border-top:1px solid #ccc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_left{right:auto;left:0}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts{background:transparent;position:relative;z-index:19;display:table;width:100%}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li{display:table-cell}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li:hover>a{background-image:-webkit-gradient(linear,left top,left bottom,from(#1c81c4),to(#0b6dad));background-image:linear-gradient(180deg,#1c81c4,#0b6dad)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a{background-image:-webkit-gradient(linear,left top,left bottom,from(#3498db),to(#2980c9));background-image:linear-gradient(180deg,#3498db,#2980c9);border-right:1px solid #fff;padding:.2em;display:block;color:#fff;text-align:center;white-space:nowrap}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar{text-align:left;background:#a70808;color:#c99;padding-left:1.7em;position:relative}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir:hover,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:hover{background-color:#c70808;color:#ecc}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-excluir:before,.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{z-index:20;position:absolute;background:url(/static/img/icon_delete_white.png) no-repeat 50% 50%;content:"";top:0;left:0;display:block;color:#000;margin-left:.4em;height:100%;width:2em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar{background:#1f8b4d;color:#fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:hover{background:#2d9c5c;color:#fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{background:url(/static/img/icon_save_white.png) no-repeat 50% 50%}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a span{padding:0 .7em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li:last-child>a{border-right:0 solid #fff}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li:nth-child(2n) a{background:#3385ca}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li a{border-right:1px solid #fff;display:block;color:#fff;background:#2980c9;font-size:80%;padding:.23em 1em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>ul li a:hover{background:#0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior{table-layout:fixed}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.add_prior:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir{display:block;position:static}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{right:.5em}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a{background-color:#a70808}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li a:hover{background:#c70808}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{border-color:transparent transparent #a70808;right:10%;left:auto}.cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:hover:before{border-color:transparent transparent #c70808}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo{z-index:2000}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li a,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li a{border-right:0!important}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li:first-child:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul li:first-child:hover:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li>ul:after,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li:hover>ul,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante>li.menu_excluir>ul li:first-child:before,.cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo>li.menu_excluir>ul li:first-child:before{right:auto;left:.9375rem}.cp.cpe1_old_apagar .dpt-selected .csform textarea{margin:0;resize:vertical;min-height:12.6em;border:0;font-size:120%;width:100%}.cp.cpe1_old_apagar .dpt-selected .csform textarea:focus{background:#fff}.cp.cpe1_old_apagar .dpt-selected .csform textarea::-webkit-input-placeholder{color:#c70808;opacity:.6;font-size:80%}.cp.cpe1_old_apagar .dpt-selected .csform textarea:-moz-placeholder,.cp.cpe1_old_apagar .dpt-selected .csform textarea::-moz-placeholder{color:#c70808}.cp.cpe1_old_apagar .dpt-selected .csform textarea:-ms-input-placeholder{color:#c70808;opacity:.6}.cp.cpe1_old_apagar .selected{background-color:hsla(0,0%,100%,.5)}.cp.cpe1_old_apagar .selected a:hover{color:#16407c!important;font-weight:400!important}.lista-dispositivo,.result-busca-dispositivo{padding:0 0 1em;min-height:3em}.lista-dispositivo ul,.result-busca-dispositivo ul{list-style:none;margin:0;padding:1em 0 0;-webkit-transition:all 2s linear;transition:all 2s linear;clear:both}.lista-dispositivo ul li,.result-busca-dispositivo ul li{display:table;border-collapse:separate;border-bottom:1px solid #fff;width:100%}.lista-dispositivo ul li.ta_title,.result-busca-dispositivo ul li.ta_title{background-color:rgba(0,0,0,.15);border-radius:4px 4px 0 0;width:100%}.lista-dispositivo ul li:last-child .itemlabel,.result-busca-dispositivo ul li:last-child .itemlabel{border-radius:0 0 4px 0;margin:0}.lista-dispositivo ul li:last-child .iteminput,.result-busca-dispositivo ul li:last-child .iteminput{border-radius:0 0 0 4px}.lista-dispositivo ul li .iteminput,.result-busca-dispositivo ul li .iteminput{background-color:rgba(0,0,0,.1);border-right:1px solid #fff;display:table-cell;padding:.5em;vertical-align:middle;text-align:center}.lista-dispositivo ul li .iteminput input,.result-busca-dispositivo ul li .iteminput input{margin:0}.lista-dispositivo ul li .itemlabel,.result-busca-dispositivo ul li .itemlabel{background-color:rgba(0,0,0,.1);display:table-cell;padding:.5em;vertical-align:middle;width:100%}.lista-dispositivo ul li .itemlabel .artigo,.result-busca-dispositivo ul li .itemlabel .artigo{float:none}.lista-dispositivo .nomenclatura_heranca,.result-busca-dispositivo .nomenclatura_heranca{font-size:90%;color:#057dba;display:inline}.lista-dispositivo.controls-radio-checkbox{border:0}.label_vigencia{border-top:1px solid #fff;display:inline-block;color:#555}.label_vigencia span{color:grey}.cp-nav-parents .dropdown-menu{left:0;right:auto;padding:0}.cp-nav-parents .dropdown-menu:before{content:"";position:absolute;top:-11px;width:100%;height:11px}.cp-nav-parents:hover .dropdown-menu{display:block}.cp-nav-parents a.active small{color:#fff!important}.table-notificacoes tbody tr td{border-top:1px solid #fff;padding:5px;vertical-align:middle}.table-notificacoes tbody tr td ul{margin:0}.table-notificacoes tbody tr td ul li:hover{background-color:rgba(0,0,0,.1)}.btn-modal-open{float:right}.modal .modal-content .alert:only-child{margin:0}.class_color_container{background:#ddd!important}.clear{clear:both}.mce-tinymce.mce-container{border:1px solid #ccc!important;margin-right:2px}.mce-btn button:hover{background-color:rgba(0,0,0,.1)!important;text-shadow:0 0 5px #fff;-webkit-box-shadow:0 0 5px #777;box-shadow:0 0 5px #777}.mce-menu{background:#eee!important}.displaynone{display:none!important}@media only screen and (max-width:800px){.cp .fixed{z-index:98;position:relative}.cp.cpe1 .dpt-selected{margin:1em 0}.cp.cpe1 .dpt-selected .csform .actions_parents,.cp.cpe1 .dpt-selected .csform .label_status{font-size:80%;position:static!important;display:block!important;padding:0;height:auto!important;left:0;right:auto;text-align:left}.cp.cpe1 .dpt-selected .csform .actions_parents div,.cp.cpe1 .dpt-selected .csform .actions_parents li,.cp.cpe1 .dpt-selected .csform .label_status div,.cp.cpe1 .dpt-selected .csform .label_status li{display:inline-block!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul{-webkit-transform:translateY(30px);transform:translateY(30px);-webkit-transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;transition:transform .1s linear,opacity .1s linear,clip 0s .3s;transition:transform .1s linear,opacity .1s linear,clip 0s .3s,-webkit-transform .1s linear;clip:rect(0,0,0,0);opacity:0;position:absolute;margin-left:.5em;-webkit-box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);box-shadow:0 6px 18px rgba(0,0,0,.19),0 2px 6px rgba(0,0,0,.23);-webkit-transition-delay:.4s;transition-delay:.4s}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li a{border-right:0!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li:first-child:before{border-width:.375rem;border-style:inset inset solid;content:"";display:block;height:0;width:0;border-color:transparent transparent #3385ca;position:absolute;top:-.71rem;left:.9375rem}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul li:first-child:hover:before{border-color:transparent transparent #0a5ea4}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>ul:after{content:"";position:absolute;z-index:-1;left:0;top:-25px;height:25px;width:100%;-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.cp.cpe1 .dpt-selected .csform .actions_inserts>li:hover>ul{-webkit-transform:translateY(7px);transform:translateY(7px);-webkit-transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;transition:transform .4s linear,opacity .4s linear,clip 0s .2s;transition:transform .4s linear,opacity .4s linear,clip 0s .2s,-webkit-transform .4s linear;opacity:1;clip:rect(-100px,2000px,2000px,-100px)}.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a span{display:none}.cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-excluir,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar,.cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar{padding-left:0;min-width:1em}.cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-excluir:before,.cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before,.cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts>li>a.btn-salvar:before{width:100%;margin:0}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in,.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_next,.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior{position:static}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in>ul{left:1em!important;right:1em!important;margin-left:0}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_in>ul li:first-child:before{left:37%}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_next>ul{left:0!important;right:1em!important}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior>ul{left:1em!important;right:0!important;margin-left:0;margin-right:.5em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.add_prior>ul li:first-child:before{right:42%;left:auto}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.menu_excluir>ul{left:10%!important;right:0!important;margin-left:0;margin-right:.5em}.cp.cpe1 .dpt-selected .csform .actions_inserts>li.menu_excluir>ul li:first-child:before{right:0;left:auto}}@media print{#btn_font_mais,#btn_font_menos,.button,.cp .vigencias,.dne,.menu-icon,.tipo-vigencias,.toggle-topbar{display:none}.container{width:100%}}
\ No newline at end of file
diff --git a/sapl/static/css/global.d2e0a784.css b/sapl/static/css/global.d2e0a784.css
new file mode 100644
index 000000000..d6ae71228
--- /dev/null
+++ b/sapl/static/css/global.d2e0a784.css
@@ -0,0 +1 @@
+*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#02baf2;text-decoration:none;background-color:transparent}a:hover{color:#0180a6;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-2{-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-8{-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333%;flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66667%;flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333%;flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66667%;flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333%;flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66667%;flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333%;flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66667%;flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8ecfb}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7bdbf8}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#a0e6fa}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#fdcbcb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#fb9e9e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#fcb2b2}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#76defe;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .5625rem;background-size:1.125rem 1.125rem;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top .5625rem right .5625rem}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:3.4375rem;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") no-repeat center right 1.75rem/1.125rem 1.125rem}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#f84545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(248,69,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#f84545;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .5625rem;background-size:1.125rem 1.125rem;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23f84545' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top .5625rem right .5625rem}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#f84545;padding-right:3.4375rem;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23f84545' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E") no-repeat center right 1.75rem/1.125rem 1.125rem}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#f84545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#f84545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#f84545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#fa7676;background-color:#fa7676}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#f84545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#f84545;-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.25);box-shadow:0 0 0 .2rem rgba(248,69,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-primary:hover{color:#fff;background-color:#029dcc;border-color:#0293bf}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,196,244,.5);box-shadow:0 0 0 .2rem rgba(40,196,244,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0293bf;border-color:#0189b3}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,196,244,.5);box-shadow:0 0 0 .2rem rgba(40,196,244,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(130,138,145,.5);box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(130,138,145,.5);box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(72,180,97,.5);box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(72,180,97,.5);box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(58,176,195,.5);box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(58,176,195,.5);box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(222,170,12,.5);box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(222,170,12,.5);box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#f84545;border-color:#f84545}.btn-danger:hover{color:#fff;background-color:#f72020;border-color:#f61414}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(249,97,97,.5);box-shadow:0 0 0 .2rem rgba(249,97,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#f84545;border-color:#f84545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#f61414;border-color:#f40909}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(249,97,97,.5);box-shadow:0 0 0 .2rem rgba(249,97,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(216,217,219,.5);box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(216,217,219,.5);box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(82,88,93,.5);box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(82,88,93,.5);box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-link{font-weight:400;color:#02baf2}.btn-link:hover{color:#0180a6;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;-webkit-box-shadow:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-right{right:0;left:auto}}.dropdown-menu-left{right:auto;left:0}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.dropdown-item:last-child{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#02baf2}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.875rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.8125rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#02baf2;background-color:#02baf2}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#76defe}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#a8eafe;border-color:#a8eafe}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background-repeat:no-repeat;background-position:50%;background-size:50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#02baf2;background-color:#02baf2}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(2,186,242,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#76defe;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(118,222,254,.5);box-shadow:0 0 0 .2rem rgba(118,222,254,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.25rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#76defe;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(2.25rem + 2px);font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.25rem;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(2,186,242,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#02baf2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#a8eafe}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#02baf2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#a8eafe}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#02baf2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#a8eafe}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#02baf2}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;color:inherit;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck,.card-deck .card{-webkit-box-direction:normal}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card{overflow:hidden}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion .card .card-header{margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#02baf2;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0180a6;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.25);box-shadow:0 0 0 .2rem rgba(2,186,242,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#02baf2;border-color:#02baf2}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#02baf2}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0293bf}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}.badge-danger{color:#fff;background-color:#f84545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#f61414}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#01617e;background-color:#ccf1fc;border-color:#b8ecfb}.alert-primary hr{border-top-color:#a0e6fa}.alert-primary .alert-link{color:#013a4b}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#812424;background-color:#fedada;border-color:#fdcbcb}.alert-danger hr{border-top-color:#fcb2b2}.alert-danger .alert-link{color:#591919}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#02baf2;-webkit-transition:width .6s ease;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#02baf2;border-color:#02baf2}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#01617e;background-color:#b8ecfb}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#01617e;background-color:#a0e6fa}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#01617e;border-color:#01617e}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#812424;background-color:#fdcbcb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#812424;background-color:#fcb2b2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#812424;border-color:#812424}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;-webkit-box-shadow:0 .25rem .75rem rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-50px);transform:translateY(-50px)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);content:""}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc(-.5rem + -1px)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:after,.bs-popover-top .arrow:before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-top .arrow:after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc(-.5rem + -1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:after,.bs-popover-right .arrow:before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-right .arrow:after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc(-.5rem + -1px)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:after,.bs-popover-bottom .arrow:before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-bottom .arrow:after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc(-.5rem + -1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:after,.bs-popover-left .arrow:before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-left .arrow:after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:opacity 0s .6s;transition:opacity 0s .6s}@media screen and (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;-webkit-transition:opacity .15s ease;transition:opacity .15s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{-webkit-transition:none;transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity .6s ease;transition:opacity .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#02baf2!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0293bf!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#f84545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#f61414!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#02baf2!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#f84545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-3by4:before{padding-top:133.33333%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#02baf2!important}a.text-primary:focus,a.text-primary:hover{color:#0180a6!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#f84545!important}a.text-danger:focus,a.text-danger:hover{color:#e80909!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.btn-outline-primary{color:#02baf2;border-color:#02baf2;border-color:#d6e1e5}.btn-outline-primary:hover{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#02baf2;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#02baf2;border-color:#02baf2}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,186,242,.5);box-shadow:0 0 0 .2rem rgba(2,186,242,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d;border-color:#d6e1e5}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,.5);box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(108,117,125,.5);box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745;border-color:#d6e1e5}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8;border-color:#d6e1e5}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107;border-color:#d6e1e5}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#f84545;border-color:#f84545;border-color:#d6e1e5}.btn-outline-danger:hover{color:#fff;background-color:#f84545;border-color:#f84545}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#f84545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#f84545;border-color:#f84545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,69,69,.5);box-shadow:0 0 0 .2rem rgba(248,69,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa;border-color:#d6e1e5}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40;border-color:#d6e1e5}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.navbar{padding:0}.navbar-nav{-ms-flex-preferred-size:100%;flex-basis:100%}.navbar-nav a{white-space:nowrap;color:#93a4aa}.navbar-nav .nav-link{padding-top:0;padding-bottom:0;line-height:4.5rem}.navbar-nav .dropdown-menu{background-color:#20282a;margin:0;border:0;border-radius:0;padding:0}.navbar-nav .dropdown-item{padding:0}.navbar-nav .dropdown-item:first-child,.navbar-nav .dropdown-item:last-child{border-radius:0}.navbar-nav .dropdown-item a{padding:0 15px;line-height:2.3rem;display:block;text-decoration:none;min-width:15rem}.navbar-nav .dropdown-item:hover{background-color:#364347}.navbar-nav .dropdown-item:hover a{color:#fff}.navbar-nav .pesquisa .dropdown-menu{min-width:15rem}.navbar-nav .search-form{padding:10px;min-width:20%}.navbar-nav a:not([href]):not([tabindex]){color:#777}.navbar-nav.justify-content-end .dropdown-menu{left:auto;right:0}.nav-pills .dropdown-menu{padding:0}.nav-pills .dropdown-item a{display:block}.nav-pills .dropdown-item.active a{color:#fff}@media (max-width:1199px){nav .container{max-width:none;-ms-flex-preferred-size:100%;flex-basis:100%}nav .caret{margin-left:-3px}}@media (max-width:1091px){.navbar-expand-lg .navbar-nav .nav-link{padding-left:4px;padding-right:4px;font-size:.95rem}}@media (max-width:991px){.navbar{padding:5px}.navbar-nav .nav-link{line-height:2.5rem}.navbar-nav.justify-content-end{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.navbar-nav.justify-content-end>li{display:inline-block}}html{position:relative;min-height:100%}a,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,img,p{margin:0;padding:0}.h1,h1{font-size:30px}.h2,h2{font-size:24px}.h3,h3{font-size:20px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:.25em 0}p.control-label{font-weight:700}label{margin-bottom:0;line-height:1}input[type=checkbox],input[type=radio]{margin:0 5px 0 0;position:relative}fieldset fieldset{font-size:95%}fieldset fieldset legend{font-size:18px}ul{margin:0}.hidden{display:none}.form-control-static{padding:.2em 0;padding-left:12px;background-color:#f7f7f7}.form-control-static:empty{display:none}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;clear:both}.page-header{margin:20px 0 10px}.caret.top{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.lista-parlamentares .table td{vertical-align:middle}small{color:#777}.container-tabaux .sidebar-tabaux{background:#fafafa;margin-top:-70px;padding:10px;border:1px solid #eee}.container-tabaux .sidebar-tabaux .navbar-right{margin:0}.container-tabaux .sidebar-tabaux .nav-pills>li+li{margin-left:0}.container-tabaux .sidebar-tabaux li{width:100%}.container-tabaux .sidebar-tabaux span{display:none}.container-tabaux .sidebar-tabaux .dropdown-menu{padding:0;right:10px;margin-top:-5px;overflow:hidden}.container-tabaux .sidebar-tabaux .dropdown-menu a{border:0}.container-tabaux ul{list-style:none;padding:0}.container-tabaux .list{font-family:SourceSansProSemiBold,Helvetica,Arial,sans-serif;font-size:0}.container-tabaux .list,.container-tabaux .list ul{display:table;width:100%;margin:0}.container-tabaux .list li{width:50%;display:inline-block;position:relative}.container-tabaux .list>li{width:100%;border-bottom:1px solid #eee;padding-bottom:20px;margin-bottom:20px}.container-tabaux .list .head_title{color:#364347;font-size:1.7rem;text-transform:none}.container-tabaux .list a span{display:none}@media print{a[href]:after{content:none!important}}.container-home{position:relative;padding:2em 1.5em 1.5em 1.5em;max-width:1000px;margin:0 auto}.container-home a:hover{color:#444;-webkit-transition:.3s ease-in;-moz-transition:.3s ease-in;-o-transition:.3s ease-in}.container-home #homeIndex{text-align:center}.container-home .homeBanner span{color:#fff;font-size:32px;font-weight:600;display:inline-block;vertical-align:middle;padding:2px 45px 4px;border:2px solid}.container-home .homeBanner:after{display:inline-block;vertical-align:middle;height:100%}.container-home .homeBlock{display:inline-block;position:relative;background-color:#f3f3f3;width:190px;height:260px;margin:3px;text-align:center;font-size:0;overflow:hidden}.container-home .homeBlock>a{display:block;position:absolute;width:100%;height:100%;top:0;left:0}.container-home .homeBlock:after{content:"";display:inline-block;vertical-align:middle;height:100%;overflow:visible;clear:none;visibility:initial}.container-home .homeContent{position:relative;padding:10px;text-align:justify;font-size:14px;color:#fff;opacity:0;-webkit-transition:opacity .5s ease;transition:opacity .5s ease;display:inline-block;vertical-align:middle}.container-home .homeContent p{display:block;line-height:13px;font-size:80%;color:#fff}.container-home .homeIcon{position:relative;display:inline-block;width:105px;height:105px;border-radius:50%;background:#364347;z-index:1}.container-home .homeIcon:before{content:"";position:absolute;width:100%;height:100%;border-radius:50%;background:#364347;top:0;left:0;-webkit-transform:scale(.95);transform:scale(.95);-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}.container-home .homeIcon img{position:absolute;margin:auto;top:0;bottom:0;right:0;left:0;-webkit-transition:opacity .4s ease .4s;transition:opacity .4s ease .4s}.container-home .homeFront{position:absolute;top:46%;width:100%;font-size:0;-webkit-transform:translateY(-60%);transform:translateY(-60%)}.container-home .homeFront h2{position:absolute;margin-top:18px;font-size:22px;font-weight:700;color:#595959!important;width:100%;padding:0 6%;z-index:0}.container-home .homeTitle{display:block;height:32px;text-align:center;width:100%;opacity:0;-webkit-transition:opacity .4s ease;transition:opacity .4s ease}.container-home .homeTitle:before{content:"";display:inline-block;vertical-align:middle;height:100%}.container-home .homeTitle h2{display:inline-block;vertical-align:middle;max-width:110px;font-size:14px;color:#fff!important;line-height:1em}.container-home .homeTitle img{display:inline-block;vertical-align:middle;height:30px;margin-right:5px}.container-home .homeBlock:hover .homeIcon:before{-webkit-transform:scale(3.6) translateY(7px);transform:scale(3.6) translateY(7px)}.container-home .homeBlock:hover .homeContent{opacity:1;-webkit-transition-delay:.2s;transition-delay:.2s}.container-home .homeBlock:hover .homeIcon img{opacity:0;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-delay:0s;transition-delay:0s}.container-home .homeBlock:hover .homeTitle{opacity:1}.masthead{padding:10px}.masthead .navbar-brand{padding:0;color:inherit;font-size:24px}.masthead .navbar-brand img.img-responsive{height:95px;display:inline-block}.masthead .navbar-brand small{color:#93a4aa;font-size:75%;line-height:25px}.masthead .navbar-brand .vcenter{display:inline-block;vertical-align:middle;float:none;padding:10px;line-height:1.5rem}.masthead .nav-link{padding:.3rem .5rem;margin:0 1px}.masthead .nav-link:hover{background-color:#b2c6cd;color:#fff}@media (max-width:1091px){.masthead .navbar-brand{font-size:22px}.masthead .navbar-brand img.img-responsive{height:60px}}body{margin-bottom:160px}.footer{background:#364347;color:#fff;text-align:center;position:absolute;width:100%;bottom:0}.footer p{color:#fff;margin-top:10px}.footer .container{padding-top:25px}@media (max-width:991px){.footer{position:relative}}.jcrop-holder{-ms-touch-action:none;direction:ltr;text-align:left}.jcrop-hline,.jcrop-vline{background:#fff url(data:image/gif;base64,R0lGODlhCAAIAJEAAKqqqv///wAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAACAAIAAACDZQFCadrzVRMB9FZ5SwAIfkECQoAAAAsAAAAAAgACAAAAg+ELqCYaudeW9ChyOyltQAAIfkECQoAAAAsAAAAAAgACAAAAg8EhGKXm+rQYtC0WGl9oAAAIfkECQoAAAAsAAAAAAgACAAAAg+EhWKQernaYmjCWLF7qAAAIfkECQoAAAAsAAAAAAgACAAAAg2EISmna81UTAfRWeUsACH5BAkKAAAALAAAAAAIAAgAAAIPFA6imGrnXlvQocjspbUAACH5BAkKAAAALAAAAAAIAAgAAAIPlIBgl5vq0GLQtFhpfaIAACH5BAUKAAAALAAAAAAIAAgAAAIPlIFgknq52mJowlixe6gAADs=);font-size:0;position:absolute}.jcrop-vline{height:100%;width:1px!important}.jcrop-vline.right{right:0}.jcrop-hline{height:1px!important;width:100%}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;height:100%;width:100%}.jcrop-handle{background-color:#333;border:1px solid #eee;font-size:1px;height:7px;width:7px}.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%}.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%}.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0}.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{margin-right:-4px;right:0}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#fff;border-color:#000;border-radius:3px}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}div.jcrop-image.size-warning .jcrop-hline,div.jcrop-image.size-warning .jcrop-vline{border:1px solid red;background:none}body.change-form .allow-fullsize+.help,body.change-form .jcrop-holder+.help{clear:left}body.change-form .jcrop-holder{float:left}div.allow-fullsize{padding:5px 0 0 10px}
\ No newline at end of file
diff --git a/sapl/static/css/painel.61177241.css b/sapl/static/css/painel.61177241.css
new file mode 100644
index 000000000..1bd8169d7
--- /dev/null
+++ b/sapl/static/css/painel.61177241.css
@@ -0,0 +1 @@
+.painel-principal{background:#1c1b1b;font-family:Verdana}.painel-principal .text-title{color:#4fa64d}.painel-principal .text-subtitle{color:#459170}.painel-principal .text-value{color:#fff}.painel-principal .logo-painel{max-width:100%}.painel-principal .painels{-ms-flex-wrap:wrap;flex-wrap:wrap}
\ No newline at end of file
diff --git a/sapl/static/fonts/fa-brands-400.3186ebd2.eot b/sapl/static/fonts/fa-brands-400.3186ebd2.eot
new file mode 100644
index 0000000000000000000000000000000000000000..e30fd0069316e59e6bef9f89063c0d2e728d11a4
GIT binary patch
literal 125320
zcmeFad7K
9L8hDOXBtRnnAZP;CwvI?U4WX;4B9XhJhL13bu)cT8|wdm*E&={a2V)6
z$1I&UZ^h#4S3Jlv
zrx`{@d1338jTde^d>A#6H(Xqox14>+>7V`AZC}Aq|A`?_7tT0s<7Vf_L!-F%DvtUY
z$ly2er=mVuzHr7l+b@p%mb)D1k28#T_1Wj0y77B0-Kg7mfMK}Fb2eVQja9i5aD4#f
zGv{tR=d>%gUyx8+T}U9@jx;U(Uqx4i4Dw}#(lv?fjb
z{L-<7xSzrAqQh?eePyv=UZ1D`Zd{e
zcn{M}Te6eZP74l^FX1P{kY-Pieh|5PK5!hKIe!bk^q9HM?qu{Jy%%}3%uXCMeI>)O
zV~k059zIO3vuF;ku}AI;>NtSB*^CtAU5qr!;mF`n&=#3IgY#`T=r5kh&St{&8Ns!k
zLD|sEJPEeMngJ-Z~!87S|7^H)|qkW=%Lmqo2es>1<)92EA
z)uUzhFm~|VEAgy7jD$K2Tqj7YRu3d+BrcVm_Z~
z(!i0n9dn(hY1IE7O+AA#dBP@_wC@?9$E+bd6@Ch_WwTe{AQV%`gb1w8_l1|V*|Q|_+T?L
z&!TnAjB!8{wCorTj8o7aI`)`{nft@RTCPd>aSS>=@1|E$zfF9TR$d7YELfCmrp_k-pP%dzuHX(Kd--U$jrC$8ouF}A2TeDR=3JA{A2~<)XBZC81C1bkelwqJMf&SVpNeA)=`qaB)A-%<-f^T(
z@`sr+mmGd8sN=|3{@?fw?z;^Y`djTnk#GbApZs?V)9!$MJWp
zyN56r^c?LbpTRNHfASraXK?I99=-k&j{M9y?hW#3-~NI*Jqf>0y_Xl`j
zev!t9n>i8;`U&>8896kSV0eB3N|`v381t=NZ{76P$KU$wTmSLaul70n>idTGt=V_x
zzH|4Tzi<1#EB0Nr@9KRw@4J29r}uq!-`)Ej-1qH$Pw#ti-_Q2_Vc(nk-rmpcSN5Cx
zz5SK_js2th7wtb~|5^Lb-M?-B75jJXzhVFF`|sR;-~O-de{}!j`+ucD3XeEz@}4}9amQwR1Oc<#XS2VOkz(t%eGynf&}2mW;6
zzYiQZ@RtMA2Ze*i!R*2O!M=lw4^ACib?~Hv|8elQ2mkW6`}W7*zWeQa-+tijZ@m4j
zx1WCd2XDXl_K)A*_x7Q;|N4&gPWYYK?~K3mxpy9Z=Y@A(eCO3e{Gq->>keIf=);Gu
zIduJ@n-AS~=*~l5KlIH*PagWgp_dQ6a_Cowehm$YdF!fRJnnq!Co|(Q3*)h6-&y;%
z?YnT_CHr<_JgyJM<1-kK-TNNh_vF48_Pw<4_xt|WzPI+X`{n({etUl(#$#yz@feQ{
z`_I96T(*Db{;T(YV*efczqJ3$`yau0Jh%Tp_Wv>%k24NjeBjChAHjIsc;L1JcOLlM
zfqM?zci>Ts$M+BX;J^zQkDp*Xes$n?2j0YZyp8c-4@w6^7?0vHQyWxi|vr}>Kc9rLT^L*`e^
z2hID;FPZn6pEvI`?=U}Ue!~2?dA)g!d8v7kd4_qKx!GK8t}vIGOU=4jF?-E|>6l?N
zWZI@+@+N2e&G@VF-^Twk{$%{Yc+Ggp_>u8LW6GFs%rz#BabwIFHAakKW5^gZ28@PL
zGpa_#=rg*FE~CR}H`^NP+tb$MMUc73SV?p@RS
z^S;e}k5#S(gmv*ys&WI!h^?Maopp_O)qL)bo*jv@uf@FF1c>WUr#t?=?zP#
zmz_JcWa@#bgUcsZtXc8JmGza6oG707=~eQob5}jI>d&j&SHF4E_fC3qP0QNT*S@iC
z#k!B5(sIi9DVtCE-unLa53YZ4V|3%9jpuH>W8({(`Zq^6uRYB^ZSu57PxnsmKYhdL
zFP?eJ*4NGopY`0??AfQB{mMC&^WNNc@wVsBZ$1CD3)(L@<$^z7c*}+Rx3_G6a{D_w
zPT#R>$Jche@ges^4_!2T(FGU%`QkS(IsKC9OB0u#ed(*0ja_#4W&1DRdif()v|jPR
z6>nbop)2p(nc8{v&IfnCbk)>V5A4!+ZT-mYANkGIFJAr5HI-|ouKDY=cU@PxZuj+f
zT>rZpZoM&e904NH$QsIrdyu;*wR~HxoyqIpZxf5KJn@&PygiApM2ns
z`#wGT=_@{c*PXlWyz4V#pV{`A`|cY4+|NJv=H02gm)?E%-H(5M^X|;&)?gB?{)V+@kR5Co4)wum%?BA+I@@e`{I3nz5lugKJ(?om#=-$e(-^>jDO|a
zhrF+bzxvoC@}pb7rGIPfW3Asl`|FZ*(ld8I^Un7#eQxMq_P%i93t#)U-hX@U$6J4V(@&;;a_&!V{mFAL_rCmtpH_bQ
z&`|7_3ChyQc!FK+n7^S}7>t55v0^2_I6tG^zm%GKe$WDnWR
zSj;SNm5LV$xne$>E7d~%^{P;Bh!QD~03^f;#DL}b@<66scHc}33ES6gfhD_-6e1`(z4Mh<4)|%`Pfx$IBbrNEu9R@mVO4>
zrX16@6Pc5lQvr!>0~~ibbIm_#C7mKVHgxJdBx@$gb(3l!J_M<+&eV%ie{P`xka_eN2f1Pt*=ec^)bSBcT^_6Mlawp
zT^};~{xW$B=p<|!tdP?H1MdI@Ud=EKH!s%ut97vsIugr`3cgEDB?U?nk*W=YAj_jX
zNRg6{XpvG*>SjSXl*w?uD4C>G?j}7X=ch=Tq}a-A;$n0~WMT}tX0^CEsJ`UC@4R%M
zAPQoZ6X^W4VlD+Te{%c8y5nUfs3%E8kr$nEb0>@G$D!Z=LGd}32UYUC!qJaVg<5
zD~n{dn?ZG^*P3vmR=UU;vZ5%wW^u)IESqTcKzX{y^Lj`#2(kFEBs9
z`58A&-#_zw6{`T$$Y$|u4o8R+c$QUyd4E2bi{mge;NrP*eKrA;uGEiN`i)W2z<38#
zNNJUTO*TeZ@GYe1(DM8Vgs?S+pwQNpwjNE<9509*Ptq
zj>ogQC|au1g7tuZF)XS1t8V)dDgWp;tu;1Fw@;cgGPQa%IjC|X>vKHk=Q`#Lc4qsN
z@vvHmtBS4UT6jg0c=ULS8|#i=v1H3_$I$T<)>XjgXZrI#Ue@TZ|MLz}o`n9eX<`as
zX&(>=?|7mmX2Qjx?5a7(2fY%5PF1>wB6%;2PH9psZpi_I5exyn#`TllFE$E3de=Iy
zePr3H(ZqnpNd$Aq`Pq)KfzC{Sq9v^5<4TI>6P7FL3YbWw;bwF%WRPQI3=o5(GPnbd
zjDL{A4xPX<lJHM(ok_%tsTp8w|CUoQwF(2ODGX4v_$QAqTDuX
z77>#4^8s%8WW7_Cb5()g(Gnvi|S+Ne>*)g;Jx-~@Y&g8m$g>Eu>&C>gm3UjG5ltkldbBH=kll9K%=g9Gd)iB}zMLhO$69lG
zXQVgMVdPq!M0+XPo9gXp*_?Nryn92b;6^p4z|Sf;aa-ZQdo(*{w>IYVMq_@`c2&i-
zl77tZz9`=-a-7(kkCh?@FS#8j7D|Oe30*`t1&G2AGY)1k->8>52$y&AILg@yI4Jqy
z#(vJW`-V5pT0XpSxQlEbEffvmfbC5Gk$Cjj(A70Eqc84+zQ{8Xh6!aksZ1JqziNR|
z=hLJ*o8-%6XZ~}aBOzg*e!p0&^F89JWTW{APj*jl@9zgo`}nA7mKMe1pX{4i<9kt`
zg+`*XMpg1>lWc?jBYVeQf7YFnw_oc_f72$5wdrq!P|2-Jm#%N??A$n2n*x<^hxd@H
zK`-5KMPl}f9^{4uI?PdG%;g)Est1l&>n2hzU-KHZYNQSVjih*}Es=^>uTT-x&5KgS
z8-=_=Do^T*C2{_EU(D!JR;!#8GIYZENr78o&^#xTbPXc@h&XD*baYKr!lAeY=I84%
z+cOPGi#S<3Lw*>Zs&(>{6BCm|gvj#$v?bC{$O%ix;uBa&56A7H6&t7=kyTRx--pB?
zf1^BxR{)0?js{6WrwwBcQOj09qXoJKNs3Dn5GJ92;PF&QmO+{5CH_F0DIzq=Y>9)m
zqzNryXKQEYSK7-eMBsa;;g;!t`Pj$Eq+ZCURAo&^s0B=$Xj;*k@S`Vngqx>A%NtY6
z820e=;n&G7%#qCidu{Ye(71D@*-#$qAa}ng`5w*bA){=A=6Ltclhrw*z|QUDL~)J=
z`FZQfoFI;C(pr*U&?c$lqVVQrx*}Y|9(Hdzs%OJT%bdzr99v$Kg__X`%m~G
zl+`jQI47nFBz3h&$r;NK4Z-7~A|1;K*UCaKn-S!0m=Wnd$ZVqGt49(}XU7G(2f}*%
z1N?BWvXW~kB41y{i?8sa@=fkyoB`&YX&Y-}EF|zJtR*7(Alh;x)bOPmetn!1`RWgT
z$fA`iR^V^N^zAEGu6Pa!dIm25Mt3i{0`+l0jTY*RgNmi{Y=U}G_iTbM2ej;iYO^><
zUirR!sO8SsrS@Z?Yc9%M)c^cjttG3XN^=dn=1#|q>5@MHhdV>c8-35
z)@#*iofEJNxU8N@x$#|z;cSj-X%o}G#=Tyv(7ct_c+7M7q?3wxQt%*T8}Fk%pGp5C
z?S*H?>d2TKOKJ0J#bT}aT=4w?lKK@c9Qiv!M@?Ogh2(*E!twKknc;WJQngX_|2$_G
z8NBUBx83%muG?=<21^Bdj0kO{(u+1P7Y#DJ*EXUWGmGaCvjpqo9kxF
zTt8Gi%9?HRGOQ-3h-8vAr=Q>@fhUtHDa1aPAiH5mh}`sgldyusle=K(DAPat#3#U)
zCGgcD@YOaDPoQ_eh{@+hNWf_5Do;ZCf)RC44WI$#J54-N*K67K(Uj4nYVEBYvF52O
zRCPr@tMCHr@fpKOba(onBVNBK_KTeg;rk>pB|D{f`v+#}c2;VI
z3d+hxXgP{55Y>SYCv}Kx%tWGzmAp!6OZr-Ce(nw1%5#J0*CbDk3a4n#D{EZ`Nl(cJi>nCr{wP3
zD;QIe$sB$aQ~d?#as{9~lgv_PJ@`0Oxg5rk>T({fgaRq}LRNm}2bMv;f0P5SZ2%JR
z=`33?C`tj;L3=ubC{P>2hh>K;5TPB?I@j3Ia9Gzu>Yu~9n~0a<30DvQ`7feoyP5-P
zbnA5&MhtP1xd%l>6nWtyk>@2&;P}&IL!q~Z4sO?NTi>qP_Lm=hR1b}WO*1?)60-0e
zdO?pxTuaPjITxbQ0?)Br-m1B>B*~(PZyw^WA{o+=DliTzqa1#Ue2Y8_&K(2)y8^iJ
z1I%+oC2eE^>nC3ZqXX|l52PFfYTd7hQm(I8bi4@Vag@j)ZADx)**rbLG6OX>t&f05
zV#0BXf3T)TL5L|9<}8eU4;mH@`i}!N;+N{x6le!|FvW5bu(f(Gq-ld%$G9B?jzXYh
zkJeSE0v=>0<+ysON&f-YMGL6ui*mkKuhF8lpg1zCb!t#u4>&))vk%uKmtIE;Mp>=|((Xg^0cYTx_!W9H)joa+00yj+BdiBw
z6e0TOAsU$N~~a*JkfYwwK`l-f^21De#QV+
zLv&To8X<$?Jg^C$6<8U6qA21fg|k#S*=vfr2rE>?Eb}7KJ(1;f*wmuh!iIUl;w|3P
zbqiD5%DSqq%B;ePhDNCbHFB|n9<8JYon
zbeIQiy1-31GMCztEMO~YF5`=^(|-ulR%*J`!m=@rCnCLS^I{10Bzmny1X~8{h8D-M
z78gx+R})1c6U+IwlY|*&CTz1c-(IBk3L%>eY8n7Di-Z;QIpo_yn+6cX1AE8)rZX(a
zvczgUv4~*kA`95doPI#7@da>8g*AYifJV%)=*U=^q9s>CBH-MF9uX6^Zn{>;$wwu<
zFUqE~-4zuGnLtbnhzHAQu@*PZr_-6LM+#BL4(n#vQWc$7Y(8vrB9Szfj|sMx;7Yy`
zVOd`b=_HT!3j0K5Wjd=8ud0;K$%mgOe-5yv5F}gHQfShz1CQ<|NQ|;&
zn$ajpF47IqeA&eUK*A(`9ogQUf%qhMiOx`7Q5GIg=9f2DI|{i*=vS%Uta!?4g)cTj
z^#w&qJ^S3L?(J10Gjh`J7Mru@CduQ0Bu>L{GhI)$kDJQJ^uY`*Sb_;t!;%`6fwhl5
z0gVL*0c)k`48Uc`HVKP8xHABmA$ZA`{qgP+z|55w^G8$v(lv3ipoPqk(C)?@P0}S{
za@8D8k;6(%O$#C2h&thf;i#rH|Mpa=d)((QUK#O^rY`7e8;oF4^O7uic1Tb(DVlC=
z)54~ziV{E$fzuS-f>SwU#7lw9evE8K?1jh74m2iOGylflj;!
za}tJKa}?Q!vP0b;{efh3F!E?4RW4Gr+4V*HWoGjB|F=YMeM^G;7f93L4KRf-^X~;Eg8dvQP-xAz%3r(Y4R0nG6h7z>}
zj%euua0TF`ls|*qO#+20pvl|FS)4$0&Clw3N!N3}2^Mtz48blF?1(38ifItjR5Uf?
zOLtOwBv0?!
z4w)%JItKS~!Dv%~mx5SC!4$~11YQydM)D~!7S?n@Emd{SF`invYte$?P7Y$p8eZr?
zGL7@x*kr%5er#;HjIX(sl_gs&ilO5gx+zZRb22I4Fosi^_^GNVih}Fw5G10YP-EQ;
zCwQ=GRvs*u(3Dy{-XhCY;L?ifsIu#ZI9UN^4Q-p7;jfRvljJZdXg~nwLHJmjPOgk^C@vzL
zLL*T5BJL|w<3sgRhT3Kibj{YZ*G<8S`$PsK
z-hlRG5m=V}qkP3TxgH3HQO+Yftx8{)X{I+0>U!_8q*Ltaw9<`YIwZlfBRWot?}v4^
z(4UX+&?e2KB{=yKSb)GAR-v#JuWbd?QJjYRZ9
zC%6tT+iu!5#6;TAa}K8!3iTGFy`xn(NDNO3S+*<{AsJb=t;p-XhB4)t5bUOhVK?bO
zOI$jtjVw5J2a#%2GiI}qVl5jfSG*+2QVc#!?kdHdRgc6=krT-NYYahr9{H%iN?!`L^4QGB%EvBcSpkcKe+)_PXF+jD$8Kg)XqAhuLw*JaQr#ULS`Am#6jYDiveQH7QBo+u|zX)GUMi4}>2Z<<3$zK}{CY8mRCV-E)s&vaYM$R9_T;J^=PYl`T|6}T^^X)&
zt#hk+J0njG)Rw6o%0QtsB#{-_>76$x-LTXlrya
zYtV%FF7GQ!l-DxROgv*-&^a?(lvzEl6?UxRU9a-|tIlA1qpRxk{NR_Z4JQfoKyn9=LSF$x>YV&
z;BV+4L=sdzbd0Kf;Eh<&R7Szng4lwDqBL)Zly0WJGZW-OgGBC8<7A}?6&v`bg&ADO#${8TMRs`{yp_SD(3s>)s6>CTSyS9d15YyNAgk_!ex6
zv=?U{=mQ)AVUAG8!c60+^dbO>0>Y%aF>Sm=4vnuH&-J78H(I_m-qSsPqOA$4#7~?&
z(f`=I?(sR@^K5%Q9k&HTX*%G$yXTB|&zq}R5HiBOU9-o!3UK{U9`ZWy>D?HiDwgJv
zFeE?`5M*p%L%>fJD4|Wr0!RvcjaV+gAtM+u@-$0lSrjz|D6q&;2P+T*n7gnSsN@n+!>S%dvlN$&91h!)h3kU-;lm6i9
z5vUc}4K+*3M;f&hY5FOl7~l+3_`|TFNs@-RUqmEnqV)W+D`fgFppBdx4s}({uXdzF
zUNpQ^ziy{VHtqA1{Fz?x^MzxU!S{PIUNNHlNUaJ(J9z;{GA=-0rOIOu(iNEIo0HaH?6I4Chx0|jIyMQR*$
z8Q3fE1BK9Qyrr;QlgZ46@TEW;eGm@7m(BHsu>p5&03|~%
z8qhEirBw%f9*AW)ad4B@=bBvpAgDy=g_}7^5hYS>NLoG0E%fEE8kSw^tCOYqdD+lu
z{4y{omgt>ZI2mk`Bf1p+37Ms~gj_SPt3w}5pMwkk3lCbTSlS$`sh12JnX?Ixi
z!a7lH%O)>CCHPmx)6P=U_G~Dj-7WHT1IwH}$DVa{SwOvtr$zs9loLinc~r%NE-sa(gt^k}IgD>PHFqFZ$oa`R_sh`(VSK1|HJ{=YCTQR6b_LLR@Un
z?X(k~wz=zMxph--S#ND{Hm>AbT(h&&RJF8vl14Vi^2vza-f80I&7GB;?bKWN?D~}^
z9zkoug9p00Xg%thv$?Dv%Nw2{o8HU~Co8RlRt;4}&&MKJzR`)onx?HrXbK|Xv4?ex
z>;R@8hQ^VE^niqI&=Kh%p=u@Kf(ut_{dpf>@NX2srF~b*H|1%A2C!1a3}Yx&OOPgS
z%vn%-=>GFxIH9Me4h^g%PuzOz0QpWfrTGpwnpitLf8o&3#1j_^)mY}`@PcYTIdye)
z$?}fYKlW5N?aRL`$eEmMX(t{xJZtgNL<8nufKAN!ZbYCHl#7?q$_3OKqLHhWa`VTp
z_%H-M$j2qf6sf-qW{$>FiT+`6Ek~
zbmUt`*Q`sHKUJ9Bsv_>7V&}N9lH2^*SbxLs>PngRXO3azmpfOrsYbMSPog8!(Vns6
zj@Bcqc`2aHCN7nQ92%mMsMw4jD}&NcpI8}y;7vD2+;rMAMl%tuB)G!$+m+SR1IguER4Oidxdr?m%MFWbM>$ZkuIsBnQ
zf1%JHp;jB5cSqJ4jXS9WEn3JhGwn=4`A0K-&w03=?+lanVBKq
zgz}sUhaKB4IUzY|{+Y&%(E&b*3n%P&nVe9pRTowVyzmYvDQ<5r*PEZ^#A3x3-CYt-
zh&q^TsRS4^1jXc(BXfCv(TbX_$pO+|EL5unvWzu)?{O2a<>>uxOQEF&jy9}_X5WtB
zhcRI0@NFH%5S!RCjf?ZBCkITjnFBrHNFFBYpJvX0jq5~3-Egx3_knuZaxo)o+TzWX
zUR#%0b@r9LasfPZ>civxAw%WV;RkBsj6(XVB5LAbnlnX(ZK?3%nruj22AmoiYljm2
zB15(0URwyOCL6ZXn4YG6wug*CcW`kc`Ou;)(u>IIMj4BEHd`fQo1~NPF*=oX>!cI!
zGCPz_|{Q{e4hCVG!j^r
z65M{Zas!}LqY^oKc5GU#&|ni3noWXKvwZ!%(#>R0z?-Q8Y?nF`s}+P$`w~V;uo$l>S=-w%<&g$^mbYkxgy)$o&8Tm
zj%($`xoY&$pP!LGGS8b9sL59KKCBbFLuFJrkR6c1;Sx$%MA>28aFx4apRK$H*b>XC+A(j3f~x$)zlX+r
zN5z{aL~-J#fu2mZn<#&gIAvj78kVo0Bg=EHhpKhkgd|Pe20-~{nz(s}c3wlw(p^BG
zVAY6ulPx2P4_;SD&6yC&6tqhkV+@`ZKrcWRGS?j9DFB>0(Etr?poV
zRj4qsoG?R+p6wU=*G3I7I_vl=jz8zdTIZ;Q0)vgAXfg|`-r>fB~IXY(T%^-|G
zp@2)+t5x7|rot$=9|cl`>LyLl9eLC*4G{q~tx@l0aUJkvkV6jV(hBb;3U2;?9v3Ri
zQZ+v*60uzBkz=j7#gh$#7f3uA=}<`|*MrE4)(BKoI0;L+yv!L%$Ba*Y@iTVEEWR9#
zIr2g)l`=&unzdM&6LrDp^t?EiEv8z=EvKxha-t9-G7A7a*B6bx>`WG%j1Lbr>CWXR
zd|v1SV#v4oju5LCl~(!lh1IU0rRv3)q8MH)Ko8>j(Xu5wKtu(U|^<9ask
z5Ce`=K~kKMB$Z;NaKv{PD7xyJoC@z#V4{pPA=l)%ti`g=blW17D57&20gBba^4esT#uIjkF?HEBICgz{gO2
zNrrc2+3u)@RD|6~*t5|xXRyySSrU%-O?I4f6NUpe^$~xUjy2K-c{~BMcsa9)xe+U+
zl!x^S-M38tJS4zSedxFlSK!B9H3E`_Zrea$1ywm3ksPi`*tkT8tX6@E*Z3fQ>L9)i
z*>vGkWD@0b!7p@W#Jb@M2%p-8KAwlFB@{=MWszj;@X*GTt*YU+k>5#@9go|x=&S1W
zf@2MBO2Y3KZkwg5c535L*cL|GNI{qF5KCHhS_2o
zF{?kUjB(tU67IL72E40=5w(xWBR6mkJJ_q(n$@iz3|UHLaIg>fo|H(Zk{3mr7Y)Q=u^y)luV@)5+ZCSIBr4+cSd5K9@V{A
zq%$o1V-^ssBXLMHjxZg})JnYShk>M|60{#yICSrPuJ}PTPt2F7hT#LR^dn7OW5x&%
za85+_=P}MzVERE&5!Fxpe19YF0Y9l!`^)n)4u1$>JmG5k+wJd7OcCTtm_A;^r`XklRBB!owdqMh(6|
z4y6lb3W78z6D=9@>LEt}A7Hsq)RM4KA?;>L={2Q#SD3ZJ{;G0E
zsVilKvG?GNZ~_d14@prnK&np03tj7)*o5JlmH~M+z_S09?Gg;F!f~3K?h<(nju?+F
zO6S`wqW4HdY`?W77LV@AnGVl8X0Fl;xfc(wCZso`XsKRua+dH(PYo%Scb@jFY3`wl
zDSYlnW7v4A(}l93Y{Q2cL*blq-j7ttp6Rj3e=dVDssSdEe5bfHjfn5Dztun6)sqkf
zFVvg6a|`NX;TL$CY=LfQL#JcF{HWYQSXH1$l|`z&W2aE54w(a!1ol6Iq$q|y$}WKG
zUTHM+OxnxNN}P4w+)W=|W=ZDg)}@2R(VP_KRk*^G^5R~LHP_!W7_VmiY}&byOm3RH
z#7Sk6)D
z+H5D7ONx+hiMkGSrX?m@VVSee&F9a-UK=;oLRd)#6NNS=sZy3(HnnUDc#A3}h-Sfo
z9&1E6QPB|qf%x$-w1ybrHF)hr;`C->%TBrE;`Pg78EiN+$xpu%`r;PJbydXrLFl9(Fovo<8Etjckg1(wb;D%RO!nC~W99Rr4x
z4M};rCp9G0ve-J)sMY{i(;X76>JG!Vp#NOakO!m(oyY916lNavsw
z4gB%FBIrMG{6h7uw{JE%`z$R4-po5Sg_VxelDw^ToFlu|nX1e?IoTE00AoGNa+Fcg
zm9x_?*Wv8QDQ5`cOMOy?Z{c*cvrUx`iV=BA*X{FEgUHvKF(Jn}YB?eC@~>5gO9?IJ
z$qFYW?~fs_LVYQ$Sl^PtfWSu(oA66=1GyK`WyhmOE{%<(F6f3s;fp%;oCp2Ll}vaW
zVZXI=CJ+AIEQHR`Sa%U?x_%xkD!PG={qVNc3jsXkheS|4yw2Yk!$LtUda{M$Oi6vWr24mmgg|Y(l6`TA{=sXF$nb$rV
zAKwOp4&g7WcuN*iHz_PHX;vg2LUbMGUc}r#j=5Lir-%nW3iuPDI|1J4m$1{vr{SP=
z1entl^)cfb%|Qsy=W1ykF`7^hdu5@KI3qpG0r)=WiqHk>W$9SxIBaj``IB@qXXWBb
z->DTN70r!`i#~MjVqRJOweQ_W%yUoQy77inWBZiM6xDnAuByJuXO~5;043yz-C2$l}
zeew!mbQ=vn2l_xJ*rT`CO-!#I>nP)$C-xZeox=68*4U#tpZFGHHf`5Qhe#oU3yvU$
z66x~InT#b2w_}fv@IOmZhaj^z9HR|P@B8dlZ$7pGiP}d$``JoM2>1oy`K)9_%~)7f
zuqN{|Nw$2}xW(ap2qg6Vb@cu7ka|jh`q3DODe$7r%+1VanTMG@%nzBLGrwitV*Ume
zVUR8|NajIyxVipp1u6j?Y#65?Kn3PC$7<)Pbv56!*%FQGjdFU8TVE|_gP{&$-
z1$z#u;udisGQ4`VEJ78l1#AQwiR(40sFoIJ0Cq-*6s;Uw)c0^S@5BXKZ%_u6zE>p3
z#f`|sJ#<68-(M^Bm3s5Q#>75!KH~PdRj*R5^!3(z>wUc-5A29UZ=0<{U$9K6;=R17y@@|
zvKWnuaxTc{+Hn>`2^wN_v~58G0o3##f-h;K=>CoN!DW3uK8TF-eQYwD`Jin`tvQB7
zPrq=P-*t0m^ibPJ+uA<*AxnY*R^;HQ0gwV0C-yBLO(NJ?!-g|KLv%0?Oo&$zU@cH2
z2|mFP;wAw-av@)nEg7NtT#}dhVg#s23$9XZAdr`oUfpq4g!+M2d)z8_b8WWCmtDl%14A6Y{zV+UW7#gMh}dhl@YaW$pMnv5BovNt=h&BrmO_a~}eBCwtlWp>?>VZqiZP<3x
zjxb1z=dE{**r$)RYHpm$X7ijY%8(3GriYg~tys|*!V_AGXkFCOT@_Jprs;$&vqx1O
z#ZwVJC`#}(8EVLucwIJPw(h9#JU@C{=1gBXB(=z59U3(DgaHTI4WC2{aN-8We-7e7
zDLT4^`7m<@=_3otMsg0h7`tBXBAVe7v=1%LXO4YIu>?)(4
zEyU-7^?>nvezk@JenF5xrRvhtS-_sE9=3Mk1jqqpCXgxg$n`Z@UN_&)b-<|yZ^fPpP7*Z97W6IHLZK0Cyu>yPTY$3zLK*vO
z5k4sExO4)rJV`WES5~bdpw$S}08GU$pAuC`FG9)7#wi(T?
zQcT;3X4CYiC8N@w4GauIvjVtB2sQ-5#g45+EU~3%G|`d_MbmVXjgwuZ``bbx5(Q=r
zQy06^I5svnB}>*Ck6IH1e0Hwq)m>M&3}qmWkonMcx@nqow`NR%H%%QlT5N6-H!Q8=
zV_9>@$9sBO6W;}JzJ@Y~7exh*4j_SW@M|#*>`_!CpxT};acdn#jbLw+0`7>99_FH4
z1feo~Nk5m~`!HpjZ1Bnv?8C#R4D4*d^Eh^$q`?pb&W(4bU}zLr7zS`Y3B|=0#e&OS
z)m*cc#=)yv#F8LHRL!$m(FtPCJq4kC1b~u-Hc7nO7$5KJo7>-SS-HHPXq^lH=}|sR
zV@wiEC%C|BykhyI%-!&ge2Z$uP`c;>sUU8ZGDNsZ5R3x?M&g4GO975bsAVGbNq9Nx
zL)359z?!1k1PGtT>rt|%7ySnICW1Iuv65CdQ4QPl!b+~(i`?v@;^-$$pY~Ch@oEUK|Qx45Wxh&6}0nM}z55PVvX#Pj!suXye$FSdT4K&Y9%=ws8rU+q*U44kQ
zoe2{t1D^kYfb}5@>FyK1hG`2VD5NNmf(X^H5aLwBc+;tbRE2L8VKuRwrE#LUNwV_S-c_}rlT&a_bRPsT6ILRry6hfLb4LX=k1+|JKusX
ze}G;H?W5cW0f#OIZzch>R7uGJ(R3>_9R%&buZ78{x);U=TNnBF#iR3!I51_Mw>c-$
z5@!qiP_o#;sUq5oZTf7f+a?MMs4_N!YONhkz9pPSz@LkE>a;i#<*Z(dbCfNE3=SqF>N4f}r$f2jM#C$7XEgRN=P_2Em7pfs)xE
zUZMzFs~Pa#UuVyt;B-y6ZOfv|k`u?Ilj8I%^pr$fP8nFfLnQ6=Z2FDhZ2F~_=o$SY
z*eGoJu`Rc)m^_-;5RD?;Gq_{Bg&%*iVI5H4!wiVkkv8^H17ZGhhrvj&R!(*a_
zCc5U-p_wSjKghkM)fcWE95g*SoENT1YK|%2hwY5jVoysVl6FoJcZF>}c`?tOHX*S8
zjv&9#GMTs5K9N{DB%3h*gjN!PWEPDw&?!Y?XPJpPo)S@1h!b^oA=}pTuq)^i1w<(A
zG}jOt#46D}{~vUdXe7^78~)yo6Nz>#&ziG-=lYYkMM>N4-yb75rtc^1)32NiH=+-W
z_s76^zmAx(#lRWXGpFNiaOZ;K?_e%vK7zTug}I%%levqz2Ya3$LCnK<5QX_XW*n4j
zQSuGG0v~Q3fHidnQzD>jEBJ!AF7?4vP00bXua6v9?$nPh)Fi(FyasQ}kSM-WZr~i^1L#v80COIW05Jz3yA16iLVe#6IKxp4
zFGGL{0c{?|@KpGT{Q7J*-$1*75Ygsgi%WyW*0%=H`{8B8zq15W*b3cJA^kdO=z5(f
z0|-RKm95PyNRa`&S!?>f&dx5^bCGQd|m+3rqq!KShNQ@XD&UB2|B&}HIeZpZRX
zc&UZX-#4h9QN8_mUcb0rg#y=h!tijRa8_t4Pfk9Sa95wXwzPI5uU{6va1C})%3vxd&C=UAOv13xTOKE!C?bx{0C95x28=X8UGs8{)o2*!|LhEqcv5a9*|
zaiY^dTO?O|Su%TVKf4BMCcA;XYXMXiK0ADTl$<_s|FgP3wR*+cP-6bx%T}KT1adRs
zhDR=`*YV0Tw@#KV?^rqe!bPRZtni6HUcUxl;`;T1v>eY%jzC)uN6yCb;!pUZ7rbnS
zWgPH@uYxZa;BZV3jz-~78t`3pB2~nLQ!6=$SNF*L(`%*Qlxnq7=iVwHu$vJ~Oje&U
zy|UQbTl{UgG5tKLeHbFxH9ltGRVh5^|Cf*NL0BlS^j%q60lW1NlL+>@Nh!0b!kvw&}0iv9`9DP1fa;
z$^7(7BpNA|BGYf^x{^%NeW3!ycG*i|uTvd;80&o9QH~8MgOQ}e8LUqFg(WFK?>aJB
zP>-Rx{loctv-!^ou!*+X!piin%EEGn^U8iYYMwka_tfbJ6frFUuSko^Nk~$o2VZMI
zwMVj7DPodlE!VDK{rof*63Sz=sR+JVB6^+lClHxs|xI57WN)bKq4>3ZX1dpT@HzMEij~y
zA}9<)wcqD&8(hhMss_=8#Z}3jz+M*$-@q%nwcw0aS&MZ!{3|r@|
zg}L01bGgOYEa{!zx@nU`%<26r$G
zmacPf9YX)#3;OCQsy6-T|EB9r03187GVS`V?keeOm#+4;B-LJ0sY>eV>aMQdyQ}whyEnJp
z-rIY;#Li|r?Ty4)9fvH05X_bUVMsy-;y7Dp2q7~+gg^pA5*R!LGBCqT7=B>wSJJ8jolCG|(*I9o%5deyhkcq)IrGgVQXwG6kYoh-rxAo_e*R*2Nd=2$QkZc
z@eybE6@nCT&^p+TcjQmDa?_SgNvQhHqQ7kDA+4_<#6aN-SYmdxi@WAZ{ju@dczdBV
zvFJv&OzvDF;|6YECaPDBt(+a-Gf~?zHC1mnXL7}s<23V5%^=*`IhP&tSj%p$lzYuI
zvNJO~Uf11`X-v;fji#rTm!~Ea*f9urtXMz3ZDMyTU7wnrs%J{$jgfB>LFe&!OXPUPocz~EwF->Bi24n>Ami+)ys2^BVc`dlFfhg!$ZZrffQFjXj;^l;sFC??Aq_cft%TX$&)01yfFPz&yx@&Vi
z84pjnWjC7v=jb?v-M2Z(Y9~gmXCiqZnaow^x|#XShqriB$}TK-j^2EwKNcOS3Lksj
zi+?#E9>76`3Mab<)rf58Amgob=zaWHt_Sxux+ti_;KZ^5c|eqJAKCfjxy9~7)$-%#
z&Ye4Wk6P@1@a~eH++$6CFo?)qAm`-AyVG9MvTX!S;>`MCO^a|V>V$GQvFCT5J@gvD>CG3Vb5YW{9mwD94UUm&j*1)LtX52c14a~ICJL0@yM=DXXV&+$1WE7>bZM6
z)y_A*!Na|mF0FloD|$r?7=Xp-vo~=0B*y2gq@}cma;Mh7&&l9UuD@yxgw&y4d)3me
zQ$-Lfqk6V#s3Xo!E&EVb6uN}pp-vh<{^LenH=iP5Y#1%mdf?+9e_GeFhJjw_FX?hf
zulRn_+zPXq1nM_Q8g6h${^oFP#xldxje})>vzIQ9JbO*VEnM>qB!DbBcE5|*+w)}L
zJ~;BTKDPCxk^eaIha)eJ{Ev~Bz&6|PVfL$Q)II8r>M`{$Fz;Vf|6Y28P{EjC6u0Ha
zr!%(t_?#_%Ng@DyK*I5p;9Pxbvid!SM|*yON5(_OBmd9`@%2A~U&9C6j1n)iS)o0+
z?DH!*3W#eWLWon{_s5by)EcQYAIqdOJXrG3=0O51#w4p});C8`1+A#xg7(H8CRI>u
zU$_jc!cLNZUm$ln@Sz;c8>@INKEnJ&=AMuY?vRv$%v)qkU>*R7vkPrmD&$1@9>PD-
zHiGvd=Rr0sg(N)43wcS&zSeFL%LOV
z+ZM1Am0&ZSN{ms@pXOA_zW@li?nXkjVyWG9
zXMg5I9;P}lBHL6^D@hG)w4KC{=c55oLBmmL5tb_h$m_1-gEk-$hcmWEKc#U#bR8(o28tYX2S2CH
zC4vxSW0BEcE9|I+x6H5oF$x$O^5t%-`Ip(M5p2eDoyy;bA_Ov;8M314Q*INg9o5(2
z5YjAB@G8wLSh_c^v>dYuk(6hWS0r~4w+%gne1?;<5q#b}abW__>M#F9{hppo{B)JKzX92KB*Ckz&DIPp*@p5(-8CZ%xT>Qu1>
ztpDQ_f;Fy5AYi+gnl@QZeGEY(l^AuYR0Cc&>{`o)TFf~eGvf6U*pWhr{^z(n)#>SK
zW%?5;k&Sb|B&;e-dZRRBwt@;+Q&;_16<1atv&mT)M+)xzgiaz^)l4qGYiUfs$PF7X
zJ;C;a+OJYbor!B^ivbUXD|V!itHiuM7nX1kZoYRM@tU9m-oc0LSRLR$Q9uBV$~k01
z*sj*g0r0iVK$YyjN~^b((AtYu*Pd0LV}ycAM}evQsYWgqjK_^&F`q8}zj_E}NyOmV
zS^HEujHHT|upDnvCAb(G%cXWgFpF<%PpXgkTq@{f8|CYDfv)g)@t553
z6+lxT%eM-J*8h=*ygJri8Y|moBHYdvdc|+kC^0#Y#Dx3{2eek$fxfug{|z
zhw~B-LtWVVD~u?vytaOf8=8;Lee#hIbp8h+>m|vV^Y9X>aNRN98E2J5y1ZUd{}W$)%Uizq7WF)8BuW)MUSlZ9Maou0Lfgq=Oa5sh}>KPAk`^4X=HgExhH6ui(_g@LHD0*51VY
zw9xBf7cHtDnHCzPCSSz?F(`PGYE~e8gw%T;s<-o4b6@B{$oeF_iC*B{Ab?90E>V74
zlHu?vKG||z2wD+sZ0xpIBu^e%#5CaJ7r=RAWUdp11X5z^*K&hit=?bovfVl~`{&6z
z!3U3^_8)pM@TNrecd7w5qNT`VsK)bGfLTw5s!$F>MidBM@?WuVA>M>&?$q)HZd0@9
z>P)V>yA^VVDLjdI2xF!$CS*()jENUD;Tl;W7alQV|BCUz(ZM|S4=W%-^jAgzJ>ufw
znD9Z$-p8K3aN*etZ>^4v-Am_+a3T{P)^827{`n(sc-^sU7EaIKe?;AT;XSwA_MT6D
zBfPk0lk0A3L<(LiroaA5*lz9m`wpGBr*n4G;d_Vp$8Y=k>?ycVo2Wyg2AV+$krzh0
zP<$D6_>=$2GV*Tg-n4kp$qnEXxA`Ay!9=Z=amwkbU?v}%F3$X1%}L6VN@g;Y$;GA%
zGjF*4-Q&B@c5Z!k+XH)!z44)|Pd@m%zmBI)r=x8%QuoH1qZ==3*|FxwpSi7n-L~d?
zF6_8}*V@(xPG9}d8;@P(YshMx=P-GW*ZQ?oQZv<-Ukj{m_3s6y
z#rZ>@e)(DM!gns*%B!3#KPbzG&+-?rF%I<*{~vytrqlMyJGpi!C
zlV`_jr_QYX!Nk(U#8SMF3X@K27u4odHC1BCIBGc*QGSfNJX(ZBBJ$0!NFr}ZkrlN=E~vy@>r<#zBh
z5;%XNN3nkLRI;|1K1lC|Xln7G+i=1M(@Rx^(al0yk9FreB*6<5kcA_NX7w9e8VBz>
zxC717Rz6;i-%ss*5g!u)K}qU>!HL!#DIO?yK8OG*7IQ2`>V!0=M2M6YT4rXO
zRHOH2HK~$%K3mOZtAG0nv+;YgyJly1y;+Y%GR;`oGD*;x=1#K)Ko?^FH1Ezs^@0{c$3n=<*$IZ#sTq1JZT1`Z~
z8@ymA@w17lY2D#krJ89h*`euoA&=vrApr+86_0NjH(IHsz>4-pqa0T6468Bsrn3)>
ze>w85rc#6NY|3;f@IwZayYe54?xwA7@Gab_F64^Tj^tn_=$i7jR(_N7Ze8W0F5b!y
zwSXc-;$>_M69H8qWYol>3-GgH8aC9O29WZtHVL*0jwLNTx;$lSg1pn8Z&(7L5Vpw#
z-RJ{J%u!p-oIyCqEW+r5T+|zgD?p@HZ*xBSga1iVfrdK(g=R>Fe0SoZ$DV)evF8_K
zlLv&dtfx|g4$>8-wIh)X!1XC7Kq-Q1`T$f2-iJY+a~%O
zSVCMFJb9>b>tN^RmD=xS#v6qkpmU?!-P2V|wJk?iR`1OPieFD1n%H*s^<&?EXsT0d
z?%>3vYfG%hTHS}Q`ov6A|97LOYmc|b?MEVSKes9X7yEVjx7Ca4Gb7&zF8~uL!5i%O
zbpsZWRGnKylK<^ahBW6ewk1#Xz9Y$%lK{y;t>@B2T4RMSj%`s%-ET2UBU`B)NfD*zGJOoAMa)-@wg
z%xx=Y;Eq!N<|GJZXf5G4#jzp43#J1drC5N(;)KFbR7|{LUCTInvPs1ua2Hh@LD_e+^t5uO)8!`4w81LpFrh8oCkR(qYx)F6m||gH(M)|EDKRYHxhPdR#dP`!aiDY0VMNE4~EXHvwx_D4$nVJH-sN0%`aDkmb)*T58rOdWlNr&M%I(vXDWr<;}|%JG3nyNClOsym<^ueI|l;Wr*oNPHIz(PNsTC`RnI{+
zE9F(h%_Qv{cmwtmT>&$2Eg#*m-``OGo4M5^k2RvO6#iu%U^*IpWthY@t)wZrHCV4q
zvGh^dy!HACx3%@u!pxrYwtmyo@429^+cVv%>@80W`jeHtl_Tn>SMPkZbD+GVL$aEDP5kb@3lf}pPAjZEBS`(>sI$v>&pw3d}8s)!tUhL$8NZH
zZGQs%pfT?4Kl6L#+5E)T&+MFzMsm@Ds_xo9+KXkYyADU=@j$ClJyyN2Cv)WLJB`WQ
zV*78Ji?t-|?1?WHrn3F_=2u(gSk{jrNJ)Mf0K%=JsC-Dy-;2b*~xHk_w14vDp=t`saKQhs*hAIe_8z;
zwq}*c_C63xa;1DXw<(CBKY4IlgEso}vrL&qEuCQn7|&!VO{>A%!>E?{R$AqV9~IG%
zW@7T;XmP(J;^4?y$-aQvGOKct%7H#I=-39awSzvWE_Os_67gf&tqX=mh~`Gr;@H^c
zBXd-!l}57@o0vZht$nuIVwM`TqLgsMO8Gn6eo-}Vxq7L&xNp~%PNLMDnx0AOGV(Lc
z&d!GEe9uf7-N#;Y!coy^aAE)PW!raDQIJXzL1UWbJQJt|yancEFw{PZRZ^(Q8K#Mb?qioS%bQX-
zB@~+0a=SY#{t(cK6%8Vk_n6-qHAeW3+
z$^EDo{$a-+-d%xYR>>n
zP`s_nIq-0f8OMADFVv;LnQOMS3;4caN}i2!IyjatXPo(PHW8~cJ!wFkwQF~)*7o~f
zw?EmK9`D4{1-qHZqC0i)1F`6WHtnU80rM{8rR1I;`tJeZNJ{l-v(3EORt3iehk?8Z6gZ#RPOR(=(8T1sKWAEjUZb3^C5kvR=_jTjr-XJfRbF)=7C34l
z-H|?)(TQ+k1wG?f)r#e3H+rCYW+fA;?my@W1&RoKU@4u--+X6S%o(gSdxv!Jn!#YU8Hrkof+Rf;fCB!
zJ2n=0o1AsW9+#XFwQ#baXSgg&ICsU{_?47^%%}f3HA)fj*^~Ycx
zHt_(Z!%Q>GF_P3569Le`S!Q6g{Sz&(JT3xrrJU`)`e@W8IL)6*Z$CXJillq*ZM^WI
zt&>NVPn}xcH@#H3c5uyOk6p9*#(&5crfzuu%+40x{{HQE-&5IlYI*t8w#MwjW54m(
zl7H=OuD#R=Zg46_nqHceh7aW|BnMVQ-Q0ZY-(U41?~#9+nfRwi{^;x3KRThd|Je1d
zcW*BL(b_+4{*Qbz0axgMsox~GeG79G$KscBkTCWC;(7R)^;iGx(NU-mPMMZt<*59d
zhhxVEr2maiG<}}<5Xt4f0sj8QN~*MFNKCq@JsGSS3|YkC0_ABu*X
zdQorsYpneCFj(?Op+&606@nux)ed%;|)(4qo#-);k>$!fR={aUV1Mud2
zKuL1@{+rN9arbM$ffc1aZk*ws){OsU=QHFb&N%!p<=&-=V
z5lQC~DUt?-I3)p2G#iZ<%(9!wJF4#(XMQV483)Z8M%^uS&}X()nCee?<%!J`WxQT;
z3;5QRdXzq?DF>nPNRD0)wJmM~!Z3iUjNc87W2vnsvrP2r7fAK}Yye1>FpRK+G~wBk
ziSF4G{hA+e#(Sf$pW8F~50%Vn$qy9&&%WMEt72c(IzJ)_hi8u{c4%Qh>{_STC
z4Gm5RF!f*v17W9ziekf?V^nZ&U?OpVFuT+^Uinh}V!EE%)L#29vpWV8@zee7*GFJ_
zI!Oc%^=#ZQSLd7CqUB7`PKVMZIi;E_?E=D9xon3sPQ74;P@-3%$_Jv^VXX
zncQafww?Y4rz{jJn63+N*-fS9SI291#zEL4J-#&l`nPOyGNI|arbB5hwEu=NUKID0
zf*HjGB=gZX(J1)^yJC4|L^4Fnck5>EA3?Zx4!T8P1)??g#)MG@~Qp#>&_MS|MEqD
z{N?!mHs2otv5IrnI9r@A%+><2Z%G?`<;EWmoUGh+SLNih^K)~bzwo}Vo~+(=SM}uA
ze`@aLJ8s6;_iNez0H5er$)?Cwk}{5ynQj9~uD~G4S?vXyIKIg?1-SjW+ZUhQ6o}kf
z`tz4Uzwr6%MlS22m;QXyrY9G_4C#@wDeUXt
zU|&TmcHFo00%33W#z*EF5iY~A`AC_?HEbM2q^@85r-|By<2um*Z;2lW0P=pc#jNyww&k_$0gecJGjxNnuG~@
zM)z8#^ad8cQMfw%%;+bdI=YayOzT*Fk6G|))n+T1Z)79+U7i+nGSuYn-QQBKYc>0k
za4Co2L2+t%>+WvHIKG$WAUe%7(=*!_??Pjh=zFSId%6-+l;4_#3;Fa^js(SU9v|+P
zsNmer_`%@#CWo6?ctNj5gaP;^G6Rkw1{eA~DKM!GL7|fRW{W$Uc%kcilHg-GQ1MEJd^Wl?c>E${71@=W%tykRs`PJBR*C4qv~9Cw*)HUw
zY^>g+Gz}Dj|FxV^Rg=Nk)R<9BBIv>Y*$
z#Z1i9oE`g{$NQt5Tn6|hP6s2nh?WVpAGk6Us#I(*0U{}c4)=d*0}#vt01nV(FdPqV
zI@4|E`biiM%mHyHrKySXw7z%8^y%%X>Cxh?z($U4Q$eF0&BtM=Qkr;ZEK#OWO(3w1
zu>sHMOX>?8zrmQ@gM|dBBXF0(QLePOn0|B(qR!mq7mO~`Ql-rq0p8=FldMOu%{cNI
z(D>oYnxZXor8$~Oxq)1v_mSRMtaWCoRtjlee)HjCuh!_&>o$3}zI5cqoHpAk77pZ0
z72VOK%D6LuVB6}U)ajqs-OA3@(xy!l_g=Rnl+HLOHrJQhW&}Nlb~Zd%e0rBs$Cqff
zJ$lpr{P?6x3ACL|l~dse2J)3-enn<#vIVcmq$UYwhv7rJ$6>UE5tQ*L1RzBA!5~I5
z@Q*k*+^$3kV79{VVH7aV4fo5BBFVPD<~#8Sn4RkA
zf=QwN_|l$y<2PoOy<`;9A)?qu1?akvkNNZThMwkaKg>=V^kviA4O|XxQ8`>rgbe|Um%!0ZINNgFkHsA3D8_38F&MU6*pzr%i?@>PsBPAPg1xAI3
zqpNt(rl%cXqGcDV3Db@jau&6WB-XJD0mO0yJO#%OM?Ke6(z=9ymKL`X$znQFNG9x<
zCNc(!nRD34>OTOoMBD`BQi9xAXsyTwv@P*OHXI0M$%TMhYNk%_Rv=1%gn*TZAPz--
z3^6$XhCn2#kol&ew@t$?KZoxIexr;k~9j@l4W`N_T2ztgd&ILJc21Q4Pv^nTt
zv1bB4an7frQTPlcmLh1ZfDjqvtN;S|OgA>;rMh$|LNn>Iy#*r{aCDj?rxIiJ@1>K){;$M1Vmf%X-Y+zgZ;6zF>l=SqjwNsY}y;a@et
z^2Lqu1!&4SG-%>=#o$7B<<(OX-*{+BG_J*ypj~BYsW6Rm67iY>ei0M2T37xu+C8lK
z6~7*|f1KtvrLu#7m$upqqcRitDQ@?h;h>&LCri_DcW!IYT)`^uTropi=fa8UQryev
zp-f0tC{M>Dy{%zGR@k*-gtzwG#B@2C&IE$r|L%9c`=9)Opa1;lm3rHaH@@x0?>>3O
zS_wAexURGQMQkTzZr{DJop5rxoJwb4GSaWhOQrm8S`NuKRW6TQyr@PlzU{#W|HnfQ
zsiSv)_nv#cvvlL0-8bE|o2ibZ#N}@>_x}oB^^7QSCwmrmJ^?UFjo1SqX|7f;g6O0L
zki7tghRfFT263{Pz4&~4kh$gs>(iyl$?
z9|g6~bgixGwaM|)*GuEch34;O$FrN}ZeQ8m8cU~XYFN>F#!Oa)3VXMAf9mPAKZ+P=
zRK*i1zdrgB*#9M-o#v`OIP&Dkv(&o(GF;$4#=c8Ve;9}xFija}(8Db
zdBtoQbDXMUR~?l9Tq|Fx=cCbTYP8aiSWaS;?wxq?rb_4bwgJp@UL60^n5NBv8_lnM
z9tA%$I~B|}+@*q(=H_$!^6XG-c3W-FS+m@%
zJ8}7bn_ZyIfL(2cd*jpf@#AJW?b(58bso(@GI-Y8sz;KEY4$Qg(XafIdNL30Yr#$q
zYO!*9ZebLuZ1%KXZBZsl^8sNmj_pD~{^I9Zh1>V#a&yZwCrk0D|1VZJ{O*Zuqfav_rjp~B2Y<|O_y?K2nJv~K+F!f_uS29>lTMt#B@zpM*A7RZ3{Dd!#3KP>?;tkzH@FXX;3cnu
ztsfsbiBiE$sL#A+>-Xl05uy7
zMU^FeH3)!0w7prCE0k!69yk
z1+66t6mrt0t)K#L($ra0-0GuH7?lQrc}Y`y)bHF9xhDLE)EzJEPaa)daraDa4lW-)
zqF;TkP)1imJFo9hr_B{8u1Z_Ad&YlJ`!rm&NKNYl*UxA>mD;Ti<5%R=&6?(xw5KRY
zm{Qu46qDxApiwGTRcchJmS!y8uvNupe{7&HKGj|O!Pe_G|NhopTb@|nvvtbbMgRFI
zn!P(`cdhOmD;JbjFKip#&N$W3sC-eqz&x6VhsD_y`_VSnJ#%rh7y}^s5_icM9gc}%
zZbpU#aIp~^D=sxRzxKfE4%qfUl}
z?B?xP-}{=A=Qod1&Sz|HZaaGT@X;fO4L1ShJ?ly82&}}u{4d%j^$2y1w^6nCE@ll%
z56Z~jn8VvftgD~D6qP}uNA?e++aIzPgbafZiG>w2ZJCmGktK}|2f#tK=ncbbv8et6
z2{#Bo(kYTS0=RM#S~4j~;ktyT0a3E`(MJsV?y^?0lP>yLcBPTa)hhTZMl}CIX>>D(
z9>@m01SM7C9a^y}9gxD2DEeT5NQ}TVLc5PCBrWwXJC!;VuUb%d&}^urO6^3Da^Q-wfMHGwjrX_(w`Av@NJc~M&a62Om@x`!v4`#PxB#8ZLxt#^+nk$PVH
zLM-M`nBd3jKjc$GbK9_9M!zLW)7(q=;8BgjYoe9)0OfuyWdFcbp{?%{p2Pzf)ABO9
zDZ|(z7Y+rkh31|-100lusu$MY4qJ&rV9lkZ41A&Ag$Szcwzl#WinFp%oje3$VkNp?9Qo}am8gM$uZs!xw@
zoSHVKih!>XG5qRf$bG!eC{xp1CflahQjks*xWe+k!lOJp91BMCHK}DF_QK3)&UlSd
z3sTPZsnq!AA2K?&*dx>oW+X*%+1lvui+ZpV#4gnT?q6Foy27(xSPjKERP
z%^C1ag5j9w65_RmIYRXUBpm6b3sxh&QfIy7wUL=bVyyi)?4;ua>Ai{^IH8N|9tz>|
z%t(euQ{@U7M9pHbT7g7(V33!mazz_5zW$V!4d{ReXmrhRq8Nd4nD6_0^|NMJD3G1m<7e
zG#Uyy!HJ7@@LX3=1mgrk2wI^QF(zD&8&h=o&oNlflWFgQOYaq~ByKXHg4lKL>^l1@
z@VS|RKg@k9YM~kC`;8w~>JLOcRNgY719~71P~C8c{V9$2moaFt=ltxEwQuX${kd#LEv=3^iO%_~2kX)8t<Z=Ni{zP9%Xi+33R-`YT5B*m$}L9o3LElj-nq
zMQU0@ntCobl^qVB=HHL!vzV3(;+*R+4sXW
zgFjr6CiGYM$_c4DKt5E)8CD#In(q%->$3vJKhsy2PHi*w^Sc{o&o)kNGxY0scYbwV
zKf0y8Yf1|o-LiC6J$GvPU2D2cV7&HE}Qbv8TnA
zNb$YW4Qga$J$ss5F9YZ|No!S;YI$E64skcq%?5*(H4~^W7O2QZ5w`ZUzdHzk(ZfO`&rcuw7p&?W3sL9ZvPE+!*
zlFjOumBIVM$MxSB__J}p#c~$SFbm7A#;}4kD{C;k2%#lv_Mo6~qx%dgmJ_#Pvs>~w
zoR(2smeD8SH8(6#xyb}8oGCOTczAHEADLwd;VcQPF^4#W8KuF~KwrC)j
zh+=nCH<}=8LU%jktFT3|UZ9$H8%(j-dmc5!4C!*ArA~ySPJkH|j5SutRh&JAKzTPT
zkxEO?qQ{uJb)t7duejG~V~V`KUZyJ&T0bte6j28`SVOvE*j6?bbF^`dmKa)**)at!
zALo98=L%1UY0^lgBf5=K7KkN7`czs^Yexx2nJmNV+l(feroI(QMDt5oZo{?0S=EIL4*L4Au8aAV9u?(1p?(g}o)v)mGHDV;awwq+Wt=G&1dbgG?3E@6^!33K@Io1%R?)rC!$Tka55c
zrefl@I9EZ-wb}2eucs~e&v5RVW+WZ*XDo{9{LGlZ5lqBZ8m}H8NPKMpS|EMMb@b88
zAF0iX6N#X_j-|?whwQ7Xuq0MFR{iY4C>HbR^4h$N>c%H?##i+sPFZ8FxzBKb!2@0O?A-j=yWzFoCX=4M>C64@FF9kZ+9ou*2?qdZaO!|An)ade9l?d`3F
ziFS6=Oc@(MFQCgm(4JE7Atvnl>fD`(>Pku`!(}3t5}dwQA?B2ul{P=bff7A&^xWj!
z;9@a3q6Ysd=5m!?Ox?^VQT1(xp5}JDG4OH!+$k}@?@Yh^J9L~*~lVL0V
zCF+;&L+;}l+S0s{dn9U7d+-wJjiE4i0(Ps$Rzp(5y8%5$3|EuXOqF
z$Xh}Gm=Rx@&60zZUPa7n92AfIAArw;(W8EgSHatID#R=q^DW#GaZkuqVvWG3=YZ>y
zur!d56=aV(Fb&9FXlDGt0u?^pLYqN^QS~QJqtmL-7@R}iXH=!>=kw=4^@+75s%GNv
zBdlvL(a~EAbax^Y!4Vk^B2dl-2Fsv|d}S-Lsu3$@qA4*@J-Sz_uYOg*on`8!()aC3
zNcf1(>vX2@APu>C&M~Xw(i_l
znTM0~aZo=N4}YHirvQY5^-7{htyX
zNJzmR8|o}~hn3t*QFc7;%+1wil2YYOT{MZQC66xNy}7*RCHGCUdn9U15JsjQiC}Vd
zV#&)daSb^tBE&4QBNp+h}CptOChY
zDv1H6Y3m7-T6da&SV$6DX3X4i`|9fLtIFY{^Q&C{Q7y1j*ZvnDAAVS^W*b)%Z*hKU
z3=j@a8w>>v30sOO$if(Fe0mk80)CJ5ruh`(zbAbUlm5837`(z5k1&j90t+a?>oVOA
zGw>V=!&GMf{Y-6=o~29spN5^yf|Z(IA%?3l81@mwNb$yh2DPEk%3hSu%0z-XLOLMP!_iI{`6
zpT9EzjS@{7n#nTCm^EX;k;JbTaa*?h4e>4hwtxfh*7&9fM%3Tda2QAj^WliFwrLh;RMa&18ML*Ffri%Lw;ost
z&sMV)xB7aD{MNpkMASJwny+bEvt+v>jEp2~(+F%2j4}k8{PeR`ClfdT7_}L_fnP2-
zaZ9RA;MB+5!jcL{1E3GU16KN{?C5)0rMj4{1Pd**1hu}LU}eCdgFu#P0?ABPU&_-)IFG$wYQZQ(w;7e^3l0DD6&Z
zdHuczw1>2#S6zI)_WHzVOO@)Hsur?nGE!4yke&$?3VKmXXoWy3kbY2m%}L};i`uzB
zREsTZs44_evL?x#P%TGSbYZr3Y)Lrb*4UxAmSnED^)_wW4vnfEkWsM^7@q(^S~#pt
z&S;0Hwdu*xNLy>RwW!H(1N~+GWXE=6->yV@=^Q-V7&Oqx_$n%o#t(@dQM$20WG#N4%*%7$~~GL!I?V8W3kEL4so
z_HHX0T|UXt#dM~I7#iHE?L7>Yt+MhsADiSTonC~u3_bNqKw<5MW$8u5)x|SK#KwmVaD+sB9w^WUn0-eUtfk?n*M<-|iA(F>e4ij0-97&s
zMC=|ijK75PRo^MbrVhoCxjW^1#J^(hZwwb&LZqIEyVOb&GOL#9G^c`k8=S$8guFzm
z9kgtE3Y={bxkLd87&6%?Q$YKeEgdOvaW}V=#XCWlcVf_bhwn(|27AE`*Q(ira(83t
zf(;PqL&Qs_x|T0+Qt?OwAd*k~zUg=|?i4*?hLcY8U=n~ko=V0$6x0}D+c=*FAPF_c
zTqH*J+?5W85@cVG{K&$nYf?5Ig0X`xiw$MM*2p`CLp_i`DG;1t;zRC9L)8UV%Py{+
z;KhHhZCCGusW|Y_K6rno1u4^%xR^7CQT6R-#!GrKMDfW4;lazIbfAxtqfXbaDT!
zGr3ajt=?!Yb4z`hqPn|t
zN!+tHXfHH%RqquC;}ct}!E~-Rb5%x_zZZ=ierr5liA>GSMC|sUw)hS^{KlVF=7Nu5
z{S#yE$9N`M>Jw5`-Ao(J1!FKHAQmm2eR_)_L(ak`a73~w!+gQrWoQ@IF0EZsE06Yn
zX&3Ht>6(Scj)mmf-#4~wY0T8;D?c7dk3V(j&{N}G)qVCO>b)=ZzxK8M*Dmf&Z_>4i
zId8n!?RHC@*Mu_L_V3?TR=c*RPRPBWUH)hMCByf5QE|c7r5n67wQBi|j*^2}1^tkk
z2X>LkjoaI_M5cAn?hicmTcx_OXmm?!U)y+Mo)-?FWonUxL3hIoPI7lT9o`(9A5UcB
zxd+s9b-NPrVczm0Mp+3
z**$9hU9&+Z|NS_NfKG;$$$>=wLokNQJ>3h)?V`JsuaN6CW2wAkm#74D<0(|CZb?$H
zXsBqyO=MK)7o>h%h2Hs2ocGYX-woMG*M1S2X!z-;nO4ITe>(_aSz*J&*^_cu2DP1!
zXX^O0WHl_`T@5*qEvb*ic?{$#joVt|d*>inHo8oJkr>2AnwU6fW*thC=kW9G8~Aub
zGMTTA+yv~!0kbaNKV%@dNjft`Lfxl|B$M(S#G-4EeM*W^^8$N@Dzi^xk_RE+aF$0ze
zLJ$uOw+>lHv-^zFdfJ@S0#nvB2D*fcrH2tw+h=P=1;O4DhpkI;m$?*dyS3F5fNg!P4g#UAx3fhI%`!Mp##<^N3F{bg$Ur8C(Ax=kZV
zVqyFx$+DRgr}`=&++u<*n*-Aa2f5AUrfLgDDp!vglDY@EF->klS;E~c#F=I7@ZPWO
zH)$%q?N^trxPJTfaAD)Fmbv;wP@a26!CJQ#k5#4Afar8O0VDAgdFn&OmAb=7e*fl;J2Iqd;E%b4#8Km-&CC
z09js>$ixQngcU6L`_X!9Z+cfL_h>0sYwk(BrI_EpC;d_}zjqJbaw)fGPhu>UbNKUy
zVqWcG;ek}?OfHv;^5=G7qgFBx
z9$}S3)u(^g)pRh5%bkePo^0r5k4zxZByz?d~+}t&Xr=3FNNw$6h4!p
zovtR@^P8+@X^gvbDiB<|7d
zzwFAF3}@yEb@@N2e^#I4F7$*sIx2x0`HH{{R8c>m1HdzhY623xkm5OLjxW^s-L&_C
zO^$tF)9kHh_F)4*yw5H#99Sw`C>*e|@25Ot9A4@9Re&-LrB_A)}8jUps&I2R>Wh
zIX6=Xj=%6=cFciofMsh03VPSe>t?%6>q1vX7Mq5k3eeXRFq
zeyZqSSnIkcIVVF7#vyX7!I3JS>9F2VY-(EwKkS>oL&QGp7SXIam}z_Uxw+ll6ZM(S
z-tJtzF}~1fOivfrwNie68oY@1=?mkH`W)gZe23txm$m!oFF#I}{x