diff --git a/docker-compose.yml b/docker-compose.yml index 11902a565..ac3425c9f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.134 + image: interlegis/sapl:3.1.137 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/base/migrations/0024_auto_20181126_1534.py b/sapl/base/migrations/0024_auto_20181126_1534.py new file mode 100644 index 000000000..2f91af1ea --- /dev/null +++ b/sapl/base/migrations/0024_auto_20181126_1534.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-26 17:34 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0023_auto_20181105_1804'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='cronometro_aparte', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Aparte'), + ), + migrations.AlterField( + model_name='appconfig', + name='cronometro_consideracoes', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro de Considerações Finais'), + ), + migrations.AlterField( + model_name='appconfig', + name='cronometro_discurso', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Discurso'), + ), + migrations.AlterField( + model_name='appconfig', + name='cronometro_ordem', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro da Ordem'), + ), + ] diff --git a/sapl/base/migrations/0025_auto_20181126_1648.py b/sapl/base/migrations/0025_auto_20181126_1648.py new file mode 100644 index 000000000..a1ca53ed4 --- /dev/null +++ b/sapl/base/migrations/0025_auto_20181126_1648.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-26 18:48 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0024_auto_20181126_1534'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='cronometro_discurso', + field=models.DurationField(blank=True, default=datetime.timedelta(0, 2400), null=True, verbose_name='Cronômetro do Discurso'), + ), + ] diff --git a/sapl/base/migrations/0026_auto_20181126_1727.py b/sapl/base/migrations/0026_auto_20181126_1727.py new file mode 100644 index 000000000..4b908e7c4 --- /dev/null +++ b/sapl/base/migrations/0026_auto_20181126_1727.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-26 19:27 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0025_auto_20181126_1648'), + ] + + operations = [ + migrations.AlterField( + model_name='appconfig', + name='cronometro_discurso', + field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Discurso'), + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 9153803b8..5caf8b2c0 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -121,22 +121,22 @@ class AppConfig(models.Model): verbose_name=_('Quem deve assina a ata'), max_length=1, choices=ASSINATURA_ATA_CHOICES, default='T') - cronometro_discurso = models.TimeField( + cronometro_discurso = models.DurationField( verbose_name=_('Cronômetro do Discurso'), blank=True, null=True) - cronometro_aparte = models.TimeField( + cronometro_aparte = models.DurationField( verbose_name=_('Cronômetro do Aparte'), blank=True, null=True) - cronometro_ordem = models.TimeField( + cronometro_ordem = models.DurationField( verbose_name=_('Cronômetro da Ordem'), blank=True, null=True) - cronometro_consideracoes = models.TimeField( + cronometro_consideracoes = models.DurationField( verbose_name=_('Cronômetro de Considerações Finais'), blank=True, null=True) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 4251e54da..89f781558 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -228,11 +228,8 @@ def file_extension(value): def cronometro_to_seconds(value): if not AppConfig.attr('cronometro_' + value): return 0 - - m, s, x = AppConfig.attr( - 'cronometro_' + value).isoformat().split(':') - - return 60 * int(m) + int(s) + + return AppConfig.attr('cronometro_' + value).seconds @register.filter diff --git a/sapl/legacy/migracao_documentos.py b/sapl/legacy/migracao_documentos.py index 2c9e00842..23c6f05f7 100644 --- a/sapl/legacy/migracao_documentos.py +++ b/sapl/legacy/migracao_documentos.py @@ -1,6 +1,6 @@ import os -import shutil import re +import shutil from glob import glob from os.path import join @@ -189,3 +189,27 @@ def migrar_documentos(repo): print('\n#### Encerrado ####\n\n' '{} documentos sobraram sem ser migrados!!!'.format( len(sobrando))) + + +def corrigir_documentos_para_existentes(repo): + + for model, campos_bases in DOCS.items(): + if model == Parlamentar: + continue + for campo, base_origem in campos_bases: + print('#### Corrigindo {} de {} ####'.format(campo, + model.__name__)) + upload_to = model._meta.get_field(campo).upload_to + for obj in model.objects.all(): + if getattr(obj, campo): + continue + dir_upload_to = os.path.join( + repo.working_dir, upload_to(obj, '')) + achados = glob(dir_upload_to + '*') + if achados: + assert len(achados) == 1, 'Mais de um doc achado' + [achado] = achados + destino = upload_to(obj, os.path.basename(achado)) + print('-- {}'.format(destino)) + setattr(obj, campo, destino) + obj.save() diff --git a/sapl/legacy/scripts/exporta_zope/exporta_zope.py b/sapl/legacy/scripts/exporta_zope/exporta_zope.py index 682296f4b..bec8595cf 100755 --- a/sapl/legacy/scripts/exporta_zope/exporta_zope.py +++ b/sapl/legacy/scripts/exporta_zope/exporta_zope.py @@ -93,7 +93,7 @@ def br(obj): def guess_extension(fullname, buffer): # um corte de apenas 1024 impediu a detecção correta de .docx - mime = magic.from_buffer(buffer[:4096], mime=True) + mime = magic.from_buffer(buffer, mime=True) extensao = EXTENSOES.get(mime) if extensao is not None: return extensao diff --git a/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json b/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json index 50c6ad647..afae65bfe 100644 --- a/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json +++ b/sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json @@ -1,6 +1,7 @@ [ { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Altera o(a)", "descricao_passiva": "Alterado(a) pelo(a)", "sigla": "A" @@ -10,6 +11,7 @@ }, { "fields": { + "revoga_integralmente": "True", "descricao_ativa": "Revoga integralmente o(a)", "descricao_passiva": "Revogado(a) integralmente pelo(a)", "sigla": "R" @@ -19,6 +21,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Revoga parcialmente o(a)", "descricao_passiva": "Revogado(a) parcialmente pelo(a)", "sigla": "P" @@ -28,6 +31,7 @@ }, { "fields": { + "revoga_integralmente": "True", "descricao_ativa": "Revoga integralmente por consolida\u00e7\u00e3o", "descricao_passiva": "Revogado(a) integralmente por consolida\u00e7\u00e3o", "sigla": "T" @@ -37,6 +41,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Norma correlata", "descricao_passiva": "Norma correlata", "sigla": "C" @@ -46,6 +51,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Ressalva o(a)", "descricao_passiva": "Ressalvada pelo(a)", "sigla": "S" @@ -55,6 +61,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Reedita o(a)", "descricao_passiva": "Reeditada pelo(a)", "sigla": "E" @@ -64,6 +71,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Reedita com altera\u00e7\u00e3o o(a)", "descricao_passiva": "Reeditada com altera\u00e7\u00e3o pelo(a)", "sigla": "I" @@ -73,6 +81,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Regulamenta o(a)", "descricao_passiva": "Regulamentada pelo(a)", "sigla": "G" @@ -82,6 +91,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Suspende parcialmente o(a)", "descricao_passiva": "Suspenso(a) parcialmente pelo(a)", "sigla": "K" @@ -91,6 +101,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Suspende integralmente o(a)", "descricao_passiva": "Suspenso(a) integralmente pelo(a)", "sigla": "L" @@ -100,6 +111,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Julga integralmente inconstitucional", "descricao_passiva": "Julgada integralmente inconstitucional", "sigla": "N" @@ -109,6 +121,7 @@ }, { "fields": { + "revoga_integralmente": "False", "descricao_ativa": "Julga parcialmente inconstitucional", "descricao_passiva": "Julgada parcialmente inconstitucional", "sigla": "O" @@ -116,4 +129,4 @@ "model": "norma.TipoVinculoNormaJuridica", "pk": "13" } -] \ No newline at end of file +] diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 674e1b9a8..4f6b6a563 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -344,6 +344,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 + relacionada.norma_relacionada.save() relacionada.save() return relacionada diff --git a/sapl/norma/migrations/0009_auto_20171113_1339.py b/sapl/norma/migrations/0009_auto_20171113_1339.py index 672d87c94..36380b2a9 100644 --- a/sapl/norma/migrations/0009_auto_20171113_1339.py +++ b/sapl/norma/migrations/0009_auto_20171113_1339.py @@ -9,7 +9,7 @@ import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ - ('norma', '0008_normajuridica_popula_tipo_vinculo_norma'), + ('norma', '0007_auto_20170904_1708'), ] operations = [ diff --git a/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py b/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py similarity index 57% rename from sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py rename to sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py index 3bfb90132..54c316c81 100644 --- a/sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py +++ b/sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py @@ -1,14 +1,16 @@ # -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-23 14:51 from __future__ import unicode_literals import os from django.core.management import call_command -from django.db import migrations +from django.db import migrations, models def gera_tipo_vinculo(apps, schema_editor): - TipoVinculoNormaJuridica = apps.get_model("norma", "TipoVinculoNormaJuridica") + TipoVinculoNormaJuridica = apps.get_model( + "norma", "TipoVinculoNormaJuridica") db_alias = schema_editor.connection.alias tipo_vinculos = TipoVinculoNormaJuridica.objects.all().exists() @@ -19,21 +21,31 @@ def gera_tipo_vinculo(apps, schema_editor): print("Carga de {} não efetuada. Já Existem {} cadastrados...".format( TipoVinculoNormaJuridica._meta.verbose_name, TipoVinculoNormaJuridica._meta.verbose_name_plural - ) + ) ) else: - fixture_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../fixtures')) - # pega tipo_vinculo_norma_juridica listados em fixtures/pre_popula_tipo_vinculo_norma.json + fixture_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), '../fixtures')) + # pega tipo_vinculo_norma_juridica listados em + # fixtures/pre_popula_tipo_vinculo_norma.json fixture_filename = 'pre_popula_tipo_vinculo_norma.json' fixture_file = os.path.join(fixture_dir, fixture_filename) call_command('loaddata', fixture_file) + class Migration(migrations.Migration): dependencies = [ - ('norma', '0007_auto_20170904_1708'), + ('norma', '0015_auto_20181109_1422'), ] operations = [ + migrations.AddField( + model_name='tipovinculonormajuridica', + name='revoga_integralmente', + field=models.BooleanField(choices=[( + True, 'Sim'), (False, 'Não')], default=False, verbose_name='Revoga Integralmente?'), + ), + migrations.RunPython(gera_tipo_vinculo), - ] \ No newline at end of file + ] diff --git a/sapl/norma/models.py b/sapl/norma/models.py index fd06b553e..6565304ee 100644 --- a/sapl/norma/models.py +++ b/sapl/norma/models.py @@ -258,6 +258,9 @@ class TipoVinculoNormaJuridica(models.Model): max_length=50, blank=True, verbose_name=_('Descrição Ativa')) 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) class Meta: verbose_name = _('Tipo de Vínculo entre Normas Jurídicas') diff --git a/sapl/norma/views.py b/sapl/norma/views.py index faca58d32..f2dfb6f2e 100644 --- a/sapl/norma/views.py +++ b/sapl/norma/views.py @@ -37,7 +37,7 @@ TipoNormaCrud = CrudAux.build( list_field_names=['sigla', 'descricao', 'equivalente_lexml']) TipoVinculoNormaJuridicaCrud = CrudAux.build( TipoVinculoNormaJuridica, '', - list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva']) + list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva', 'revoga_integralmente']) class NormaRelacionadaCrud(MasterDetailCrud): @@ -208,7 +208,7 @@ class NormaCrud(Crud): def get_initial(self): username = self.request.user.username - + try: self.logger.debug('user=' + username + '. Tentando obter objeto de modelo da esfera da federação.') esfera = sapl.base.models.AppConfig.objects.last( @@ -274,16 +274,19 @@ def recuperar_norma(request): def recuperar_numero_norma(request): tipo = TipoNormaJuridica.objects.get(pk=request.GET['tipo']) ano = request.GET.get('ano', '') - param = {'tipo': tipo} - param['ano'] = ano if ano else timezone.now().year + param = {'tipo': tipo, + 'ano': ano if ano else timezone.now().year + } norma = NormaJuridica.objects.filter(**param).order_by( - 'tipo', 'ano', 'numero').values_list('numero', 'ano').last() + 'tipo', 'ano', 'numero').values_list('numero', flat=True) if norma: - response = JsonResponse({'numero': int(re.sub("[^0-9].*", '', norma[0])) + 1, - 'ano': norma[1]}) + numeros = sorted([int(re.sub("[^0-9].*", '', n)) for n in norma]) + next_num = numeros.pop() + 1 + response = JsonResponse({'numero': next_num, + 'ano': param['ano']}) else: response = JsonResponse( - {'numero': 1, 'ano': ano}) + {'numero': 1, 'ano': param['ano']}) return response diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 963e53019..333c3771e 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -340,7 +340,6 @@ def cronometro_painel(request): def get_cronometro_status(request, name): logger = logging.getLogger(__name__) username = request.user.username - try: logger.debug("user=" + username + ". Tentando obter cronometro.") cronometro = request.session[name] diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 36237d448..a15a4e305 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -136,7 +136,7 @@ class MandatoForm(ModelForm): existe_mandato = Mandato.objects.filter( parlamentar=data['parlamentar'], legislatura=data['legislatura']).exists() - if existe_mandato: + if existe_mandato and data['titular']: self.logger.error("Mandato nesta legislatura (parlamentar={}, legislatura={}) já existe." .format(data['parlamentar'], data['legislatura'])) raise ValidationError(_('Mandato nesta legislatura já existe.')) diff --git a/sapl/parlamentares/tests/test_parlamentares.py b/sapl/parlamentares/tests/test_parlamentares.py index bc404757d..0f8d6e24f 100644 --- a/sapl/parlamentares/tests/test_parlamentares.py +++ b/sapl/parlamentares/tests/test_parlamentares.py @@ -178,6 +178,7 @@ def test_mandato_form_duplicado(): 'legislatura': str(legislatura.pk), 'data_expedicao_diploma': '01/07/2015', 'data_inicio_mandato': legislatura.data_inicio, + 'titular':True, }) assert not form.is_valid() diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 9e6fc1d17..f9a37b373 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -498,7 +498,7 @@ class ParlamentarCrud(Crud): if legislatura_id >= 0: return queryset.filter( mandato__legislatura_id=legislatura_id).annotate( - mandato_titular=F('mandato__titular')) + mandato_titular=F('mandato__titular')).distinct() else: try: self.logger.debug("user=" + username + ". Tentando obter o mais recente registro do objeto Legislatura.") diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py index 15a4147d6..24cd5ed4a 100755 --- a/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py +++ b/sapl/relatorios/templates/pdf_pauta_sessao_gerar.py @@ -124,10 +124,10 @@ def expediente_materia(lst_expediente_materia): for expediente_materia in lst_expediente_materia: tmp += '' + str(expediente_materia['num_ordem']) + ' - ' + \ expediente_materia["tipo_materia"] + ' No. ' + \ - expediente_materia['id_materia'] + '\n' + 'Autor: ' + \ + expediente_materia['id_materia'] + '\n' + '' + expediente_materia['num_autores'] + ': ' + \ expediente_materia['nom_autor'] + '\n' txt_ementa = expediente_materia['txt_ementa'].replace('&', '&') - tmp += '' + txt_ementa + '\n' + tmp += '' + txt_ementa + '' + '' + expediente_materia['ordem_observacao'] + '\n' tmp += '' + \ str(expediente_materia['des_situacao']) + '\n' @@ -151,10 +151,10 @@ def votacao(lst_votacao): votacao["tipo_materia"] + ' No. ' + \ str(votacao['id_materia']) + '\n' + 'Processo: ' + \ str(votacao['des_numeracao']) + '\n' + 'Turno: ' + \ - str(votacao['des_turno']) + '\n' + 'Autor: ' + \ + str(votacao['des_turno']) + '\n' + ''+votacao['num_autores']+': ' + \ str(votacao['nom_autor']) + '\n' - tmp += '' + \ - str(votacao['txt_ementa']) + '\n' + txt_ementa = votacao['txt_ementa'].replace('&', '&') + tmp += '' + txt_ementa + '' + '' + votacao['ordem_observacao'] + '\n' tmp += '' + \ str(votacao['des_situacao']) + '\n' @@ -162,7 +162,7 @@ def votacao(lst_votacao): return tmp -def principal(cabecalho_dic, rodape_dic, sessao, imagem, inf_basicas_dic, lst_expediente_materia, lst_votacao): +def principal(rodape_dic, imagem, inf_basicas_dic, lst_expediente_materia, lst_votacao): """ """ diff --git a/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py b/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py index 914f77a7b..67f0c774b 100755 --- a/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py +++ b/sapl/relatorios/templates/pdf_pauta_sessao_preparar_pysc.py @@ -121,6 +121,7 @@ if context.REQUEST['data'] != '': autoria = autoria[0] autor = context.zsql.autor_obter_zsql( cod_autor=autoria.cod_autor) + if len(autor) > 0: autor = autor[0] diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index bdbce554e..3a3512764 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -120,8 +120,6 @@ def inf_basicas(inf_basicas_dic): tmp += '\t\tAbertura: ' + \ dat_inicio_sessao + ' - ' + hr_inicio_sessao + '\n' - data_fim_sessao = dat_fim_sessao + ' - ' if dat_fim_sessao else '' - tmp += '\t\tEncerramento: ' + \ dat_fim_sessao + ' - ' + hr_fim_sessao + '\n' @@ -144,7 +142,7 @@ def mesa(lst_mesa): return tmp -def presenca(lst_presenca_sessao): +def presenca(lst_presenca_sessao,lst_ausencia_sessao): """ """ @@ -157,6 +155,19 @@ def presenca(lst_presenca_sessao): tmp += '\t\t' + \ str(presenca['nom_parlamentar']) + '/' + \ str(presenca['sgl_partido']) + '\n' + + tmp += '\t\tJustificativas de Ausência da Sessão\n' + tmp += '\t\t\n' + tmp += '\t\t\t
\n' + tmp += '\t\t
\n' + tmp += '\n' + tmp += 'ParlamentarJustificativaAusente em\n' + for ausencia in lst_ausencia_sessao: + tmp += '' + \ + str(ausencia['parlamentar']) + ' ' + \ + str(ausencia['justificativa']) + '' + \ + str(ausencia['tipo']) + '\n' + tmp += '' return tmp @@ -169,7 +180,7 @@ def expedientes(lst_expedientes): tmp += '\t\t\n' tmp += '\t\t\t \n' tmp += '\t\t\n' - for idx, expediente in enumerate(lst_expedientes): + for expediente in lst_expedientes: tmp += '\t\t' + '
' + \ expediente['nom_expediente'] + ':
\n' + \ '' + \ @@ -191,10 +202,10 @@ def expediente_materia(lst_expediente_materia): tmp += '\n' tmp += 'MatériaEmentaResultado da Votação\n' for expediente_materia in lst_expediente_materia: - tmp += '' + str(expediente_materia['num_ordem']) + ' - ' + expediente_materia['id_materia'] + '\n' + 'Turno: ' + str(expediente_materia[ - 'des_turno']) + '\n' + 'Autor: ' + str(expediente_materia['nom_autor']) + '\n' + 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('&', '&') - tmp += '' + txt_ementa + '\n' + tmp += '' + txt_ementa + '' + '' + expediente_materia['ordem_observacao'] + '\n' tmp += '' + \ str(expediente_materia['nom_resultado']) + \ '\n' + '' @@ -254,8 +265,8 @@ def votacao(lst_votacao): tmp += '\n' tmp += 'MatériaEmentaResultado da Votação\n' for votacao in lst_votacao: - tmp += '' + str(votacao['num_ordem']) + ' - ' + votacao['id_materia'] + '\n' + 'Turno: ' + str(votacao[ - 'des_turno']) + '\n' + 'Autor: ' + str(votacao['nom_autor']) + '\n' + 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('&', '&') tmp += '' + txt_ementa + '' + '' + votacao['ordem_observacao'] + '\n' tmp += '' + \ @@ -296,7 +307,7 @@ def ocorrencias(lst_ocorrencias): tmp += '\t\t\n' tmp += '\t\t\t \n' tmp += '\t\t\n' - for idx, ocorrencia in enumerate(lst_ocorrencias): + for ocorrencia in lst_ocorrencias: tmp += '\t\t' + \ str(ocorrencia.conteudo) + '\n' tmp += '\t\t\n' @@ -305,7 +316,7 @@ def ocorrencias(lst_ocorrencias): return tmp -def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): +def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_oradores, lst_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf" @@ -331,7 +342,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me 'cont_mult': '', 'exp': expedientes(lst_expedientes), 'id_basica': inf_basicas(inf_basicas_dic), - 'lista_p': presenca(lst_presenca_sessao), + 'lista_p': presenca(lst_presenca_sessao,lst_ausencia_sessao), 'lista_p_o_d': presenca_ordem_dia(lst_presenca_ordem_dia), 'mat_exp': expediente_materia(lst_expediente_materia), 'mat_o_d': votacao(lst_votacao), @@ -357,7 +368,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me else: tmp += inf_basicas(inf_basicas_dic) tmp += mesa(lst_mesa) - tmp += presenca(lst_presenca_sessao) + tmp += presenca(lst_presenca_sessao,lst_ausencia_sessao) tmp += expedientes(lst_expedientes) tmp += expediente_materia(lst_expediente_materia) tmp += oradores_expediente(lst_oradores_expediente) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 4fb4785dd..0c5dfd377 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -16,11 +16,12 @@ from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, TramitacaoAdministrativo) from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, - IntegranteMesa, Orador, OradorExpediente, + IntegranteMesa, JustificativaAusencia, + Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao) from sapl.settings import STATIC_ROOT -from sapl.utils import LISTA_DE_UFS, ExtraiTag, TrocaTag, filiacao_data +from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, @@ -538,6 +539,20 @@ def get_sessao_plenaria(sessao, casa): dic_presenca['sgl_partido'] = partido_sigla lst_presenca_sessao.append(dic_presenca) + # Lista de ausencias na sessão + lst_ausencia_sessao = [] + ausencia = JustificativaAusencia.objects.filter( + sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar') + for ausente in ausencia: + dic_ausencia = {} + dic_ausencia['parlamentar'] = ausente.parlamentar + dic_ausencia['justificativa'] = ausente.tipo_ausencia + if ausente.ausencia == 1: + dic_ausencia['tipo'] = 'Matéria' + else: + dic_ausencia['tipo'] = 'Sessão' + + lst_ausencia_sessao.append(dic_ausencia) # Exibe os Expedientes lst_expedientes = [] @@ -572,9 +587,7 @@ def get_sessao_plenaria(sessao, casa): for expediente_materia in ExpedienteMateria.objects.filter( sessao_plenaria=sessao): # seleciona os detalhes de uma matéria - materia = MateriaLegislativa.objects.filter( - id=expediente_materia.materia.id).first() - + materia = expediente_materia.materia dic_expediente_materia = {} dic_expediente_materia["num_ordem"] = expediente_materia.numero_ordem dic_expediente_materia["id_materia"] = (materia.tipo.sigla + ' ' + @@ -585,40 +598,27 @@ def get_sessao_plenaria(sessao, casa): numeracao = Numeracao.objects.filter( materia=expediente_materia.materia).first() - if numeracao is not None: + if numeracao: dic_expediente_materia["des_numeracao"] = ( str(numeracao.numero_materia) + '/' + str( numeracao.ano_materia)) - turno, _ = get_turno(dic_expediente_materia, materia, sessao.data_inicio) + turno, _ = get_turno(materia) dic_expediente_materia["des_turno"] = turno - dic_expediente_materia["txt_ementa"] = str(materia.ementa) dic_expediente_materia["ordem_observacao"] = expediente_materia.observacao - dic_expediente_materia["nom_autor"] = ' ' dic_expediente_materia["nom_resultado"] = '' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_expediente_materia["nom_autor"] = str( - parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter(id=autor.comissao.id) - dic_expediente_materia["nom_autor"] = str(comissao) - else: - dic_expediente_materia["nom_autor"] = str(autor.nome) - elif autoria is None: + dic_expediente_materia["nom_autor"] = '' + autoria = materia.autoria_set.all() + dic_expediente_materia['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor' + if autoria: + for a in autoria: + if a.autor.nome: + dic_expediente_materia['nom_autor'] += a.autor.nome + ', ' + dic_expediente_materia['nom_autor'] = dic_expediente_materia['nom_autor'][:-2] + else: dic_expediente_materia["nom_autor"] = 'Desconhecido' dic_expediente_materia["votacao_observacao"] = ' ' @@ -674,9 +674,7 @@ def get_sessao_plenaria(sessao, casa): for votacao in OrdemDia.objects.filter( sessao_plenaria=sessao): # seleciona os detalhes de uma matéria - materia = MateriaLegislativa.objects.filter( - id=votacao.materia.id).first() - + materia = votacao.materia dic_votacao = {} dic_votacao["nom_resultado"] = '' dic_votacao["num_ordem"] = votacao.numero_ordem @@ -687,15 +685,15 @@ def get_sessao_plenaria(sessao, casa): str(materia.ano)) dic_votacao["des_numeracao"] = ' ' - numeracao = Numeracao.objects.filter( - materia=votacao.materia).first() - if numeracao is not None: + numeracao = materia.numeracao_set.first() + if numeracao: + dic_votacao["des_numeracao"] = ( str(numeracao.numero_materia) + '/' + str(numeracao.ano_materia)) - turno, _ = get_turno(dic_votacao, materia, sessao.data_inicio) + turno, _ = get_turno(materia) dic_votacao["des_turno"] = turno @@ -703,26 +701,15 @@ def get_sessao_plenaria(sessao, casa): dic_votacao["txt_ementa"] = html.unescape(materia.ementa) dic_votacao["ordem_observacao"] = html.unescape(votacao.observacao) - dic_votacao["nom_autor"] = ' ' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_votacao["nom_autor"] = str(parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter( - id=autor.comissao.id) - dic_votacao["nom_autor"] = str(comissao) - else: - dic_votacao["nom_autor"] = str(autor.nome) - elif autoria is None: + dic_votacao["nom_autor"] = '' + autoria = materia.autoria_set.all() + dic_votacao['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor' + if autoria: + for a in autoria: + if a.autor.nome: + dic_votacao['nom_autor'] += a.autor.nome + ', ' + dic_votacao['nom_autor'] = dic_votacao['nom_autor'][:-2] + else: dic_votacao["nom_autor"] = 'Desconhecido' dic_votacao["votacao_observacao"] = ' ' @@ -779,6 +766,7 @@ def get_sessao_plenaria(sessao, casa): return (inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, @@ -788,20 +776,19 @@ def get_sessao_plenaria(sessao, casa): lst_ocorrencias) -def get_turno(dic, materia, sessao_data_inicio): - descricao_turno = ' ' - descricao_tramitacao = ' ' - tramitacao = None - if tramitacao is None: - tramitacao = materia.tramitacao_set.last() +def get_turno(materia): + descricao_turno = '' + descricao_tramitacao = '' + tramitacao = materia.tramitacao_set.last() - if tramitacao is not None: - for t in Tramitacao.TURNO_CHOICES: - if t[0] == tramitacao.turno: - descricao_turno = t[1] - break + if tramitacao: + if tramitacao.turno: + for t in Tramitacao.TURNO_CHOICES: + if t[0] == tramitacao.turno: + descricao_turno = str(t[1]) + break descricao_tramitacao = tramitacao.status.descricao if tramitacao.status else 'Não informada' - return (descricao_turno, descricao_tramitacao) + return descricao_turno, descricao_tramitacao def relatorio_sessao_plenaria(request, pk): @@ -819,7 +806,6 @@ def relatorio_sessao_plenaria(request, pk): if not casa: raise Http404 - cabecalho = get_cabecalho(casa) rodape = get_rodape(casa) imagem = get_imagem(casa) @@ -833,6 +819,7 @@ def relatorio_sessao_plenaria(request, pk): (inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, @@ -849,13 +836,12 @@ def relatorio_sessao_plenaria(request, pk): lst_expedientes[idx]['txt_expediente'] = txt_expedientes pdf = pdf_sessao_plenaria_gerar.principal( - cabecalho, rodape, imagem, - None, inf_basicas_dic, lst_mesa, lst_presenca_sessao, + lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_oradores_expediente, @@ -1048,7 +1034,6 @@ def relatorio_pauta_sessao(request, pk): casa = CasaLegislativa.objects.first() - cabecalho = get_cabecalho(casa) rodape = get_rodape(casa) imagem = get_imagem(casa) @@ -1056,9 +1041,7 @@ def relatorio_pauta_sessao(request, pk): lst_expediente_materia, lst_votacao, inf_basicas_dic = get_pauta_sessao( sessao, casa) - pdf = pdf_pauta_sessao_gerar.principal(cabecalho, - rodape, - sessao, + pdf = pdf_pauta_sessao_gerar.principal(rodape, imagem, inf_basicas_dic, lst_expediente_materia, @@ -1083,8 +1066,7 @@ def get_pauta_sessao(sessao, casa): inf_basicas_dic["nom_camara"] = casa.nome lst_expediente_materia = [] - for expediente_materia in ExpedienteMateria.objects.filter( - data_ordem=sessao.data_inicio, sessao_plenaria=sessao): + for expediente_materia in ExpedienteMateria.objects.filter(sessao_plenaria=sessao): materia = MateriaLegislativa.objects.filter( id=expediente_materia.materia.id).first() @@ -1102,34 +1084,22 @@ def get_pauta_sessao(sessao, casa): dic_expediente_materia["des_numeracao"] = ' ' numeracao = Numeracao.objects.filter(materia=materia) - if numeracao is not None: + if numeracao: numeracao = numeracao.first() dic_expediente_materia["des_numeracao"] = str(numeracao) - dic_expediente_materia["nom_autor"] = ' ' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_expediente_materia["nom_autor"] = str( - parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter(id=autor.comissao.id) - dic_expediente_materia["nom_autor"] = str(comissao) - else: - dic_expediente_materia["nom_autor"] = str(autor.nome) - elif autoria is None: + dic_expediente_materia["nom_autor"] = '' + autoria = materia.autoria_set.all() + dic_expediente_materia['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor' + if autoria: + for a in autoria: + if a.autor.nome: + dic_expediente_materia['nom_autor'] += a.autor.nome + ', ' + dic_expediente_materia['nom_autor'] = dic_expediente_materia['nom_autor'][:-2] + else: dic_expediente_materia["nom_autor"] = 'Desconhecido' - turno, tramitacao = get_turno(dic_expediente_materia, materia, sessao.data_inicio) + turno, tramitacao = get_turno(materia) dic_expediente_materia["des_turno"] = turno dic_expediente_materia["des_situacao"] = tramitacao @@ -1156,30 +1126,19 @@ def get_pauta_sessao(sessao, casa): dic_votacao["des_numeracao"] = str( numeracao.numero_materia) + '/' + str(numeracao.ano_materia) - turno, tramitacao = get_turno(dic_votacao, materia, sessao.data_inicio) + turno, tramitacao = get_turno(materia) dic_votacao["des_turno"] = turno dic_votacao["des_situacao"] = tramitacao - dic_votacao["nom_autor"] = ' ' - autoria = Autoria.objects.filter( - materia=materia, primeiro_autor=True).first() - - if autoria is not None: - autor = Autor.objects.filter(id=autoria.autor.id) - if autor is not None: - autor = autor.first() - - if autor.tipo == 'Parlamentar': - parlamentar = Parlamentar.objects.filter( - id=autor.parlamentar.id) - dic_votacao["nom_autor"] = str(parlamentar.nome_completo) - elif autor.tipo == 'Comissao': - comissao = Comissao.objects.filter( - id=autor.comissao.id) - dic_votacao["nom_autor"] = str(comissao) - else: - dic_votacao["nom_autor"] = str(autor.nome) - elif autoria is None: + dic_votacao["nom_autor"] = '' + autoria = materia.autoria_set.all() + dic_votacao['num_autores'] = 'Autores' if len(autoria) > 1 else 'Autor' + if autoria: + for a in autoria: + if a.autor.nome: + dic_votacao['nom_autor'] += a.autor.nome + ', ' + dic_votacao['nom_autor'] = dic_votacao['nom_autor'][:-2] + else: dic_votacao["nom_autor"] = 'Desconhecido' lst_votacao.append(dic_votacao) diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 2b6204ec2..aa691da5e 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -172,6 +172,7 @@ rules_group_sessao = { (sessao.RegistroVotacao, __base__), (sessao.VotoParlamentar, __base__), (sessao.JustificativaAusencia, __base__), + (sessao.RetiradaPauta, __base__) ] } @@ -269,6 +270,7 @@ rules_group_geral = { (sessao.JustificativaAusencia, __base__), (sessao.Bloco, __base__), (sessao.ResumoOrdenacao, __base__), + (sessao.TipoRetiradaPauta, __base__), (lexml.LexmlProvedor, __base__), (lexml.LexmlPublicador, __base__), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index f22eeee28..3020d93b2 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -27,7 +27,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, Orador, OradorExpediente, OrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoJustificativa, TipoResultadoVotacao, - OcorrenciaSessao, RegistroVotacao) + OcorrenciaSessao, RegistroVotacao, RetiradaPauta, TipoRetiradaPauta) def recupera_anos(): @@ -191,6 +191,100 @@ class SessaoPlenariaForm(ModelForm): return self.cleaned_data +class RetiradaPautaForm(ModelForm): + + tipo_de_retirada = forms.ModelChoiceField(required=True, + empty_label='------------', + queryset=TipoRetiradaPauta.objects.all()) + expediente = forms.ModelChoiceField(required=False, + label='Matéria do Expediente', + queryset=ExpedienteMateria.objects.all()) + ordem = forms.ModelChoiceField(required=False, + label='Matéria da Ordem do Dia', + queryset=OrdemDia.objects.all()) + materia = forms.ModelChoiceField(required=False, + widget=forms.HiddenInput(), + queryset=MateriaLegislativa.objects.all()) + + class Meta: + model = RetiradaPauta + fields = ['ordem', + 'expediente', + 'parlamentar', + 'tipo_de_retirada', + 'data', + 'observacao', + 'materia'] + + def __init__(self, *args, **kwargs): + + row1 = to_row([('tipo_de_retirada', 5), + ('parlamentar', 4), + ('data', 3)]) + row2 = to_row([('ordem', 6), + ('expediente', 6)]) + row3 = to_row([('observacao',12)]) + + self.helper = FormHelper() + self.helper.layout = SaplFormLayout( + Fieldset(_('Retirada de Pauta'), + row1, row2, row3)) + + q = Q(sessao_plenaria=kwargs['initial']['sessao_plenaria']) + ordens = OrdemDia.objects.filter(q) + expedientes = ExpedienteMateria.objects.filter(q) + retiradas_ordem = [r.ordem for r in RetiradaPauta.objects.filter(q, ordem__in=ordens)] + retiradas_expediente = [r.expediente for r in RetiradaPauta.objects.filter(q, expediente__in=expedientes)] + setOrdem = set(ordens) - set(retiradas_ordem) + setExpediente = set(expedientes) - set(retiradas_expediente) + + super(RetiradaPautaForm, self).__init__( + *args, **kwargs) + + if self.instance.pk: + setOrdem = set(ordens) + setExpediente = set(expedientes) + + presencas = SessaoPlenariaPresenca.objects.filter( + q).order_by('parlamentar__nome_parlamentar') + presentes = [p.parlamentar for p in presencas] + + self.fields['expediente'].choices = [ + (None, "------------")] + [(e.id, e.materia) for e in setExpediente] + self.fields['ordem'].choices = [ + (None, "------------")] + [(o.id, o.materia) for o in setOrdem] + self.fields['parlamentar'].choices = [ + (None, "------------")] + [(p.id, p) for p in presentes] + + def clean(self): + + super(RetiradaPautaForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + sessao_plenaria = self.instance.sessao_plenaria + if self.cleaned_data['data'] < sessao_plenaria.data_inicio: + raise ValidationError(_("Data de retirada de pauta anterior à abertura da Sessão.")) + if sessao_plenaria.data_fim and self.cleaned_data['data'] > sessao_plenaria.data_fim: + raise ValidationError(_("Data de retirada de pauta posterior ao encerramento da Sessão.")) + + if self.cleaned_data['ordem'] and self.cleaned_data['ordem'].registrovotacao_set.exists(): + raise ValidationError(_("Essa matéria já foi votada, portanto não pode ser retirada de pauta.")) + elif self.cleaned_data['expediente'] and self.cleaned_data['expediente'].registrovotacao_set.exists(): + raise ValidationError(_("Essa matéria já foi votada, portanto não pode ser retirada de pauta.")) + + return self.cleaned_data + + def save(self, commit=False): + retirada = super(RetiradaPautaForm, self).save(commit=False) + if retirada.ordem: + retirada.materia = retirada.ordem.materia + elif retirada.expediente: + retirada.materia = retirada.expediente.materia + retirada.save() + return retirada + class BancadaForm(ModelForm): class Meta: diff --git a/sapl/sessao/migrations/0028_auto_20181031_0902.py b/sapl/sessao/migrations/0028_auto_20181031_0902.py new file mode 100644 index 000000000..3ff3c0dc5 --- /dev/null +++ b/sapl/sessao/migrations/0028_auto_20181031_0902.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-10-31 12:02 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0032_auto_20181022_1743'), + ('parlamentares', '0025_auto_20180924_1724'), + ('sessao', '0029_auto_20181024_0952'), + ] + + operations = [ + migrations.CreateModel( + name='RetiradaPauta', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('observacao', models.TextField(blank=True, verbose_name='Observações')), + ('expediente', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.ExpedienteMateria')), + ('materia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa')), + ('ordem', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.OrdemDia')), + ('parlamentar', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Requerente')), + ], + options={ + 'verbose_name_plural': 'Retirada de Pauta', + 'verbose_name': 'Retirada de Pauta', + }, + ), + migrations.CreateModel( + name='TipoRetiradaPauta', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('descricao', models.CharField(max_length=150, verbose_name='Descrição')), + ], + options={ + 'verbose_name_plural': 'Tipos de Retirada de Pauta', + 'verbose_name': 'Tipo de Retidara de Pauta', + 'ordering': ['descricao'], + }, + ), + migrations.AddField( + model_name='retiradapauta', + name='tipo_de_retirada', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sessao.TipoRetiradaPauta', verbose_name='Motivo de Retirada de Pauta'), + ), + ] diff --git a/sapl/sessao/migrations/0030_auto_20181113_1149.py b/sapl/sessao/migrations/0030_auto_20181113_1149.py new file mode 100644 index 000000000..6b7c3a237 --- /dev/null +++ b/sapl/sessao/migrations/0030_auto_20181113_1149.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-13 13:49 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0028_auto_20181031_0902'), + ] + + operations = [ + migrations.AddField( + model_name='retiradapauta', + name='data', + field=models.DateField(default=django.utils.timezone.now, verbose_name='Data'), + ), + migrations.AddField( + model_name='retiradapauta', + name='sessao_plenaria', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria', verbose_name='Sessão Plenária'), + ), + ] diff --git a/sapl/sessao/migrations/0031_auto_20181116_1849.py b/sapl/sessao/migrations/0031_auto_20181116_1849.py new file mode 100644 index 000000000..61ea74b9f --- /dev/null +++ b/sapl/sessao/migrations/0031_auto_20181116_1849.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-16 20:49 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0030_auto_20181113_1149'), + ] + + operations = [ + migrations.AlterField( + model_name='retiradapauta', + name='materia', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='materia.MateriaLegislativa', verbose_name='Matéria'), + ), + ] diff --git a/sapl/sessao/migrations/0032_merge_20181122_1527.py b/sapl/sessao/migrations/0032_merge_20181122_1527.py new file mode 100644 index 000000000..9a74abe95 --- /dev/null +++ b/sapl/sessao/migrations/0032_merge_20181122_1527.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.8 on 2018-11-22 17:27 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0031_auto_20181116_1849'), + ('sessao', '0031_auto_20181119_1103'), + ] + + operations = [ + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 6f07d9645..8cc162a05 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -2,6 +2,7 @@ from operator import xor from django.core.exceptions import ValidationError 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 @@ -584,6 +585,18 @@ class ResumoOrdenacao(models.Model): def __str__(self): return 'Ordenação do Resumo de uma Sessão' +@reversion.register() +class TipoRetiradaPauta(models.Model): + descricao = models.CharField(max_length=150, verbose_name=_('Descrição')) + + class Meta: + verbose_name = _('Tipo de Retidara de Pauta') + verbose_name_plural = _('Tipos de Retirada de Pauta') + ordering = ['descricao'] + + def __str__(self): + return self.descricao + @reversion.register() class TipoJustificativa(models.Model): @@ -662,3 +675,55 @@ class JustificativaAusencia(models.Model): force_update=force_update, using=using, update_fields=update_fields) + +class RetiradaPauta(models.Model): + materia = models.ForeignKey(MateriaLegislativa, + on_delete=models.CASCADE, + verbose_name=_('Matéria')) + sessao_plenaria = models.ForeignKey(SessaoPlenaria, + on_delete=models.CASCADE, + verbose_name=_('Sessão Plenária'), + blank=True, + null=True) + ordem = models.ForeignKey(OrdemDia, + blank=True, + null=True, + on_delete=models.CASCADE) + expediente = models.ForeignKey(ExpedienteMateria, + blank=True, + null=True, + on_delete=models.CASCADE) + data = models.DateField(verbose_name=_('Data'), + default=timezone.now) + observacao = models.TextField(blank=True, + verbose_name=_('Observações')) + parlamentar = models.ForeignKey(Parlamentar, + on_delete=models.PROTECT, + verbose_name=_('Requerente'), + blank=True, + null=True) + tipo_de_retirada = models.ForeignKey(TipoRetiradaPauta, + on_delete=models.PROTECT, + verbose_name=_('Motivo de Retirada de Pauta')) + + class Meta: + verbose_name = _('Retirada de Pauta') + verbose_name_plural = _('Retirada de Pauta') + + def __str__(self): + return _('Ordem: %(ordem)s - Requerente: %(requerente)s - ' + 'Matéria: %(materia)s') % { + 'ordem': self.ordem, + 'requerente': self.parlamentar, + 'materia': self.materia} + + def clean(self): + """Exatamente um dos campos ordem ou expediente deve estar preenchido. + """ + # TODO remover esse método quando OrdemDia e ExpedienteMateria + # forem reestruturados e os campos ordem e expediente forem unificados + if not xor(bool(self.ordem), bool(self.expediente)): + raise ValidationError( + 'ReritadaPauta deve ter exatamente um dos campos ' + 'ordem ou expediente preenchido. Ambos estão preenchidos: ' + '{}, {}'. format(self.ordem, self.expediente)) diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index 725c0c13f..9bcb414b6 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -10,8 +10,9 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, PesquisarPautaSessaoView, PesquisarSessaoPlenariaView, PresencaOrdemDiaView, PresencaView, - ResumoOrdenacaoView, ResumoView, ResumoAtaView, SessaoCrud, + ResumoOrdenacaoView, ResumoView, ResumoAtaView, RetiradaPautaCrud, SessaoCrud, TipoJustificativaCrud, TipoExpedienteCrud, TipoResultadoVotacaoCrud, + TipoExpedienteCrud, TipoResultadoVotacaoCrud,TipoRetiradaPautaCrud, TipoSessaoCrud, VotacaoEditView, VotacaoExpedienteEditView, VotacaoExpedienteView, VotacaoNominalEditView, @@ -41,7 +42,7 @@ urlpatterns = [ OradorExpedienteCrud.get_urls() + ExpedienteMateriaCrud.get_urls() + JustificativaAusenciaCrud.get_urls() + - MateriaOrdemDiaCrud.get_urls())), + MateriaOrdemDiaCrud.get_urls() + RetiradaPautaCrud.get_urls())), url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'), @@ -78,6 +79,8 @@ urlpatterns = [ include(TipoExpedienteCrud.get_urls())), url(r'^sistema/sessao-plenaria/tipo-justificativa/', include(TipoJustificativaCrud.get_urls())), + url(r'^sistema/sessao-plenaria/tipo-retirada-pauta/', + include(TipoRetiradaPautaCrud.get_urls())), url(r'^sistema/bancada/', include(BancadaCrud.get_urls())), url(r'^sistema/bloco/', @@ -173,5 +176,5 @@ urlpatterns = [ name='votacao_simbolica_transparencia'), url(r'^sessao/mudar-ordem-materia-sessao/', mudar_ordem_materia_sessao, - name='mudar_ordem_materia_sessao'), + name='mudar_ordem_materia_sessao'), ] diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 2b47b236d..ecaf52712 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -43,24 +43,22 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm) -from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, - ExpedienteSessao, JustificativaAusencia, OcorrenciaSessao, IntegranteMesa, + VotacaoNominalForm, RetiradaPautaForm) +from .models import (Bancada, Bloco, CargoBancada, CargoMesa, + ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, - TipoJustificativa, TipoResultadoVotacao, TipoSessaoPlenaria, - VotoParlamentar) + TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, + RetiradaPauta, TipoJustificativa, JustificativaAusencia) 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') def reordernar_materias_expediente(request, pk): @@ -197,7 +195,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): '-data_tramitacao' ).first() turno = ' ' - if tramitacao is not None: + if tramitacao: for t in Tramitacao.TURNO_CHOICES: if t[0] == tramitacao.turno: turno = t[1] @@ -221,7 +219,9 @@ def customize_link_materia(context, pk, has_permission, is_expediente): exist_resultado = obj.registrovotacao_set.filter( materia=obj.materia).exists() - if not exist_resultado: + exist_retirada = obj.retiradapauta_set.filter( + materia=obj.materia).exists() + if not exist_resultado and not exist_retirada: if obj.votacao_aberta: url = '' if is_expediente: @@ -294,6 +294,19 @@ def customize_link_materia(context, pk, has_permission, is_expediente): resultado = btn_abrir else: resultado = '''Não há resultado''' + + elif exist_retirada: + retirada = obj.retiradapauta_set.filter( + materia_id=obj.materia_id).last() + retirada_descricao = retirada.tipo_de_retirada.descricao + retirada_observacao = retirada.observacao + url = reverse('sapl.sessao:retiradapauta_detail', + kwargs={'pk': retirada.id}) + resultado = ('%s
%s
' % + (url, + retirada_descricao, + retirada_observacao)) + else: resultado = obj.registrovotacao_set.filter( materia_id=obj.materia_id).last() @@ -833,18 +846,11 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): messages.add_message(self.request, messages.ERROR, msg) else: - m, s, x = cronometro_discurso.isoformat().split(':') - cronometro_discurso = int(m) * 60 + int(s) - - m, s, x = cronometro_aparte.isoformat().split(':') - cronometro_aparte = int(m) * 60 + int(s) - - m, s, x = cronometro_ordem.isoformat().split(':') - cronometro_ordem = int(m) * 60 + int(s) - - m, s, x = cronometro_consideracoes.isoformat().split(':') - cronometro_consideracoes = int(m) * 60 + int(s) - + cronometro_discurso = cronometro_discurso.seconds + 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')), @@ -1335,8 +1341,13 @@ class ResumoView(DetailView): ).order_by('parlamentar__nome_parlamentar') parlamentares_sessao = [p.parlamentar for p in presencas] - - context.update({'presenca_sessao': parlamentares_sessao}) + + ausentes_sessao = JustificativaAusencia.objects.filter( + sessao_plenaria_id=self.object.id + ).order_by('parlamentar__nome_parlamentar') + + context.update({'presenca_sessao': parlamentares_sessao, + 'justificativa_ausencia': ausentes_sessao}) # ===================================================================== @@ -1370,10 +1381,13 @@ class ResumoView(DetailView): turno = get_turno(tramitacao.turno) rv = m.registrovotacao_set.first() + rp = m.retiradapauta_set.filter(materia=m.materia).first() if rv: resultado = rv.tipo_resultado_votacao.nome resultado_observacao = rv.observacao - + elif rp: + resultado = rp.tipo_de_retirada.descricao + resultado_observacao = rp.observacao else: resultado = _('Matéria não votada') resultado_observacao = _(' ') @@ -1461,9 +1475,13 @@ class ResumoView(DetailView): # Verificar resultado rv = o.registrovotacao_set.filter(materia=o.materia).first() + rp = o.retiradapauta_set.filter(materia=o.materia).first() if rv: resultado = rv.tipo_resultado_votacao.nome resultado_observacao = rv.observacao + elif rp: + resultado = rp.tipo_de_retirada.descricao + resultado_observacao = rp.observacao else: resultado = _('Matéria não votada') resultado_observacao = _(' ') @@ -3099,7 +3117,7 @@ def mudar_ordem_materia_sessao(request): elif materia == 'ordem': materia = OrdemDia else: - return + return JsonResponse({}, safe=False) # Testa se existe alguma matéria na posição recebida try: @@ -3138,7 +3156,7 @@ def mudar_ordem_materia_sessao(request): materia_1.numero_ordem = posicao_final materia_1.save() - return + return JsonResponse({}, safe=False) class JustificativaAusenciaCrud(MasterDetailCrud): @@ -3675,4 +3693,38 @@ class VotacaoEmBlocoNominalView(TemplateView): 'form': form, 'origem': self.request.POST['origem']}) - return self.render_to_response(context) \ No newline at end of file + 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'] + + class ListView(MasterDetailCrud.ListView): + paginate_by = 10 + + class CreateView(MasterDetailCrud.CreateView): + form_class = RetiradaPautaForm + layout_key = None + + def get_initial(self): + sessao_plenaria = SessaoPlenaria.objects.get(id=self.kwargs['pk']) + return {'sessao_plenaria': sessao_plenaria} + + def get_success_url(self): + return reverse('sapl.sessao:retiradapauta_list', + kwargs={'pk': self.kwargs['pk']}) + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = RetiradaPautaForm + layout_key = None + + def get_initial(self): + sessao_plenaria = RetiradaPauta.objects.get(id=self.kwargs['pk']).sessao_plenaria + return {'sessao_plenaria': sessao_plenaria} + + class DeleteView(MasterDetailCrud.DeleteView): + pass diff --git a/sapl/static/js/app.js b/sapl/static/js/app.js index cc9c773ce..4341cb784 100644 --- a/sapl/static/js/app.js +++ b/sapl/static/js/app.js @@ -47,7 +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"}); - $('.cronometro').mask("00:00", {placeholder:"mm:ss"}); + $('.cronometro').mask("00:00:00", {placeholder:"hh:mm:ss"}); } function autorModal() { 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/base.html b/sapl/templates/base.html index 2ff5fdea4..d2f4cca33 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.134 + Release: 3.1.137

diff --git a/sapl/templates/materia/proposicao_detail.html b/sapl/templates/materia/proposicao_detail.html index 9ab80ab62..2a34305b0 100644 --- a/sapl/templates/materia/proposicao_detail.html +++ b/sapl/templates/materia/proposicao_detail.html @@ -158,11 +158,12 @@
Texto Original
-      + {% if object.materia_de_vinculo.texto_original %} {{object.materia_de_vinculo.texto_original| to_str | split:"/" | get_last_item_from_list:-1}} -
+ {% endif %} +
diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index 65ea6fd6f..6c8734805 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/sapl/templates/menu_tabelas_auxiliares.yaml @@ -152,6 +152,9 @@ - title: {% trans 'Tipo de Expediente' %} url: sapl.sessao:tipoexpediente_list css_class: btn btn-link + - title: {% trans 'Tipo de Retirada de Pauta' %} + url: sapl.sessao:tiporetiradapauta_list + css_class: btn btn-link - title: {% trans 'Ordenação do Resumo' %} url: sapl.sessao:resumo_ordenacao css_class: btn btn-link diff --git a/sapl/templates/norma/layouts.yaml b/sapl/templates/norma/layouts.yaml index 295ef62d5..90be4172e 100644 --- a/sapl/templates/norma/layouts.yaml +++ b/sapl/templates/norma/layouts.yaml @@ -58,7 +58,7 @@ LegislacaoCitadaDetail: TipoVinculoNormaJuridica: {% trans 'Tipo de Vínculo entre Normas Jurídicas' %}: - - sigla:2 descricao_ativa descricao_passiva + - sigla:2 descricao_ativa descricao_passiva revoga_integralmente NormaRelacionada: {% trans 'Norma Relacionada' %}: @@ -73,4 +73,4 @@ NormaRelacionadaDetail: AutoriaNorma: {% trans 'Autoria' %}: - - autor primeiro_autor \ No newline at end of file + - autor primeiro_autor diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca.html b/sapl/templates/sessao/blocos_ata/lista_presenca.html index c6456f2c4..621a4783c 100644 --- a/sapl/templates/sessao/blocos_ata/lista_presenca.html +++ b/sapl/templates/sessao/blocos_ata/lista_presenca.html @@ -2,9 +2,15 @@

- Lista de Presença na Sessão: + Lista de Presença na Sessão: {% for p in presenca_sessao %} - {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ; + {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ; {% endfor %}

-
\ No newline at end of file +

+ Justificativas de Ausências na Sessão: + {% for j in justificativa_ausencia %} + {{j.parlamentar}} / {{ j.tipo_ausencia }} ; + {% endfor %} +

+ diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca.html b/sapl/templates/sessao/blocos_resumo/lista_presenca.html index 56ecf9c17..8f5ac10e2 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca.html @@ -7,4 +7,29 @@
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}
{% endfor %} - \ No newline at end of file +


+
+ Justificativas de Ausência na Sessão + + + + + + + + + + {% for j in justificativa_ausencia %} + + + + {% if j.ausencia == 1 %} + + {% else %} + + {% endif %} + {% endfor %} + +
ParlamentarJustificativaAusente em
{{ j.parlamentar }} {{ j.tipo_ausencia }} Matéria Sessão
+
+ diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 4e9e1118a..55e0db570 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -91,7 +91,7 @@ TipoJustificativa: JustificativaAusencia: {% trans 'Justificativa de Ausência' %}: - - parlamentar + - parlamentar - data hora - upload_anexo - tipo_ausencia @@ -99,3 +99,13 @@ JustificativaAusencia: - materias_do_expediente - materias_da_ordem_do_dia - observacao + +TipoRetiradaPauta: + {% trans 'Tipo Retirada Pauta'%}: + - descricao + +RetiradaPauta: + {% trans 'Retirada de Pauta' %}: + - tipo_de_retirada materia + - data parlamentar + - observacao diff --git a/sapl/templates/sessao/resumo_ata.html b/sapl/templates/sessao/resumo_ata.html index 528dda494..dd3b811f7 100644 --- a/sapl/templates/sessao/resumo_ata.html +++ b/sapl/templates/sessao/resumo_ata.html @@ -19,6 +19,6 @@ {% include 'sessao/blocos_ata/'|add:oitavo_ordenacao %} {% include 'sessao/blocos_ata/'|add:nono_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_ordenacao %} - {% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %} + {% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %} {% include 'sessao/blocos_ata/assinaturas.html' %} {% endblock detail_content %} diff --git a/sapl/templates/sessao/retiradapauta_form.html b/sapl/templates/sessao/retiradapauta_form.html new file mode 100644 index 000000000..9d850cad0 --- /dev/null +++ b/sapl/templates/sessao/retiradapauta_form.html @@ -0,0 +1,6 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% block detail_content %} + {% crispy form %} +{% endblock detail_content %} diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 442eb92f4..b86684e61 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -14,6 +14,8 @@ url: orador_list - title: {% trans 'Ocorrências da Sessão' %} url: ocorrencia_sessao + - title: {% trans 'Retirada de Pauta'%} + url: retiradapauta_list - title: {% trans 'Expedientes' %} children: diff --git a/sapl/templates/sistema.html b/sapl/templates/sistema.html index 2283266b8..8c1784038 100644 --- a/sapl/templates/sistema.html +++ b/sapl/templates/sistema.html @@ -104,6 +104,7 @@ + diff --git a/setup.py b/setup.py index 3e97d8bf1..daf572e62 100644 --- a/setup.py +++ b/setup.py @@ -52,7 +52,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.134', + version='3.1.137', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',