From 956e0898e2a749e269de93ab14119c4095b715a0 Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Wed, 19 Dec 2018 12:22:34 -0200 Subject: [PATCH] =?UTF-8?q?Fix=20#2099=20-=20Vota=C3=A7=C3=A3o=20em=20bloc?= =?UTF-8?q?o=20(#2416)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * votacao em bloco * votacao em bloco - em andamento * feita a tela de votacao em bloco * feita a tela de votacao em bloco * votacao em bloco- em andamento * inicio da nova tela da votacao em bloco - em andamento * inicio da nova tela da votacao em bloco - em andamento * Tela de votacao em bloco simbolica. Em progresso. * tela votacao em bloco exibindo as informacoes corretas * Check all incluso para seleção de ordens desejadas. * inicio da tela de votacao para votacao em bloco ordem dia * Alteracoes na votacao em bloco * adicionado salvamento da votacao * correcoes na votacao e no checkbox de marcar todos * adicionada votacao em bloco nominal no expediente * inicio da votacao nominal em bloco * Tela votacao em bloco. * votacao nominal em bloco * pequenas mudancas * inicio da correcao de alguns bugs, como formulario invalido * correcao de erro quando nao ha presentes * correcoes de erros * cancelar votacao simbolica * correcoes diversas e insercao dos menus * Menu adicionado * votacao em bloco * ajusta menu e lança erro se root_pk ou object estiver faltando no contexto * ajusta contexto para votação em bloco no expediente --- sapl/base/templatetags/menus.py | 58 +- sapl/materia/models.py | 1 + sapl/relatorios/views.py | 1 - sapl/sessao/forms.py | 126 +- sapl/sessao/urls.py | 18 +- sapl/sessao/views.py | 615 ++++++++- sapl/static/styles/app.css | 503 ++++++++ sapl/static/styles/compilacao.css | 1136 +++++++++++++++++ sapl/templates/auth/user_list.html | 3 +- sapl/templates/sessao/subnav.yaml | 4 + sapl/templates/sessao/votacao/nominal.html | 76 +- .../votacao/votacao_bloco_expediente.html | 173 +++ .../sessao/votacao/votacao_bloco_ordem.html | 174 +++ .../sessao/votacao/votacao_nominal_bloco.html | 149 +++ .../votacao/votacao_simbolica_bloco.html | 80 ++ 15 files changed, 3009 insertions(+), 108 deletions(-) create mode 100644 sapl/static/styles/app.css create mode 100644 sapl/static/styles/compilacao.css create mode 100644 sapl/templates/sessao/votacao/votacao_bloco_expediente.html create mode 100644 sapl/templates/sessao/votacao/votacao_bloco_ordem.html create mode 100644 sapl/templates/sessao/votacao/votacao_nominal_bloco.html create mode 100644 sapl/templates/sessao/votacao/votacao_simbolica_bloco.html diff --git a/sapl/base/templatetags/menus.py b/sapl/base/templatetags/menus.py index 289cd20e6..5b526002a 100644 --- a/sapl/base/templatetags/menus.py +++ b/sapl/base/templatetags/menus.py @@ -1,3 +1,5 @@ +import logging + from django import template from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ @@ -6,6 +8,8 @@ import yaml register = template.Library() +logger = logging.getLogger(__name__) + @register.inclusion_tag('menus/menu.html', takes_context=True) def menu(context, path=None): @@ -84,7 +88,7 @@ def nav_run(context, path=None): menu = yaml.load(rendered) resolve_urls_inplace(menu, root_pk, rm, context) except Exception as e: - print(_("""Erro na conversão do yaml %s. App: %s. + raise Exception(_("""Erro na conversão do yaml %s. App: %s. Erro: %s """) % ( @@ -113,25 +117,61 @@ def resolve_urls_inplace(menu, pk, rm, context): menu['url'] = '' menu['active'] = '' else: - if ':' in url_name: + if '/' in url_name: + pass + elif ':' in url_name: try: - menu['url'] = reverse('%s' % menu['url'], - kwargs={'pk': pk}) + menu['url'] = reverse('%s' % menu['url']) except: try: - menu['url'] = reverse('%s' % menu['url']) + menu['url'] = reverse('%s' % menu['url'], + kwargs={'pk': pk}) except: - pass + # tem que ser root_pk pois quando está sendo + # renderizado um detail, update, delete + # e ainda sim é necessário colocar o menu, + # nestes, casos o pk da url é do detail, e não + # do master, porém, os menus do subnav, apontam para + # outras áreas que as urls destas são construídas + # com pk do master, e não do detail... por isso + # no contexto deve ter, ou root_pk, ou object + # sendo que qualquer um dos dois,deverá ser o + # master. + # Estes detalhes são relevantes quando usa-se + # o menu isolado. Por outro lado, quando usado + # conjuntamente com o crud, este configura o contexto + # como se deve para o menus.py + log = """ + Erro na construção do Menu: + menu: {} + url: {} + 1) Verifique se a url existe + 2) Se existe no contexto um desses itens: + - context['root_pk'] pk do master + - context['object'] objeto do master + """.format(menu['title'], menu['url']) + logger.error(log) + raise Exception(log) + else: try: menu['url'] = reverse('%s:%s' % ( - rm.app_name, menu['url']), kwargs={'pk': pk}) + rm.app_name, menu['url'])) except: try: menu['url'] = reverse('%s:%s' % ( - rm.app_name, menu['url'])) + rm.app_name, menu['url']), kwargs={'pk': pk}) except: - pass + log = """Erro na construção do Menu: + menu: {} + url: {} + 1) Verifique se a url existe + 2) Se existe no contexto um desses itens: + - context['root_pk'] pk do master + - context['object'] objeto do master + """.format(menu['title'], menu['url']) + logger.error(log) + raise Exception(log) menu['active'] = 'active'\ if context['request'].path == menu['url'] else '' diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 6f322c09c..cfcb71ffc 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -16,6 +16,7 @@ from sapl.comissoes.models import Comissao from sapl.compilacao.models import (PerfilEstruturalTextoArticulado, TextoArticulado) from sapl.parlamentares.models import Parlamentar +#from sapl.protocoloadm.models import Protocolo from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericForeignKey, SaplGenericRelation, restringe_tipos_de_arquivo_txt, texto_upload_path) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index a8daa645a..0c5dfd377 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -1111,7 +1111,6 @@ def get_pauta_sessao(sessao, casa): sessao_plenaria=sessao): materia = MateriaLegislativa.objects.filter( id=votacao.materia.id).first() - dic_votacao = {} dic_votacao["tipo_materia"] = materia.tipo.sigla + ' - ' + materia.tipo.descricao dic_votacao["num_ordem"] = votacao.numero_ordem diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index d2e00f47c..5a3cde342 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -1,4 +1,4 @@ - +from django.contrib import messages from datetime import datetime from crispy_forms.helper import FormHelper @@ -23,11 +23,10 @@ from sapl.parlamentares.models import Parlamentar, Legislatura, Mandato from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, MateriaPesquisaOrderingFilter, autor_label, autor_modal, timezone) -from .models import (Bancada, Bloco, ExpedienteMateria, Orador, JustificativaAusencia, - OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, - SessaoPlenariaPresenca, TipoResultadoVotacao, OcorrenciaSessao, - RetiradaPauta, TipoRetiradaPauta) - +from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, + Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, + SessaoPlenariaPresenca, TipoJustificativa, TipoResultadoVotacao, + OcorrenciaSessao, RegistroVotacao, RetiradaPauta, TipoRetiradaPauta) def recupera_anos(): @@ -520,12 +519,43 @@ class OcorrenciaSessaoForm(ModelForm): class VotacaoForm(forms.Form): - votos_sim = forms.CharField(label='Sim') - votos_nao = forms.CharField(label='Não') - abstencoes = forms.CharField(label='Abstenções') - total_votos = forms.CharField(required=False, label='total') + votos_sim = forms.IntegerField(label='Sim') + votos_nao = forms.IntegerField(label='Não') + abstencoes = forms.IntegerField(label='Abstenções') + total_presentes = forms.IntegerField(required=False, widget=forms.HiddenInput()) + voto_presidente = forms.IntegerField(label='A totalização inclui o voto do Presidente?') + total_votos = forms.IntegerField(required=False, label='total') + observacao = forms.CharField(required=False , label='Observação') resultado_votacao = forms.CharField(label='Resultado da Votação') + def clean(self): + cleaned_data = super(VotacaoForm, self).clean() + if not self.is_valid(): + return cleaned_data + + votos_sim = cleaned_data['votos_sim'] + votos_nao = cleaned_data['votos_nao'] + abstencoes = cleaned_data['abstencoes'] + qtde_presentes = cleaned_data['total_presentes'] + qtde_votos = votos_sim + votos_nao + abstencoes + voto_presidente = cleaned_data['voto_presidente'] + + if not voto_presidente: + qtde_presentes -= 1 + + if qtde_votos != qtde_presentes: + raise ValidationError('O total de votos não corresponde com a quantidade de presentes!') + + return cleaned_data + + # def save(self, commit=False): + # #TODO Verificar se esse códido é utilizado + + # votacao = super(VotacaoForm, self).save(commit) + # votacao.materia = self.cleaned_data['materia'] + # votacao.save() + # return votacao + class VotacaoNominalForm(forms.Form): resultado_votacao = forms.ModelChoiceField(label='Resultado da Votação', @@ -891,3 +921,79 @@ class JustificativaAusenciaForm(ModelForm): justificativa.materias_do_expediente.clear() justificativa.materias_da_ordem_do_dia.clear() return justificativa + + +class VotacaoEmBlocoFilterSet(MateriaLegislativaFilterSet): + + o = MateriaPesquisaOrderingFilter() + tramitacao__status = django_filters.ModelChoiceFilter( + required=True, + queryset=StatusTramitacao.objects.all(), + label=_('Status da Matéria')) + + class Meta: + model = MateriaLegislativa + fields = ['tramitacao__status', + 'numero', + 'numero_protocolo', + 'ano', + 'tipo', + 'data_apresentacao', + 'data_publicacao', + 'autoria__autor__tipo', + # FIXME 'autoria__autor__partido', + 'relatoria__parlamentar_id', + 'local_origem_externa', + 'em_tramitacao', + ] + + def __init__(self, *args, **kwargs): + super(MateriaLegislativaFilterSet, self).__init__(*args, **kwargs) + + self.filters['tipo'].label = 'Tipo de Matéria' + self.filters['autoria__autor__tipo'].label = 'Tipo de Autor' + # self.filters['autoria__autor__partido'].label = 'Partido do Autor' + self.filters['relatoria__parlamentar_id'].label = 'Relatoria' + + row1 = to_row( + [('tramitacao__status', 12)]) + row2 = to_row( + [('tipo', 12)]) + row3 = to_row( + [('numero', 4), + ('ano', 4), + ('numero_protocolo', 4)]) + row4 = to_row( + [('data_apresentacao', 6), + ('data_publicacao', 6)]) + row5 = to_row( + [('autoria__autor', 0), + (Button('pesquisar', + 'Pesquisar Autor', + css_class='btn btn-primary btn-sm'), 2), + (Button('limpar', + 'limpar Autor', + css_class='btn btn-primary btn-sm'), 10)]) + row6 = to_row( + [('autoria__autor__tipo', 6), + # ('autoria__autor__partido', 6) + ]) + row7 = to_row( + [('relatoria__parlamentar_id', 6), + ('local_origem_externa', 6)]) + row8 = to_row( + [('em_tramitacao', 6), + ('o', 6)]) + row9 = to_row( + [('ementa', 12)]) + + self.form.helper = FormHelper() + self.form.helper.form_method = 'GET' + self.form.helper.layout = Layout( + Fieldset(_('Pesquisa de Matéria'), + row1, row2, row3, + HTML(autor_label), + HTML(autor_modal), + row4, row5, row6, row7, row8, row9, + form_actions(label='Pesquisar')) + ) \ No newline at end of file diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index f9b07967d..9bcb414b6 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -28,7 +28,9 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, remove_parlamentar_composicao, reordernar_materias_expediente, reordernar_materias_ordem, - sessao_legislativa_legislatura_ajax) + sessao_legislativa_legislatura_ajax, + VotacaoEmBlocoOrdemDia, VotacaoEmBlocoExpediente, + VotacaoEmBlocoSimbolicaView,VotacaoEmBlocoNominalView) from .apps import AppConfig @@ -115,6 +117,16 @@ urlpatterns = [ url(r'^sessao/(?P\d+)/presencaordemdia$', PresencaOrdemDiaView.as_view(), name='presencaordemdia'), + url(r'^sessao/(?P\d+)/votacao_bloco_ordemdia$', + VotacaoEmBlocoOrdemDia.as_view(), + name='votacao_bloco_ordemdia'), + url(r'^sessao/(?P\d+)/votacao_bloco/votnom$', + VotacaoEmBlocoNominalView.as_view(), name='votacaobloconom'), + url(r'^sessao/(?P\d+)/votacao_bloco/votsimb$', + VotacaoEmBlocoSimbolicaView.as_view(), name='votacaoblocosimb'), + url(r'^sessao/(?P\d+)/votacao_bloco_expediente$', + VotacaoEmBlocoExpediente.as_view(), + name='votacao_bloco_expediente'), url(r'^sessao/(?P\d+)/resumo$', ResumoView.as_view(), name='resumo'), url(r'^sessao/(?P\d+)/resumo_ata$', @@ -133,6 +145,10 @@ urlpatterns = [ VotacaoEditView.as_view(), name='votacaosecretaedit'), url(r'^sessao/(?P\d+)/matordemdia/votsimb/(?P\d+)/(?P\d+)$', VotacaoView.as_view(), name='votacaosimbolica'), + + url(r'^sessao/(?P\d+)/matordemdia/votsimbbloco/$', + VotacaoView.as_view(), name='votacaosimbolicabloco'), + url(r'^sessao/(?P\d+)/matordemdia/votsimb' '/view/(?P\d+)/(?P\d+)$', VotacaoEditView.as_view(), name='votacaosimbolicaedit'), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 98ca3815c..b705e302f 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1,6 +1,6 @@ -from operator import itemgetter import logging +from operator import itemgetter from re import sub from django.contrib import messages @@ -57,7 +57,8 @@ TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') TipoExpedienteCrud = CrudAux.build(TipoExpediente, 'tipo_expediente') TipoJustificativaCrud = CrudAux.build(TipoJustificativa, 'tipo_justificativa') CargoBancadaCrud = CrudAux.build(CargoBancada, '') -TipoResultadoVotacaoCrud = CrudAux.build(TipoResultadoVotacao, 'tipo_resultado_votacao') +TipoResultadoVotacaoCrud = CrudAux.build( + TipoResultadoVotacao, 'tipo_resultado_votacao') TipoRetiradaPautaCrud = CrudAux.build(TipoRetiradaPauta, 'tipo_retirada_pauta') @@ -87,7 +88,8 @@ def verifica_presenca(request, model, spk): logger = logging.getLogger(__name__) if not model.objects.filter(sessao_plenaria_id=spk).exists(): username = request.user.username - logger.error("user=" + username + ". Votação não pode ser aberta sem presenças (sessao_plenaria_id={}).".format(spk)) + logger.error("user=" + username + + ". Votação não pode ser aberta sem presenças (sessao_plenaria_id={}).".format(spk)) msg = _('Votação não pode ser aberta sem presenças') messages.add_message(request, messages.ERROR, msg) return False @@ -301,7 +303,7 @@ def customize_link_materia(context, pk, has_permission, is_expediente): retirada_descricao = retirada.tipo_de_retirada.descricao retirada_observacao = retirada.observacao url = reverse('sapl.sessao:retiradapauta_detail', - kwargs={'pk': retirada.id}) + kwargs={'pk': retirada.id}) resultado = ('%s
%s
' % (url, retirada_descricao, @@ -798,7 +800,8 @@ class PresencaView(FormMixin, PresencaMixin, DetailView): sessao.parlamentar = Parlamentar.objects.get(id=p) sessao.save() username = request.user.username - self.logger.info("user=" + username + ". SessaoPlenariaPresenca salva com sucesso (parlamentar_id={})!".format(p)) + self.logger.info( + "user=" + username + ". SessaoPlenariaPresenca salva com sucesso (parlamentar_id={})!".format(p)) msg = _('Presença em Sessão salva com sucesso!') messages.add_message(request, messages.SUCCESS, msg) @@ -850,7 +853,7 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): cronometro_aparte = cronometro_aparte.seconds cronometro_ordem = cronometro_ordem.seconds cronometro_consideracoes = cronometro_consideracoes.seconds - + context = TemplateView.get_context_data(self, **kwargs) context.update({ 'head_title': str(_('Painel Plenário')), @@ -904,9 +907,10 @@ class PresencaOrdemDiaView(FormMixin, PresencaMixin, DetailView): ordem.sessao_plenaria = self.object ordem.parlamentar = Parlamentar.objects.get(id=p) ordem.save() + username = request.user.username + self.logger.info( + 'user=' + username + '. PresencaOrdemDia (parlamentar com id={}) salva com sucesso!'.format(p)) - username = request.user.username - self.logger.info('user=' + username + '. PresencaOrdemDia (parlamentar com id={}) salva com sucesso!'.format(p)) msg = _('Presença em Ordem do Dia salva com sucesso!') messages.add_message(request, messages.SUCCESS, msg) @@ -1041,11 +1045,13 @@ class MesaView(FormMixin, DetailView): username = request.user.username try: - self.logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}".format(kwargs['pk'])) + self.logger.debug( + "user=" + username + ". Tentando obter SessaoPlenaria com id={}".format(kwargs['pk'])) sessao = SessaoPlenaria.objects.get( id=kwargs['pk']) except ObjectDoesNotExist: - self.logger.error("user=" + username + ". SessaoPlenaria com id={} não existe.".format(kwargs['pk'])) + self.logger.error( + "user=" + username + ". SessaoPlenaria com id={} não existe.".format(kwargs['pk'])) mensagem = _('Esta Sessão Plenária não existe!') messages.add_message(request, messages.INFO, mensagem) @@ -1100,11 +1106,13 @@ def atualizar_mesa(request): logger = logging.getLogger(__name__) username = request.user.username try: - logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(request.GET['sessao'])) + logger.debug("user=" + username + + ". Tentando obter SessaoPlenaria com id={}.".format(request.GET['sessao'])) sessao = SessaoPlenaria.objects.get( id=int(request.GET['sessao'])) except ObjectDoesNotExist: - logger.error("user=" + username + ". SessaoPlenaria com id={} inexistente.".format(request.GET['sessao'])) + logger.error("user=" + username + + ". SessaoPlenaria com id={} inexistente.".format(request.GET['sessao'])) return JsonResponse({'msg': ('Sessão Inexistente!', 0)}) # Atualiza os componentes da view após a mudança @@ -1152,19 +1160,23 @@ def insere_parlamentar_composicao(request): composicao = IntegranteMesa() try: - logger.debug("user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(request.POST['sessao'])) + logger.debug( + "user=" + username + ". Tentando obter SessaoPlenaria com id={}.".format(request.POST['sessao'])) composicao.sessao_plenaria = SessaoPlenaria.objects.get( id=int(request.POST['sessao'])) except MultiValueDictKeyError: - logger.error("user=" + username + ". SessaoPlenaria com id={} não existe.".format(request.POST['sessao'])) + logger.error( + "user=" + username + ". SessaoPlenaria com id={} não existe.".format(request.POST['sessao'])) return JsonResponse({'msg': ('A Sessão informada não existe!', 0)}) try: - logger.debug("user=" + username + ". Tentando obter Parlamentar com id={}.".format(request.POST['parlamentar'])) + logger.debug( + "user=" + username + ". Tentando obter Parlamentar com id={}.".format(request.POST['parlamentar'])) composicao.parlamentar = Parlamentar.objects.get( id=int(request.POST['parlamentar'])) except MultiValueDictKeyError: - logger.error("user=" + username + ". Parlamentar com id={} não existe.".format(request.POST['parlamentar'])) + logger.error( + "user=" + username + ". Parlamentar com id={} não existe.".format(request.POST['parlamentar'])) return JsonResponse({ 'msg': ('Nenhum parlamentar foi inserido!', 0)}) @@ -1183,10 +1195,12 @@ def insere_parlamentar_composicao(request): composicao.save() except MultiValueDictKeyError as e: - logger.error("user=" + username + ". Nenhum cargo foi inserido! " + str(e)) + logger.error("user=" + username + + ". Nenhum cargo foi inserido! " + str(e)) return JsonResponse({'msg': ('Nenhum cargo foi inserido!', 0)}) - logger.info("user=" + username + ". Parlamentar (id={}) inserido com sucesso na sessao_plenaria(id={}) e cargo(ìd={}).") + logger.info("user=" + username + + ". Parlamentar (id={}) inserido com sucesso na sessao_plenaria(id={}) e cargo(ìd={}).") return JsonResponse({'msg': ('Parlamentar inserido com sucesso!', 1)}) else: @@ -1207,7 +1221,8 @@ def remove_parlamentar_composicao(request): if 'composicao_mesa' in request.POST: try: - logger.debug("user=" + username + ". Tentando remover IntegranteMesa com id={}".format(request.POST['composicao_mesa'])) + logger.debug("user=" + username + ". Tentando remover IntegranteMesa com id={}".format( + request.POST['composicao_mesa'])) IntegranteMesa.objects.get( id=int(request.POST['composicao_mesa'])).delete() except ObjectDoesNotExist: @@ -1217,12 +1232,14 @@ def remove_parlamentar_composicao(request): {'msg': ( 'Composição da Mesa não pôde ser removida!', 0)}) - logger.info("user=" + username + ". IntegranteMesa com id={} removido com sucesso.") + logger.info("user=" + username + + ". IntegranteMesa com id={} removido com sucesso.") return JsonResponse( {'msg': ( 'Parlamentar excluido com sucesso!', 1)}) else: - logger.debug("user=" + username + ". Nenhum parlamentar selecionado para ser excluido!") + logger.debug("user=" + username + + ". Nenhum parlamentar selecionado para ser excluido!") return JsonResponse( {'msg': ( 'Selecione algum parlamentar para ser excluido!', 0)}) @@ -1349,7 +1366,6 @@ class ResumoView(DetailView): context.update({'presenca_sessao': parlamentares_sessao, 'justificativa_ausencia': ausentes_sessao}) - # ===================================================================== # Expedientes expediente = ExpedienteSessao.objects.filter( @@ -1450,13 +1466,16 @@ class ResumoView(DetailView): config_assinatura_ata = AppsAppConfig.objects.first().assinatura_ata if config_assinatura_ata == 'T' and parlamentares_ordem: - context.update({'texto_assinatura': 'Assinatura de Todos os Parlamentares Presentes na Sessão'}) + context.update( + {'texto_assinatura': 'Assinatura de Todos os Parlamentares Presentes na Sessão'}) context.update({'assinatura_presentes': parlamentares_ordem}) elif config_assinatura_ata == 'M' and parlamentares_mesa_dia: - context.update({'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'}) + context.update( + {'texto_assinatura': 'Assinatura da Mesa Diretora da Sessão'}) context.update({'assinatura_presentes': parlamentares_mesa_dia}) elif config_assinatura_ata == 'P' and presidente_dia: - context.update({'texto_assinatura': 'Assinatura do Presidente da Sessão'}) + context.update( + {'texto_assinatura': 'Assinatura do Presidente da Sessão'}) context.update({'assinatura_presentes': presidente_dia}) # ===================================================================== @@ -1609,7 +1628,8 @@ class ExpedienteView(FormMixin, DetailView): if 'apagar-expediente' in request.POST: ExpedienteSessao.objects.filter( sessao_plenaria_id=self.object.id).delete() - self.logger.info('user=' + username + '. ExpedienteSessao de sessao_plenaria_id={} deletado.'.format(self.object.id)) + self.logger.info( + 'user=' + username + '. ExpedienteSessao de sessao_plenaria_id={} deletado.'.format(self.object.id)) return self.form_valid(form) if form.is_valid(): @@ -1635,7 +1655,8 @@ class ExpedienteView(FormMixin, DetailView): return self.form_valid(form) else: - self.logger.error("user=" + username + ". Erro ao salvar registro (sessao_plenaria_id={}).".format(self.object.id)) + self.logger.error( + "user=" + username + ". Erro ao salvar registro (sessao_plenaria_id={}).".format(self.object.id)) msg = _('Erro ao salvar ExpedienteSessao') messages.add_message(self.request, messages.SUCCESS, msg) return self.form_invalid(form) @@ -1705,7 +1726,8 @@ class OcorrenciaSessaoView(FormMixin, DetailView): messages.add_message(self.request, messages.SUCCESS, msg) username = self.request.user.username - self.logger.info('user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id)) + self.logger.info( + 'user=' + username + '. OcorrenciaSessao de sessao_plenaria_id={} atualizada com sucesso.'.format(self.object.id)) @method_decorator(permission_required('sessao.add_ocorrenciasessao')) def post(self, request, *args, **kwargs): @@ -1954,14 +1976,16 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): if RegistroVotacao.objects.filter(ordem_id=ordem_id).exists(): msg = _('Esta matéria já foi votada!') messages.add_message(request, messages.ERROR, msg) - self.logger.info('user=' + username + '. Matéria (ordem_id={}) já votada!'.format(ordem_id)) + self.logger.info( + 'user=' + username + '. Matéria (ordem_id={}) já votada!'.format(ordem_id)) return HttpResponseRedirect(reverse( 'sapl.sessao:ordemdia_list', kwargs={'pk': kwargs['pk']})) try: ordem = OrdemDia.objects.get(id=ordem_id) except ObjectDoesNotExist: - self.logger.error('user=' + username + '. Objeto OrdemDia (pk={}) não existe.'.format(ordem_id)) + self.logger.error( + 'user=' + username + '. Objeto OrdemDia (pk={}) não existe.'.format(ordem_id)) raise Http404() presentes = PresencaOrdemDia.objects.filter( @@ -1971,7 +1995,8 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): materia_votacao = ordem if not ordem.votacao_aberta: - self.logger.error('user=' + username + '. A votação para esta OrdemDia (id={}) encontra-se fechada!'.format(ordem_id)) + self.logger.error( + 'user=' + username + '. A votação para esta OrdemDia (id={}) encontra-se fechada!'.format(ordem_id)) msg = _('A votação para esta matéria encontra-se fechada!') messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(reverse( @@ -1984,7 +2009,8 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): expediente_id = kwargs['oid'] if (RegistroVotacao.objects.filter( expediente_id=expediente_id).exists()): - self.logger.error("user=" + username + ". RegistroVotacao (expediente_id={}) já existe.".format(expediente_id)) + self.logger.error( + "user=" + username + ". RegistroVotacao (expediente_id={}) já existe.".format(expediente_id)) msg = _('Esta matéria já foi votada!') messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(reverse( @@ -1992,10 +2018,12 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): kwargs={'pk': kwargs['pk']})) try: - self.logger.debug("user=" + username + ". Tentando obter Objeto ExpedienteMateria com id={}.".format(expediente_id)) + self.logger.debug( + "user=" + username + ". Tentando obter Objeto ExpedienteMateria com id={}.".format(expediente_id)) expediente = ExpedienteMateria.objects.get(id=expediente_id) except ObjectDoesNotExist: - self.logger.error('user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) + self.logger.error( + 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) raise Http404() presentes = SessaoPlenariaPresenca.objects.filter( @@ -2005,7 +2033,8 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): materia_votacao = expediente if not expediente.votacao_aberta: - msg = _('A votação para este ExpedienteMateria (id={}) encontra-se fechada!'.format(expediente_id)) + msg = _( + 'A votação para este ExpedienteMateria (id={}) encontra-se fechada!'.format(expediente_id)) messages.add_message(request, messages.ERROR, msg) return HttpResponseRedirect(reverse( 'sapl.sessao:expedientemateria_list', @@ -2033,19 +2062,23 @@ class VotacaoNominalAbstract(SessaoPermissionMixin): if self.ordem: ordem_id = kwargs['oid'] try: - self.logger.debug("user=" + username + ". Tentando obter objeto OrdemDia com id={}.".format(ordem_id)) + self.logger.debug( + "user=" + username + ". Tentando obter objeto OrdemDia com id={}.".format(ordem_id)) materia_votacao = OrdemDia.objects.get(id=ordem_id) except ObjectDoesNotExist: - self.logger.error('user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id)) + self.logger.error( + 'user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id)) raise Http404() elif self.expediente: expediente_id = kwargs['oid'] try: - self.logger.debug("user=" + username + ". Tentando obter ExpedienteMateria com id={}.".format(expediente_id)) + self.logger.debug( + "user=" + username + ". Tentando obter ExpedienteMateria com id={}.".format(expediente_id)) materia_votacao = ExpedienteMateria.objects.get( id=expediente_id) except ObjectDoesNotExist: - self.logger.error('user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) + self.logger.error( + 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) raise Http404() if form.is_valid(): @@ -2231,7 +2264,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): votacao = RegistroVotacao.objects.filter(ordem_id=ordem_id).last() if not ordem or not votacao: - self.logger.error('user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format(ordem_id)) + self.logger.error( + 'user=' + username + '. Objeto OrdemDia com id={} ou RegistroVotacao de OrdemDia não existe.'.format(ordem_id)) raise Http404() materia = ordem.materia @@ -2304,7 +2338,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): try: materia_votacao = OrdemDia.objects.get(id=ordem_id) except ObjectDoesNotExist: - self.logger.error('user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id)) + self.logger.error( + 'user=' + username + '. Objeto OrdemDia com id={} não existe.'.format(ordem_id)) raise Http404() elif self.expediente: @@ -2314,7 +2349,8 @@ class VotacaoNominalEditAbstract(SessaoPermissionMixin): materia_votacao = ExpedienteMateria.objects.get( id=expediente_id) except ObjectDoesNotExist: - self.logger.error('user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) + self.logger.error( + 'user=' + username + '. Objeto ExpedienteMateria com id={} não existe.'.format(expediente_id)) raise Http404() if(int(request.POST['anular_votacao']) == 1): @@ -2993,7 +3029,8 @@ class AdicionarVariasMateriasExpediente(PermissionRequiredForAppCrudMixin, msg = _('%s adicionado(a) com sucesso!' % MateriaLegislativa.objects.get(id=m)) messages.add_message(request, messages.SUCCESS, msg) - self.logger.info("user=" + username + ". MateriaLegislativa de id={} adicionado(a) com sucesso!".format(m)) + self.logger.info( + "user=" + username + ". MateriaLegislativa de id={} adicionado(a) com sucesso!".format(m)) except MultiValueDictKeyError: msg = _('Formulário Inválido. Você esqueceu de selecionar ' + '%s' % @@ -3068,7 +3105,8 @@ class AdicionarVariasMateriasOrdemDia(AdicionarVariasMateriasExpediente): msg = _('%s adicionado(a) com sucesso!' % MateriaLegislativa.objects.get(id=m)) messages.add_message(request, messages.SUCCESS, msg) - self.logger.debug('user=' + username + '. MateriaLegislativa de id={} adicionado(a) com sucesso!'.format(m)) + self.logger.debug( + 'user=' + username + '. MateriaLegislativa de id={} adicionado(a) com sucesso!'.format(m)) except MultiValueDictKeyError: msg = _('Formulário Inválido. Você esqueceu de selecionar ' + 'o tipo de votação de %s' % @@ -3129,7 +3167,8 @@ def mudar_ordem_materia_sessao(request): numero_ordem=posicao_inicial) except ObjectDoesNotExist: username = request.user.username - logger.error("user=" + username + ". Materia com sessao_plenaria={} e numero_ordem={}.".format(pk_sessao, posicao_inicial)) + logger.error("user=" + username + + ". Materia com sessao_plenaria={} e numero_ordem={}.".format(pk_sessao, posicao_inicial)) raise # TODO tratar essa exceção # Se a posição inicial for menor que a final, todos que @@ -3241,13 +3280,494 @@ class JustificativaAusenciaCrud(MasterDetailCrud): pass +class VotacaoEmBlocoExpediente(ListView): + + model = ExpedienteMateria + template_name = 'sessao/votacao/votacao_bloco_expediente.html' + app_label = AppConfig.label + context_object_name = 'expedientes' + logger = logging.getLogger(__name__) + + def get_queryset(self): + kwargs = self.kwargs + return ExpedienteMateria.objects.filter(sessao_plenaria_id=kwargs['pk'], + resultado='') + + def get_context_data(self, **kwargs): + context = super(VotacaoEmBlocoExpediente, + self).get_context_data(**kwargs) + context['turno_choices'] = Tramitacao.TURNO_CHOICES + context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk']) + context['pk'] = self.kwargs['pk'] + context['root_pk'] = self.kwargs['pk'] + return context + + +class VotacaoEmBlocoOrdemDia(ListView): + model = OrdemDia + template_name = 'sessao/votacao/votacao_bloco_ordem.html' + app_label = AppConfig.label + logger = logging.getLogger(__name__) + context_object_name = 'ordem_dia' + parent_field = 'sessao_plenaria' + + def get_queryset(self): + return OrdemDia.objects.filter(sessao_plenaria_id=self.kwargs['pk'], + resultado='') + + def get_context_data(self, **kwargs): + context = super(VotacaoEmBlocoOrdemDia, + self).get_context_data(**kwargs) + context['turno_choices'] = Tramitacao.TURNO_CHOICES + context['pk'] = self.kwargs['pk'] + context['root_pk'] = self.kwargs['pk'] + context['title'] = SessaoPlenaria.objects.get(id=self.kwargs['pk']) + return context + + +class VotacaoEmBlocoSimbolicaView(TemplateView): + + """ + Votação Simbólica + """ + + template_name = 'sessao/votacao/votacao_simbolica_bloco.html' + logger = logging.getLogger(__name__) + + def post(self, request, *args, **kwargs): + + if not 'context' in locals(): + context = {'pk': self.kwargs['pk'], + 'root_pk': self.kwargs['pk'], + 'title': SessaoPlenaria.objects.get(id=self.kwargs['pk']) + } + + if 'marcadas_1' in request.POST: + + context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), + 'origem': request.POST['origem']}) + + # marcadas_1 se refere a votação simbólica e marcadas_2 a votação + # nominal + if request.POST['origem'] == 'ordem': + ordens = OrdemDia.objects.filter( + id__in=request.POST.getlist('marcadas_1')) + qtde_presentes = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']).count() + context.update({'ordens': ordens, + 'total_presentes': qtde_presentes}) + else: + expedientes = ExpedienteMateria.objects.filter( + id__in=request.POST.getlist('marcadas_1')) + qtde_presentes = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=self.kwargs['pk']).count() + context.update({'expedientes': expedientes, + 'total_presentes': qtde_presentes}) + + if 'salvar-votacao' in request.POST: + form = VotacaoForm(request.POST) + + if form.is_valid(): + + origem = request.POST['origem'] + + if origem == 'ordem': + ordens = OrdemDia.objects.filter( + id__in=request.POST.getlist('ordens')) + + for ordem in ordens: + try: + votacao = RegistroVotacao() + votacao.numero_votos_sim = int( + request.POST['votos_sim']) + votacao.numero_votos_nao = int( + request.POST['votos_nao']) + votacao.numero_abstencoes = int( + request.POST['abstencoes']) + votacao.observacao = request.POST['observacao'] + votacao.materia = ordem.materia + votacao.ordem = ordem + resultado = TipoResultadoVotacao.objects.get( + id=request.POST['resultado_votacao']) + votacao.tipo_resultado_votacao = resultado + votacao.save() + except Exception as e: + username = request.user.username + self.logger.error('user=' + username + '. Problemas ao salvar ' + 'RegistroVotacao da materia de id={} ' + 'e da ordem de id={}. ' + .format(ordem.materia.id, ordem.id) + str(e)) + return self.form_invalid(form, context) + else: + ordem.resultado = resultado.nome + ordem.votacao_aberta = False + ordem.save() + + else: + expedientes = ExpedienteMateria.objects.filter( + id__in=request.POST.getlist('expedientes')) + for expediente in expedientes: + try: + votacao = RegistroVotacao() + votacao.numero_votos_sim = int( + request.POST['votos_sim']) + votacao.numero_votos_nao = int( + request.POST['votos_nao']) + votacao.numero_abstencoes = int( + request.POST['abstencoes']) + votacao.observacao = request.POST['observacao'] + votacao.materia = expediente.materia + votacao.expediente = expediente + resultado = TipoResultadoVotacao.objects.get( + id=request.POST['resultado_votacao']) + votacao.tipo_resultado_votacao = resultado + votacao.save() + except Exception as e: + username = request.user.username + self.logger.error('user=' + username + '. Problemas ao salvar RegistroVotacao da materia de id={} ' + 'e da ordem de id={}. '.format(expediente.materia.id, expediente.id) + str(e)) + return self.form_invalid(form, context) + else: + expediente.resultado = resultado.nome + expediente.votacao_aberta = False + expediente.save() + + return HttpResponseRedirect(self.get_success_url()) + + else: + return self.form_invalid(form, context) + + if 'cancelar-votacao' in request.POST: + if request.POST['origem'] == 'ordem': + ordens = OrdemDia.objects.filter( + id__in=request.POST.getlist('ordens')) + for ordem in ordens: + ordem.votacao_aberta = False + ordem.save() + else: + expedientes = ExpedienteMateria.objects.filter( + id__in=request.POST.getlist('expedientes')) + for expediente in expedientes: + expediente.votacao_aberta = False + expediente.save() + + return HttpResponseRedirect(self.get_success_url()) + + return self.render_to_response(context) + + def get_tipos_votacao(self): + for tipo in TipoResultadoVotacao.objects.all(): + yield tipo + + def get_success_url(self): + if self.request.POST['origem'] == 'ordem': + return reverse('sapl.sessao:ordemdia_list', + kwargs={'pk': self.kwargs['pk']}) + else: + return reverse('sapl.sessao:expedientemateria_list', + kwargs={'pk': self.kwargs['pk']}) + + def form_invalid(self, form, context): + + errors_tuple = [(form[e].label, form.errors[e]) + for e in form.errors if e in form.fields] + error_message = '
    ' + for e in errors_tuple: + error_message += '
  • %s: %s
  • ' % (e[0], e[1][0]) + for e in form.non_field_errors(): + error_message += '
  • %s
  • ' % e + error_message += '
' + + messages.add_message(self.request, messages.ERROR, error_message) + + if self.request.POST['origem'] == 'ordem': + ordens = OrdemDia.objects.filter( + id__in=self.request.POST.getlist('ordens')) + qtde_presentes = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']).count() + context.update({'ordens': ordens, + 'total_presentes': qtde_presentes}) + elif self.request.POST['origem'] == 'expediente': + expedientes = ExpedienteMateria.objects.filter( + id__in=self.request.POST.getlist('expedientes')) + qtde_presentes = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=self.kwargs['pk']).count() + context.update({'expedientes': expedientes, + 'total_presentes': qtde_presentes}) + + context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), + 'form': form, + 'origem': self.request.POST['origem']}) + + return self.render_to_response(context) + + +class VotacaoEmBlocoNominalView(TemplateView): + """ + Votação Nominal + """ + template_name = 'sessao/votacao/votacao_nominal_bloco.html' + logger = logging.getLogger(__name__) + + def post(self, request, *args, **kwargs): + username = request.user.username + form = VotacaoNominalForm(request.POST) + + if not 'context' in locals(): + context = {'pk': self.kwargs['pk'], + 'root_pk': self.kwargs['pk'], + 'title': SessaoPlenaria.objects.get(id=self.kwargs['pk']), + 'subnav_template_name': 'sessao/subnav.yaml'} + + if 'marcadas_2' in request.POST: + + context.update({'resultado_votacao': TipoResultadoVotacao.objects.all(), + 'origem': request.POST['origem']}) + + # marcadas_1 se refere a votação simbólica e marcadas_2 a votação + # nominal + if request.POST['origem'] == 'ordem': + ordens = OrdemDia.objects.filter( + id__in=request.POST.getlist('marcadas_2')) + presentes = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=kwargs['pk']) + context.update({'ordens': ordens}) + else: + expedientes = ExpedienteMateria.objects.filter( + id__in=request.POST.getlist('marcadas_2')) + presentes = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=kwargs['pk']) + context.update({'expedientes': expedientes}) + total_presentes = presentes.count() + context.update({'parlamentares': self.get_parlamentares(), + 'total_presentes': total_presentes}) + + if 'cancelar-votacao' in request.POST: + if request.POST['origem'] == 'ordem': + for ordem_id in request.POST.getlist('ordens'): + ordem = OrdemDia.objects.get(id=ordem_id) + fechar_votacao_materia(ordem) + return HttpResponseRedirect(reverse( + 'sapl.sessao:ordemdia_list', kwargs={'pk': self.kwargs['pk']})) + else: + for expediente_id in request.POST.getlist('expedientes'): + expediente = ExpedienteMateria.objects.get( + id=expediente_id) + fechar_votacao_materia(expediente) + return HttpResponseRedirect(reverse( + 'sapl.sessao:expedientemateria_list', + kwargs={'pk': self.kwargs['pk']})) + + if 'salvar-votacao' in request.POST: + + if form.is_valid(): + if form.cleaned_data['resultado_votacao'] == None: + form.add_error(None, 'Não é possível finalizar a votação sem ' + 'nenhum resultado da votação.') + return self.form_invalid(form, context) + + qtde_votos = (int(request.POST['votos_sim']) + + int(request.POST['votos_nao']) + + int(request.POST['abstencoes']) + + int(request.POST['nao_votou'])) + + # Caso todas as opções sejam 'Não votou', fecha a votação + if int(request.POST['nao_votou']) == qtde_votos: + self.logger.error('user=' + username + '. Não é possível finalizar a votação sem ' + 'nenhum voto.') + form.add_error(None, 'Não é possível finalizar a votação sem ' + 'nenhum voto.') + return self.form_invalid(form, context) + + if request.POST['origem'] == 'ordem': + for ordem_id in request.POST.getlist('ordens'): + ordem = OrdemDia.objects.get(id=ordem_id) + # Remove todas as votação desta matéria, caso existam + RegistroVotacao.objects.filter( + ordem_id=ordem_id).delete() + votacao = RegistroVotacao() + votacao.numero_votos_sim = int( + request.POST['votos_sim']) + votacao.numero_votos_nao = int( + request.POST['votos_nao']) + votacao.numero_abstencoes = int( + request.POST['abstencoes']) + votacao.observacao = request.POST['observacao'] + votacao.materia = ordem.materia + votacao.ordem = ordem + votacao.tipo_resultado_votacao = form.cleaned_data['resultado_votacao'] + votacao.save() + + for votos in request.POST.getlist('voto_parlamentar'): + v = votos.split(':') + voto = v[0] + parlamentar_id = v[1] + + voto_parlamentar = VotoParlamentar.objects.get_or_create( + parlamentar_id=parlamentar_id, + ordem_id=ordem_id)[0] + + voto_parlamentar.voto = voto + voto_parlamentar.parlamentar_id = parlamentar_id + voto_parlamentar.votacao_id = votacao.id + voto_parlamentar.save() + + ordem.resultado = form.cleaned_data['resultado_votacao'].nome + ordem.votacao_aberta = False + ordem.save() + + VotoParlamentar.objects.filter( + ordem_id=ordem_id, + votacao__isnull=True).delete() + + else: + for expediente_id in request.POST.getlist('expedientes'): + expediente = ExpedienteMateria.objects.get( + id=expediente_id) + RegistroVotacao.objects.filter( + expediente_id=expediente_id).delete() + votacao = RegistroVotacao() + votacao.numero_votos_sim = int( + request.POST['votos_sim']) + votacao.numero_votos_nao = int( + request.POST['votos_nao']) + votacao.numero_abstencoes = int( + request.POST['abstencoes']) + votacao.observacao = request.POST['observacao'] + votacao.materia = expediente.materia + votacao.expediente = expediente + votacao.tipo_resultado_votacao = form.cleaned_data['resultado_votacao'] + votacao.save() + + # Salva os votos de cada parlamentar + for votos in request.POST.getlist('voto_parlamentar'): + v = votos.split(':') + voto = v[0] + parlamentar_id = v[1] + + voto_parlamentar = VotoParlamentar.objects.get_or_create( + parlamentar_id=parlamentar_id, + expediente_id=expediente_id)[0] + + voto_parlamentar.voto = voto + voto_parlamentar.parlamentar_id = parlamentar_id + voto_parlamentar.votacao_id = votacao.id + voto_parlamentar.save() + + expediente.resultado = form.cleaned_data['resultado_votacao'].nome + expediente.votacao_aberta = False + expediente.save() + + VotoParlamentar.objects.filter( + expediente_id=expediente_id, + votacao__isnull=True).delete() + + return HttpResponseRedirect(self.get_success_url()) + + else: + return self.form_invalid(form, context) + + return self.render_to_response(context) + + def get_parlamentares(self): + + # campos hidden ainda não preenchidos + if 'marcadas_2' in self.request.POST: + if self.request.POST['origem'] == 'ordem': + presencas = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']) + ordens_id = self.request.POST.getlist('marcadas_2') + voto_parlamentar = VotoParlamentar.objects.filter( + ordem=ordens_id[0]) + else: + presencas = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']) + expedientes_id = self.request.POST.getlist('marcadas_2') + voto_parlamentar = VotoParlamentar.objects.filter( + expediente=expedientes_id[0]) + + # campos hidden já preenchidos + else: + if self.request.POST['origem'] == 'ordem': + presencas = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']) + ordens_id = self.request.POST.getlist('ordens') + voto_parlamentar = VotoParlamentar.objects.filter( + ordem=ordens_id[0]) + else: + presencas = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']) + expedientes_id = self.request.POST.getlist('expedientes') + voto_parlamentar = VotoParlamentar.objects.filter( + expediente=expedientes_id[0]) + + presentes = [p.parlamentar for p in presencas] + + for parlamentar in Parlamentar.objects.filter(ativo=True): + if parlamentar in presentes: + try: + voto = voto_parlamentar.get( + parlamentar=parlamentar) + except ObjectDoesNotExist: + username = self.request.user.username + self.logger.error('user=' + username + '. Objeto voto_parlamentar do ' + + 'parlamentar de id={} não existe.'.format(parlamentar.pk)) + yield [parlamentar, None] + else: + yield [parlamentar, voto.voto] + + def get_success_url(self): + if self.request.POST['origem'] == 'ordem': + return reverse('sapl.sessao:ordemdia_list', + kwargs={'pk': self.kwargs['pk']}) + else: + return reverse('sapl.sessao:expedientemateria_list', + kwargs={'pk': self.kwargs['pk']}) + + def form_invalid(self, form, context): + + errors_tuple = [(form[e].label, form.errors[e]) + for e in form.errors if e in form.fields] + error_message = '
    ' + for e in errors_tuple: + error_message += '
  • %s: %s
  • ' % (e[0], e[1][0]) + for e in form.non_field_errors(): + error_message += '
  • %s
  • ' % e + error_message += '
' + + messages.add_message(self.request, messages.ERROR, error_message) + + if self.request.POST['origem'] == 'ordem': + ordens = OrdemDia.objects.filter( + id__in=self.request.POST.getlist('ordens')) + presentes = PresencaOrdemDia.objects.filter( + sessao_plenaria_id=self.kwargs['pk']) + context.update({'ordens': ordens}) + elif self.request.POST['origem'] == 'expediente': + expedientes = ExpedienteMateria.objects.filter( + id__in=self.request.POST.getlist('expedientes')) + presentes = SessaoPlenariaPresenca.objects.filter( + sessao_plenaria_id=self.kwargs['pk']) + context.update({'expedientes': expedientes}) + + total_presentes = presentes.count() + context.update({'parlamentares': self.get_parlamentares(), + 'total_presentes': total_presentes, + 'resultado_votacao': TipoResultadoVotacao.objects.all(), + 'form': form, + 'origem': self.request.POST['origem']}) + + return self.render_to_response(context) + + class RetiradaPautaCrud(MasterDetailCrud): model = RetiradaPauta public = [RP_LIST, RP_DETAIL, ] parent_field = 'sessao_plenaria' class BaseMixin(MasterDetailCrud.BaseMixin): - list_field_names = ['tipo_de_retirada', 'materia', 'observacao', 'parlamentar'] + list_field_names = ['tipo_de_retirada', + 'materia', 'observacao', 'parlamentar'] class ListView(MasterDetailCrud.ListView): paginate_by = 10 @@ -3269,7 +3789,8 @@ class RetiradaPautaCrud(MasterDetailCrud): layout_key = None def get_initial(self): - sessao_plenaria = RetiradaPauta.objects.get(id=self.kwargs['pk']).sessao_plenaria + sessao_plenaria = RetiradaPauta.objects.get( + id=self.kwargs['pk']).sessao_plenaria return {'sessao_plenaria': sessao_plenaria} class DeleteView(MasterDetailCrud.DeleteView): diff --git a/sapl/static/styles/app.css b/sapl/static/styles/app.css new file mode 100644 index 000000000..3561a3e06 --- /dev/null +++ b/sapl/static/styles/app.css @@ -0,0 +1,503 @@ +.container-home { + position: relative; + padding: 2em 1.5em 1.5em 1.5em; + max-width: 1000px; + margin: 0 auto; } + .container-home a:hover { + color: #444; + -webkit-transition: 0.3s ease-in; + -moz-transition: 0.3s ease-in; + -o-transition: 0.3s ease-in; } + .container-home #homeIndex { + text-align: center; } + .container-home .homeBanner span { + color: white; + font-size: 32px; + font-weight: 600; + display: inline-block; + vertical-align: middle; + padding: 2px 45px 4px; + border: 2px solid; } + .container-home .homeBanner::after { + display: inline-block; + vertical-align: middle; + height: 100%; } + .container-home .homeBlock { + display: inline-block; + position: relative; + background-color: #F3F3F3; + width: 190px; + height: 260px; + margin: 3px; + text-align: center; + font-size: 0; + overflow: hidden; } + .container-home .homeBlock > a { + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; } + .container-home .homeBlock::after { + content: ''; + display: inline-block; + vertical-align: middle; + height: 100%; + overflow: visible; + clear: none; + visibility: initial; } + .container-home .homeContent { + position: relative; + padding: 10px; + text-align: justify; + font-size: 14px; + color: #FFF; + opacity: 0; + transition: opacity 0.5s ease; + display: inline-block; + vertical-align: middle; } + .container-home .homeContent p { + display: block; + line-height: 13px; + font-size: 80%; + color: white; } + .container-home .homeIcon { + position: relative; + display: inline-block; + width: 105px; + height: 105px; + border-radius: 50%; + background: #364347; + z-index: 1; } + .container-home .homeIcon::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + background: #364347; + top: 0; + left: 0; + transform: scale(0.95); + transition: transform 0.6s ease; } + .container-home .homeIcon img { + position: absolute; + margin: auto; + top: 0; + bottom: 0; + right: 0; + left: 0; + transition: opacity 0.4s 0.4s ease; } + .container-home .homeFront { + position: absolute; + top: 46%; + width: 100%; + font-size: 0; + transform: translateY(-60%); } + .container-home .homeFront h2 { + position: absolute; + margin-top: 18px; + font-size: 22px; + font-weight: 700; + color: #595959 !important; + width: 100%; + padding: 0 6%; + z-index: 0; } + .container-home .homeTitle { + display: block; + height: 32px; + text-align: center; + width: 100%; + opacity: 0; + transition: opacity 0.4s ease; } + .container-home .homeTitle::before { + content: ''; + display: inline-block; + vertical-align: middle; + height: 100%; } + .container-home .homeTitle h2 { + display: inline-block; + vertical-align: middle; + max-width: 110px; + font-size: 14px; + color: white !important; + line-height: 1em; } + .container-home .homeTitle img { + display: inline-block; + vertical-align: middle; + height: 30px; + margin-right: 5px; } + .container-home .homeBlock:hover .homeIcon::before { + transform: scale(3.6) translateY(7px); } + .container-home .homeBlock:hover .homeContent { + opacity: 1; + transition-delay: 0.2s; } + .container-home .homeBlock:hover .homeIcon img { + opacity: 0; + transition-duration: 0.2s; + transition-delay: 0s; } + .container-home .homeBlock:hover .homeTitle { + opacity: 1; } + +html { + position: relative; + min-height: 100%; } + +body { + margin-bottom: 160px; } + +h1, h2, h3, h4, h5, h6, form, dl, dt, dd, p, div, img, a { + margin: 0; + padding: 0; } + +h1, .h1 { + font-size: 30px; } + +h2, .h2 { + font-size: 24px; } + +h3, .h3 { + font-size: 20px; } + +h4, .h4 { + font-size: 16px; } + +h5, .h5 { + font-size: 14px; } + +h6, .h6 { + font-size: 12px; } + +p { + margin: 0.5em 0; } + p .control-label { + font-weight: bold; } + +label { + margin-bottom: 0; + line-height: 1; } + +fieldset fieldset { + font-size: 95%; } + fieldset fieldset legend { + font-size: 18px; } + +.page-header { + margin: 20px 0px 10px; } + +.caret.top { + transform: rotate(180deg); } + +.btn:hover, .btn:focus { + color: inherit; } + +.btn-default.btn-excluir { + color: #d9534f; } + .btn-default.btn-excluir:hover { + color: #fff; + border-color: #de6764; + background-color: #de6764; } + +.btn-cancel-iframe { + position: relative; + text-align: right; + opacity: 0.5; } + .btn-cancel-iframe:hover { + opacity: 1; } + .btn-cancel-iframe a { + padding: 10px; + display: inline-block; } + +.legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; + clear: both; } + +.grid-gutter-width-right { + margin-right: 15px; } + +.controls-file { + padding: 10px; + border: 1px solid #d6e1e5; + border-radius: 4px; } + .controls-file label.checkbox-inline { + margin: 0px; + display: block; } + +.help-block-danger { + margin: 15px; + padding: 15px; + border: 2px dashed #f00; } + +.control-label { + margin: 0; } + +.form-control-static { + padding-top: 0; + min-height: auto; } + .form-control-static img { + max-width: 100%; } + +.pagination { + padding-top: 25px; } + +.modal .alert { + margin-bottom: 0; } + +.avatar-parlamentar { + height: 128px; + width: 128px; + margin: 0 auto; + display: table; } + +.masthead { + padding: 10px; } + .masthead .nav { + clear: both; } + .masthead .navbar-brand { + padding: 0px; + color: inherit; + font-size: 24px; } + .masthead .navbar-brand img.img-responsive { + height: 95px; + margin-right: 15px; + display: inline-block; } + .masthead .navbar-brand small { + color: #93A4AA; + font-size: 75%; + line-height: 25px; } + .masthead .navbar-brand .vcenter { + display: inline-block; + vertical-align: middle; + float: none; + padding: 10px; } + +nav.navbar { + margin-bottom: 0; + border-radius: 0; + font-size: 15px; } + +nav .navbar-nav > li > a { + padding-top: 0px; + padding-bottom: 0px; + line-height: 75px; } + nav .navbar-nav > li > a:hover { + background-color: #23527c; } + +nav .navbar-nav > li:nth-child(2) > .dropdown-menu { + right: auto; } + +nav .navbar-nav:last-child > li:last-child a { + padding-right: 0px; } + +.controls-radio-checkbox { + padding: 0px; + border: 1px solid #d6e1e5; + border-radius: 4px; + min-height: 20px; } + .controls-radio-checkbox .checkbox, .controls-radio-checkbox .radio, .controls-radio-checkbox .checkbox-inline, .controls-radio-checkbox .radio-inline { + padding: 8px 8px 8px 36px; + margin: 0; + line-height: 1.6; + display: block; } + .controls-radio-checkbox .checkbox:hover, .controls-radio-checkbox .radio:hover, .controls-radio-checkbox .checkbox-inline:hover, .controls-radio-checkbox .radio-inline:hover { + background-color: #d6e1e5; } + .controls-radio-checkbox .checkbox .icons, .controls-radio-checkbox .radio .icons, .controls-radio-checkbox .checkbox-inline .icons, .controls-radio-checkbox .radio-inline .icons { + top: auto; + left: 8px; } + .controls-radio-checkbox .checkbox-inline, .controls-radio-checkbox .radio-inline { + display: inline-block; } + .controls-radio-checkbox .help-block { + margin: 15px; + padding: 15px; + border: 2px dashed #d6e1e5; } + +.controls-radio-checkbox__old { + padding: 0px; + border: 1px solid #d6e1e5; + border-radius: 4px; + min-height: 20px; } + .controls-radio-checkbox__old label { + padding: 0; + line-height: 2.7; + padding-left: 36px; } + .controls-radio-checkbox__old label .icons { + top: 8px; + left: 8px; } + .controls-radio-checkbox__old label.checkbox-inline, .controls-radio-checkbox__old label.radio-inline { + padding-right: 8px; } + .controls-radio-checkbox__old label.checkbox-inline .icons, .controls-radio-checkbox__old label.radio-inline .icons { + top: 8px; + left: 8px; } + .controls-radio-checkbox__old .checkbox, .controls-radio-checkbox__old .radio, .controls-radio-checkbox__old .checkbox-inline, .controls-radio-checkbox__old .radio-inline { + margin: 0; } + .controls-radio-checkbox__old .checkbox:hover, .controls-radio-checkbox__old .radio:hover, .controls-radio-checkbox__old .checkbox-inline:hover, .controls-radio-checkbox__old .radio-inline:hover { + background-color: #d6e1e5; } + +.manual, .manual ul { + padding-left: 1.5em; + list-style-type: none; + margin-top: 0; + font-size: 100%; } + +.manual li { + display: list-item; + line-height: 1.5em; + padding-right: 0; } + .manual li a { + background-color: transparent; + border: none; + border-radius: none; + padding: 0; } + +.container-tabaux .sidebar-tabaux { + background: #fafafa; + margin-top: -70px; + padding: 10px; + border: 1px solid #eee; } + .container-tabaux .sidebar-tabaux .navbar-right { + margin: 0; } + .container-tabaux .sidebar-tabaux .nav-pills > li + li { + margin-left: 0px; } + .container-tabaux .sidebar-tabaux li { + width: 100%; } + .container-tabaux .sidebar-tabaux span { + display: none; } + .container-tabaux .sidebar-tabaux .dropdown-menu { + padding: 0px; + right: 10px; + margin-top: -5px; + overflow: hidden; } + .container-tabaux .sidebar-tabaux .dropdown-menu a { + border: 0px; } + +.container-tabaux ul { + list-style: none; + padding: 0; } + +.container-tabaux .list { + font-family: "SourceSansProSemiBold", Helvetica, Arial, sans-serif; + font-size: 0px; + display: table; + width: 100%; + margin: 0; } + .container-tabaux .list ul { + display: table; + width: 100%; + margin: 0; } + .container-tabaux .list li { + width: calc(50%); + display: inline-block; + position: relative; } + .container-tabaux .list > li { + width: 100%; + border-bottom: 1px solid #eee; + padding-bottom: 20px; + margin-bottom: 20px; } + .container-tabaux .list .head_title { + color: #364347; + font-size: 2.4rem; + text-transform: none; } + .container-tabaux .list a span { + display: none; } + +#styleparlamentar { + border: 0px solid #d6e1e5; + border-top-color: #d6e1e5; + border-right-color: #d6e1e5; + border-bottom-color: #d6e1e5; + border-left-color: #d6e1e5; + border-image-source: initial; + border-image-slice: initial; + border-image-repeat: initial; + font-size: 16px; + line-height: 1.467; + padding: 7px 12px; + height: 40px; + -webkit-appearance: none; + border-radius: 4px; + -webkit-box-shadow: none; + box-shadow: none; + margin-left: 1.0em; } + +.footer { + background: #364347; + color: white; + text-align: center; + position: absolute; + width: 100%; + bottom: 0px; } + .footer p { + color: white; + margin-top: 10px; } + .footer .container { + padding-top: 25px; } + +@media (max-width: 1199px) { + nav .container { + width: auto !important; } + .navbar-nav > li > a { + padding-left: 10.71429px; + padding-right: 10.71429px; } } + +@media (max-width: 1091px) { + .container { + width: auto; } + .navbar-nav > li > a { + padding-left: 7.5px; + padding-right: 7.5px; } + .masthead .navbar-brand { + font-size: 22px; } + .masthead .navbar-brand img.img-responsive { + height: 60px; + margin-right: 7.5px; } } + +@media (max-width: 991px) { + body { + margin: 0; } + .footer { + position: relative; } + .caret { + margin-left: 1px; } + .navbar-nav > li > a { + padding-left: 4px; + padding-right: 4px; } } + +@media (max-width: 767px) { + nav .navbar-nav > li > a { + line-height: 2.5; } + nav .navbar-right { + position: absolute; + top: 0; + margin: 10px; } + nav .navbar-right > li { + vertical-align: top; + display: inline-block; } + nav .navbar-right > li a { + padding-left: 10px; + padding-right: 10px; } + nav .navbar-right .pesquisa.open ul { + position: absolute; } + nav .navbar-right .navbar-form { + margin: 8px 0; } + .table { + width: auto; + white-space: normal; + display: block; + overflow-x: auto; } } + +@media (min-width: 1092px) and (max-width: 1199px) { + .container { + width: 1070px; } } + +@media print { + a[href]:after { + content: none !important; } } diff --git a/sapl/static/styles/compilacao.css b/sapl/static/styles/compilacao.css new file mode 100644 index 000000000..557ef057a --- /dev/null +++ b/sapl/static/styles/compilacao.css @@ -0,0 +1,1136 @@ +a:link:after, a:visited:after { + content: ""; } + +.test_import:nth-child(even) { + background-color: #ccc; } + +#wait_message { + display: block; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(220, 220, 220, 0.75); + z-index: 99; } + #wait_message #msg { + position: relative; + margin: 20% auto; + padding: 1.2em 2em; + max-width: 600px; + text-align: center; + font-size: 1.5em; + color: #677; + border: 1px solid #eee; + background-color: #fff !important; + box-shadow: 0 1px 2px #999; } + +.text-center { + text-align: center; } + +.cp-notify { + z-index: 9999; + position: fixed; + top: 2em; + left: 50%; + min-width: 600px; + transform: translate(-50%, 0); + transition: all 0.4s ease; + opacity: 0.97; } + .cp-notify.hide { + opacity: 0; + top: -1000px; + display: block !important; + transition: all 0.4s ease; } + .cp-notify .message { + padding: 1em; + border: 2px solid rgba(0, 0, 0, 0.1); + border-radius: 4px; + color: rgba(0, 0, 0, 0.6); + line-height: 1em; + font-size: 1.3em; + text-align: center; + box-shadow: 0 0 100px rgba(0, 0, 0, 0.2); } + +.cp { + /* and dpt */ } + .cp .desativado .dtxt, .cp .dpt .dptt > a.desativado .dtxt, .cp .desativado .dtxt *, .cp .dpt .dptt > a.desativado .dtxt *, .cp .desativado .dpt-link, .cp .dpt .dptt > a.desativado .dpt-link, .cp .desativado .dpt-link *, .cp .dpt .dptt > a.desativado .dpt-link * { + text-decoration: line-through; + color: #999 !important; } + .cp .desativado .dtxt table, .cp .dpt .dptt > a.desativado .dtxt table, .cp .desativado .dtxt table td, .cp .dpt .dptt > a.desativado .dtxt table td, .cp .desativado .dtxt * table, .cp .dpt .dptt > a.desativado .dtxt * table, .cp .desativado .dtxt * table td, .cp .dpt .dptt > a.desativado .dtxt * table td, .cp .desativado .dpt-link table, .cp .dpt .dptt > a.desativado .dpt-link table, .cp .desativado .dpt-link table td, .cp .dpt .dptt > a.desativado .dpt-link table td, .cp .desativado .dpt-link * table, .cp .dpt .dptt > a.desativado .dpt-link * table, .cp .desativado .dpt-link * table td, .cp .dpt .dptt > a.desativado .dpt-link * table td { + border: 1px dotted #ccc; } + .cp a { + text-decoration: none; + cursor: pointer; } + .cp .diff .desativado, .cp .diff .dpt .dptt > a.desativado, .cp .dpt .diff .dptt > a.desativado, .cp .diff .desativado *, .cp .diff .dpt .dptt > a.desativado *, .cp .dpt .diff .dptt > a.desativado * { + text-decoration: line-through; + color: #ddd !important; + font-size: 90%; } + .cp .diff .added { + color: #04DE2C; } + .cp .dpt { + font-size: 1em; + position: relative; } + .cp .dpt.indent { + padding-left: 1em; } + .cp .dpt .ementa { + padding: 2em 0em 2em 35%; + font-weight: bold; } + .cp .dpt .titulo_generico, .cp .dpt .anexo, .cp .dpt .disp_preliminares, .cp .dpt .disp_gerais, .cp .dpt .disp_transitorias, .cp .dpt .disp_finais, .cp .dpt .parte, .cp .dpt .livro, .cp .dpt .titulo, .cp .dpt .capitulo, .cp .dpt .secao, .cp .dpt .subsecao, .cp .dpt .itemsecao { + text-align: center; + margin-bottom: 1em; + font-size: 1.15em; + margin-top: 3em; } + .cp .dpt .titulo { + margin-top: 2em; } + .cp .dpt .capitulo { + margin-top: 1.5em; + font-size: 1.15em; } + .cp .dpt .secao { + margin-top: 1.2em; + margin-bottom: 0.7em; + font-weight: bold; + font-size: 1.15em; } + .cp .dpt .subsecao, + .cp .dpt .itemsecao { + margin-top: 1em; + margin-bottom: 0.6em; + font-weight: bold; + font-size: 1.15em; } + .cp .dpt .artigo { + font-size: 1.15em; + float: left; } + .cp .dpt .artigo .dptt { + position: relative; } + .cp .dpt .caput { + margin-top: 0.3333em; + font-size: 1.15em; } + .cp .dpt .paragrafo { + font-size: 1.1em; + margin-top: 0.2222em; } + .cp .dpt .inciso { + font-size: 1.1em; + margin-top: 0.1667em; } + .cp .dpt .alinea { + font-size: 1.0em; + margin-top: 2px; } + .cp .dpt .item { + font-size: 1.0em; + margin-top: 2px; } + .cp .dpt .assinatura { + margin-top: 0.6em; + font-size: 1.15em; } + .cp .dpt .fecho_lei { + margin-top: 0.6em; + font-size: 1.15em; } + .cp .dpt .page-break { + page-break-before: always; } + .cp .dpt .bloco_alteracao { + padding-left: 10%; + font-style: italic; + color: #018; } + .cp .dpt .bloco_alteracao a { + text-decoration: underline; } + .cp .dpt .bloco_alteracao a, .cp .dpt .bloco_alteracao table, .cp .dpt .bloco_alteracao table td { + color: #018 !important; } + .cp .dpt .dn { + /* Notas de Dispositivo*/ + font-weight: normal; + position: relative; + font-size: 70%; } + .cp .dpt .dn p, .cp .dpt .dn ul { + font-weight: normal; + margin: 0 0 0 0; + list-style: none; + padding: 0; } + .cp .dpt .dn .dnl { + /* Lista Notas de Dispositivo*/ + display: block; + text-align: left !important; } + .cp .dpt .dn .dnl * { + display: inline; } + .cp .dpt .dn .dnl .bullet { + padding: 0 0.333em; + display: inline-block; } + .cp .dpt .dn .dnl .dnli { + min-height: 2.5em; } + .cp .dpt .dn .dnl .dnli:hover ul { + transition: opacity 0.5s linear, clip 0s 0.3s; + clip: auto; + opacity: 1; + background: rgba(230, 230, 230, 0.9); } + .cp .dpt .dn .dnl .dnli ul { + transition: opacity 0.5s linear, clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position: absolute; + background: transparent; + right: 0; + padding: 0.2em 0.5em 0em 0.5em; + border: 1px solid #c7e3d3; + border-top: 0px; + font-size: 1.5rem; } + .cp .dpt .dn .dnl .dnli ul li { + display: table-cell; + color: #aaa; } + .cp .dpt .dn .dnl .dnli ul li:hover { + color: #787; } + .cp .dpt .dn .dnl .dnli ul li:hover a { + color: #27AE60 !important; } + .cp .dpt .dn .dnl .dnli ul li .nowner { + color: #27AE60 !important; } + .cp .dpt .dn .dnl .dnli .ntitulo { + font-weight: bold; + color: #03A203; + text-decoration: none; } + .cp .dpt .dn .dnl .dnli .ntitulo a { + color: #294 !important; } + .cp .dpt .dn .dnl .dnli .ntexto { + color: #06D806; } + .cp .dpt .dn .dnl .dnli .ntexto a { + color: #03A203 !important; } + .cp .dpt .dn .dnl:hover { + display: block; } + .cp .dpt .dn .dnl:hover * { + display: block; } + .cp .dpt .dn .dnl:hover > .bullet { + display: none; } + .cp .dpt .dn .dnl:hover .dnli { + margin-top: 0.5em; + border-top: 1px solid #c7e3d3; } + .cp .dpt .dptt { + clear: left; } + .cp .dpt .dptt > a { + color: #000000; } + .cp .dpt .dptt > a.nota-alteracao { + color: #02baf2; + font-size: 0.75em; } + .cp .dpt .dptt > a.nota-alteracao:hover { + text-decoration: underline; } + .cp .dpt .dptt .dne { + position: absolute; + display: block; + right: 0; + left: 0; + top: 0; + height: 0; + transform: scaleX(0); + transform-origin: right; + transition: all 0.3s ease; + border-top: 1px solid #2980B9; } + .cp .dpt .dptt .dne ul.btns-action { + list-style: none; + padding: 0; + position: absolute; + right: 0; + background-color: #2980B9; } + .cp .dpt .dptt .dne ul.btns-action li { + float: left; } + .cp .dpt .dptt .dne ul.btns-action li:hover { + background-color: rgba(0, 0, 0, 0.1); } + .cp .dpt .dptt .dne ul.btns-action li a { + color: white; + padding: 0.15em 1em 0; + display: inline-block; } + .cp .dpt .dptt .dne-nota { + position: relative; + transform: scaleX(1); + height: auto; + border-top: 0px; } + .cp .dpt .dptt .dne-nota ul.btns-action { + display: none; } + .cp .dpt .dptt .dne-nota .dne-form { + margin: 1em -2em 0em; + text-align: left; + font-size: 1.6rem; } + .cp .dpt .dptt:hover .dne { + height: 0.1667rem; + transform: scaleX(1); + transition-delay: 1s; } + .cp .dpt .dptt:hover .dne-nota { + height: auto; + transition-delay: 0s; } + .cp .tipo-vigencias { + list-style: none; + position: fixed; + bottom: 0px; + left: 50%; + transform: translate(-50%, 0); + margin: 0; + padding: 0; + background-color: #2980B9; + z-index: 1000; + opacity: 0.9; + transition: all 0.3s ease-in-out; } + .cp .tipo-vigencias li { + display: inline-block; + border-left: 1px solid #fff; + float: left; } + .cp .tipo-vigencias li a { + color: white; + padding: 0.3em 1em 0; + display: inline-block; + font-size: 110%; + cursor: pointer; } + .cp .tipo-vigencias li a.selected { + background-color: rgba(0, 0, 0, 0.5); } + .cp .tipo-vigencias li:hover { + background-color: rgba(0, 0, 0, 0.2); } + .cp .tipo-vigencias:hover { + opacity: 1; } + +/* end cp */ +.cp.cpe { + /* fim .dpt */ + /* fim dpt-alts */ } + .cp.cpe .desativado, .cp.cpe .dpt .dptt > a.desativado { + text-decoration: line-through; + color: #999 !important; } + .cp.cpe .desativado table, .cp.cpe .dpt .dptt > a.desativado table, .cp.cpe .desativado table td, .cp.cpe .dpt .dptt > a.desativado table td { + border: 1px dotted #ccc; } + .cp.cpe .desativado a.nota-alteracao * { + color: #02baf2 !important; } + .cp.cpe .dpt { + display: block; } + .cp.cpe .dpt > .dpt-actions-fixed { + position: absolute; + right: -0.8em; + top: -0.8em; + z-index: 3; + opacity: 0; } + .cp.cpe .dpt > .dpt-actions-fixed .activate { + display: none; } + .cp.cpe .dpt > .dpt-actions-fixed .deactivate { + display: inline; } + .cp.cpe .dpt > .dpt-actions-fixed .btn-dpt-edit.btn-default { + color: #333; } + .cp.cpe .dpt > .dpt-actions-fixed .btn-dpt-edit.btn-default:hover { + color: #fff; + background-color: #02baf2; } + .cp.cpe .dpt > .dpt-actions, .cp.cpe .dpt > .dpt-actions-bottom { + display: none; } + .cp.cpe .dpt > .dpt-text { + cursor: text; + min-height: 30px; + border: 1px solid transparent; } + .cp.cpe .dpt > .dpt-text:hover, .cp.cpe .dpt > .dpt-text.hover-fixed { + background-color: rgba(0, 0, 0, 0.01); + color: #2980B9; + border: 1px solid #eee; + transition: color 0.3s ease; } + .cp.cpe .dpt > .dpt-text.artigo { + float: none; } + .cp.cpe .dpt > .dpt-text a.link-rotulo { + color: #000; } + .cp.cpe .dpt:hover > .dpt-actions-fixed { + opacity: 1; } + .cp.cpe .dpt:hover > .dpt-actions-fixed:hover ~ .dpt-text { + background-color: rgba(0, 0, 0, 0.01); + color: #2980B9; + border: 1px solid #eee; + transition: color 0.3s ease; } + .cp.cpe .dpt .semtexto { + font-weight: bold; + color: #9aaed6; } + .cp.cpe .dpt .semtexto:hover { + color: #5f76a4; } + .cp.cpe .dpt-alts { + margin: 0; + margin-bottom: 1em; + padding: 0; + background-color: transparent; + min-height: 100px; + border: 2px dashed #fff; } + .cp.cpe .dpt-alts:hover { + border-color: #d9ddde; } + .cp.cpe .dpt-alts:empty { + border-color: #ddd; } + .cp.cpe .dpt-alts.drag { + width: 100% !important; + border-color: #d9ddde; } + .cp.cpe .dpt-alts.drag .dpt { + transition-duration: 0s !important; } + .cp.cpe .dpt-alts .dpt { + width: 100% !important; + box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24); + padding: 0; + margin: 0; + background-color: #edf0f1; + height: auto !important; + min-height: 2em; + z-index: 1; } + .cp.cpe .dpt-alts .dpt:not(:first-child) { + border-top: 1px solid white; } + .cp.cpe .dpt-alts .dpt > .dpt-text { + padding: 0.3em 1em; + margin-top: 0; + margin-bottom: 0; } + .cp.cpe .dpt-alts .dpt > .dpt-text a.link-rotulo { + text-decoration: underline; } + .cp.cpe .dpt-alts .dpt-selected.dpt { + margin: 0em -0.5em; } + .cp.cpe .dpt-selected.dpt { + width: auto !important; + margin: 1em -0.5em; + border: 1px solid #fad46b !important; + padding: 0; + background-color: #fafafa; + border-radius: 3px; + z-index: 4; } + .cp.cpe .dpt-selected.dpt > .dpt-text { + border: 1px solid transparent; } + .cp.cpe .dpt-selected.dpt > .dpt-text:hover { + border: 1px solid transparent; + background-color: transparent; } + .cp.cpe .dpt-selected.dpt > .dpt-form { + margin-bottom: 0em; } + .cp.cpe .dpt-selected.dpt > .dpt-actions, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom { + display: table; + background-color: #e5e5e5; + padding: 1em; + margin-bottom: 0em; + width: 100%; } + .cp.cpe .dpt-selected.dpt > .dpt-actions > .btn-action, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom > .btn-action { + display: table-cell; + float: none; } + .cp.cpe .dpt-selected.dpt > .dpt-actions .btn-excluir, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .btn-excluir, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar { + display: inline-block; + opacity: 0.3; } + .cp.cpe .dpt-selected.dpt > .dpt-actions .btn-excluir:hover, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar:hover, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions .csform .actions_inserts > li > a.btn-salvar:hover, .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .btn-excluir:hover, .cp.cpe .cp.cpe1_old_apagar .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar:hover, .cp.cpe1_old_apagar .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom .csform .actions_inserts > li > a.btn-salvar:hover { + opacity: 1; } + .cp.cpe .dpt-selected.dpt > .dpt-actions-bottom { + margin: 0; } + .cp.cpe .dpt-selected .dpt-block { + border-top: 1px solid #e5e5e5 !important; + opacity: 0.6; + transition: opacity 0.4s ease; } + .cp.cpe .dpt-selected .dpt-block:hover { + opacity: 1; } + .cp.cpe .dpt-selected .dpt:only-child { + /*border-bottom: 1px solid #e5e5e5 !important;*/ } + .cp.cpe .dpt-selected .dpt:not(:last-child) { + /*border-bottom: 1px solid #e5e5e5 !important;*/ } + .cp.cpe .dpt-selected .dpt-text { + opacity: 0.7; + margin: 0; + padding: 0.7em; } + .cp.cpe .dpt-selected .dpt-text:hover { + opacity: 1; + background-color: #f5f5f5; } + .cp.cpe .dpt-selected .dpt-alts { + margin: 1em; } + .cp.cpe .dpt-selected .dpt-alts .dpt { + box-shadow: 0 0 0; } + .cp.cpe .dpt-selected > .dpt-actions-fixed { + opacity: 1; + top: -12px; + right: 0.5em; } + .cp.cpe .dpt-selected > .dpt-actions-fixed .activate { + display: inline; } + .cp.cpe .dpt-selected > .dpt-actions-fixed .deactivate { + display: none; } + .cp.cpe .dpt-selected > .dpt-actions-fixed .btn-dpt-edit { + padding-top: 2px; + padding-bottom: 1px; } + .cp.cpe .dpt-selected > .dpt-actions-fixed .btn-dpt-edit.btn-default { + background-color: #fad46b; + border: 1px solid #fad46b; } + .cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left { + right: auto !important; + left: 0; + padding: 2px 0; } + .cp.cpe .dpt-selected .dropdown-menu.dropdown-menu-left > .top.arrow { + right: 88%; + left: auto; } + .cp.cpe .dpt-selected .dropdown-menu li a { + padding-top: 2px; + padding-bottom: 2px; } + .cp.cpe .dpt-selected .btn-group .radius-right { + border-bottom-right-radius: 4px !important; + border-top-right-radius: 4px !important; } + .cp.cpe .dpt-selected:hover > .dpt-actions-fixed { + opacity: 1; } + +.cp.cpe1_old_apagar { + margin-bottom: 15em; + /* fim dpt */ + /* fim dpt-selected */ } + .cp.cpe1_old_apagar .desativado, .cp.cpe1_old_apagar .dpt .dptt > a.desativado, .cp.cpe1_old_apagar .desativado *, .cp.cpe1_old_apagar .dpt .dptt > a.desativado * { + text-decoration: line-through; + color: #999 !important; } + .cp.cpe1_old_apagar .desativado table, .cp.cpe1_old_apagar .dpt .dptt > a.desativado table, .cp.cpe1_old_apagar .desativado table td, .cp.cpe1_old_apagar .dpt .dptt > a.desativado table td, .cp.cpe1_old_apagar .desativado * table, .cp.cpe1_old_apagar .dpt .dptt > a.desativado * table, .cp.cpe1_old_apagar .desativado * table td, .cp.cpe1_old_apagar .dpt .dptt > a.desativado * table td { + border: 1px dotted #ccc; } + .cp.cpe1_old_apagar a { + text-decoration: none; + cursor: pointer; } + .cp.cpe1_old_apagar .dpt { + position: relative; + display: block; } + .cp.cpe1_old_apagar .dpt .semtexto { + font-weight: bold; + color: #BFD1F6; } + .cp.cpe1_old_apagar .dpt .artigo { + float: none; } + .cp.cpe1_old_apagar .dpt .caput { + margin-top: 0; } + .cp.cpe1_old_apagar .dpt > .actions_right, .cp.cpe1_old_apagar .dpt-selected .csform .dpt > .actions_left { + color: #fff; + right: 0em; + position: absolute; + opacity: 0; + transition: all 0.4s ease-in-out; + z-index: 1000; } + .cp.cpe1_old_apagar .dpt > .actions_right a.btn-bloco, .cp.cpe1_old_apagar .dpt-selected .csform .dpt > .actions_left a.btn-bloco { + background-color: #3498db; + color: #ffffff !important; + padding: 8px 18px 6px; + display: inline-block; + line-height: 1; + float: right; } + .cp.cpe1_old_apagar .dpt > .actions_right a.btn-bloco:hover, .cp.cpe1_old_apagar .dpt-selected .csform .dpt > .actions_left a.btn-bloco:hover { + opacity: 1; + background-image: -webkit-linear-gradient(top, #1c81c4, #0b6dad); + background-image: -moz-linear-gradient(top, #1c81c4, #0b6dad); + background-image: -ms-linear-gradient(top, #1c81c4, #0b6dad); + background-image: -o-linear-gradient(top, #1c81c4, #0b6dad); + background-image: linear-gradient(to bottom, #1c81c4, #0b6dad); } + .cp.cpe1_old_apagar .dpt:hover > .actions_right, .cp.cpe1_old_apagar .dpt-selected .csform .dpt:hover > .actions_left { + opacity: 1; } + .cp.cpe1_old_apagar .dpt .bloco { + display: block; + clear: both; } + .cp.cpe1_old_apagar .dpt .bloco *:hover { + color: #27AE60; } + .cp.cpe1_old_apagar .dpt .bloco .de { + cursor: pointer; } + .cp.cpe1_old_apagar .dpt .articulacao { + border-top: 2px solid #e5e5e5; + margin: 2em 0; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao { + margin: 1em 0; + padding: 0em; + background-color: transparent; + min-height: 100px; + border: 2px dashed #fff; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao:hover { + border-color: #d9ddde; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao.drag { + width: 100% !important; + border-color: #d9ddde; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao.drag .dpt { + transition-duration: 0s !important; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt { + width: 100% !important; + box-shadow: 0 -1px 0 #e5e5e5, 0 0 2px rgba(0, 0, 0, 0.12), 0 2px 4px rgba(0, 0, 0, 0.24); + padding: 0.3em 1em; + margin: 0; + background-color: #edf0f1; + z-index: 1; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt:not(:first-child) { + border-top: 1px solid white; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.ui-draggable div { + cursor: pointer; } + .cp.cpe1_old_apagar .dpt .bloco_alteracao .dpt.dpt-comp-selected { + transition: all 0.3s ease; + width: auto !important; + margin: 2em -3.7em; + box-shadow: 0 0 6px rgba(0, 0, 0, 0.16), 0 6px 12px rgba(0, 0, 0, 0.32); } + .cp.cpe1_old_apagar .dpt-selected { + font-size: 1em; + border: 0px solid #CCC; + margin: 1em -1.8em 1em -1.8em; + padding: 2.2em 2.2em 1.6em 2.2em; + box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23); + background-image: -webkit-linear-gradient(top, #eaeaee, #ddd); + background-image: -moz-linear-gradient(top, #eaeaee, #ddd); + background-image: -ms-linear-gradient(top, #eaeaee, #ddd); + background-image: -o-linear-gradient(top, #eaeaee, #ddd); + background-image: linear-gradient(to bottom, #eaeaee, #ddd); + /* fim csform*/ } + .cp.cpe1_old_apagar .dpt-selected ul { + list-style: none; + margin: 0; + padding: 0; } + .cp.cpe1_old_apagar .dpt-selected .semtexto { + color: #999; } + .cp.cpe1_old_apagar .dpt-selected .bloco { + opacity: 0.5; } + .cp.cpe1_old_apagar .dpt-selected .bloco:hover { + opacity: 1; } + .cp.cpe1_old_apagar .dpt-selected .bloco a:hover { + background: transparent; } + .cp.cpe1_old_apagar .dpt-selected > .bloco { + opacity: 1; + margin: 1em; } + .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao { + margin: 0; + padding: 1em; + border: 0 transparent; + background-image: -webkit-linear-gradient(top, #eaeaee, #ddd); + background-image: -moz-linear-gradient(top, #eaeaee, #ddd); + background-image: -ms-linear-gradient(top, #eaeaee, #ddd); + background-image: -o-linear-gradient(top, #eaeaee, #ddd); + background-image: linear-gradient(to bottom, #eaeaee, #ddd); } + .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao:hover { + border-color: transparent; } + .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag { + width: 100% !important; } + .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao.drag .dpt { + transition-duration: 0s !important; } + .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt { + width: auto !important; + transition: all 0.3s ease; + background-color: white; } + .cp.cpe1_old_apagar .dpt-selected .bloco_alteracao .dpt:not(:first-child) { + border-top: 0px solid white; } + .cp.cpe1_old_apagar .dpt-selected > .dpt { + padding: 0; } + .cp.cpe1_old_apagar .dpt-selected > .dpt:last-child { + padding-bottom: 1em; } + .cp.cpe1_old_apagar .dpt-selected > .actions_right a.btn-bloco, .cp.cpe1_old_apagar .dpt-selected .csform .dpt-selected > .actions_left a.btn-bloco { + display: none; } + .cp.cpe1_old_apagar .dpt-selected .csform { + /* compilacao simple form */ + display: block; + clear: both; + z-index: 9; + position: static; + /* actions_inserts */ } + .cp.cpe1_old_apagar .dpt-selected .csform .btns-action { + -webkit-animation: fadeIn 1s ease-in-out; + -moz-animation: fadeIn 1s ease-in-out; + -o-animation: fadeIn 1s ease-in-out; + opacity: 1; + position: absolute; + display: table; + transition: all 0.4s ease-in-out; } + .cp.cpe1_old_apagar .dpt-selected .csform .btns-action a { + color: #16407c; + display: block; + background: transparent; + vertical-align: middle; + text-align: center; + font-weight: normal; + text-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + padding: 0.33em 0.4em; } + .cp.cpe1_old_apagar .dpt-selected .csform .btns-action > li { + position: relative; + display: table-cell; + vertical-align: top; } + .cp.cpe1_old_apagar .dpt-selected .csform .btns-action > li:hover { + background-color: rgba(255, 255, 255, 0.5); } + .cp.cpe1_old_apagar .dpt-selected .csform .btns-action > li:hover > a { + text-shadow: 0 0 5px #777; + color: #0a5; } + .cp.cpe1_old_apagar .dpt-selected .csform .label_status { + position: absolute; + bottom: 0; + right: 0; + color: #889; + padding: 0.3em; + font-size: 80%; + text-align: right; + z-index: 15; + display: table; } + .cp.cpe1_old_apagar .dpt-selected .csform .label_status li { + display: table-cell; + padding: 0 0.5em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents { + z-index: 11; + top: 0em; + left: 0em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents a { + padding: 0.62em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div, .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents li { + font-size: 80%; + display: table-cell; + vertical-align: middle; + border-right: 1px solid #CCC; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents div { + padding: 0 0.4em; + font-stretch: condensed; + font-variant: small-caps; + font-weight: bold; + text-shadow: 0 0 10px #fff; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_parents > li:hover a { + color: #16407c; + font-weight: normal; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_top, .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom { + top: 0em; + right: 0em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_top a, .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a { + padding-right: 1em; + padding-left: 1em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_top li, .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li { + display: table-cell; + vertical-align: middle; + border-left: 1px solid #CCC; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom { + top: auto; + left: 0; + bottom: 0; + display: inline-block; + border-top: 1px solid #CCC; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom a { + padding: 0 0.4em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_bottom li { + border: 0px; + border-right: 1px solid #CCC; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_right, .cp.cpe1_old_apagar .dpt-selected .csform .actions_left { + top: 2.2em; + right: 0em; + bottom: 0; + display: block; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_right li, .cp.cpe1_old_apagar .dpt-selected .csform .actions_left li { + width: 2.2em; + display: block; + border-bottom: 1px solid #CCC; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_right li:first-child, .cp.cpe1_old_apagar .dpt-selected .csform .actions_left li:first-child { + border-top: 1px solid #CCC; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_left { + right: auto; + left: 0em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts { + background: transparent; + position: relative; + z-index: 19; + display: table; + width: 100%; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li { + display: table-cell; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li:hover > a { + background-image: -webkit-linear-gradient(top, #1c81c4, #0b6dad); + background-image: -moz-linear-gradient(top, #1c81c4, #0b6dad); + background-image: -ms-linear-gradient(top, #1c81c4, #0b6dad); + background-image: -o-linear-gradient(top, #1c81c4, #0b6dad); + background-image: linear-gradient(to bottom, #1c81c4, #0b6dad); } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a { + background-image: -webkit-linear-gradient(top, #3498DB, #2980C9); + background-image: -moz-linear-gradient(top, #3498DB, #2980C9); + background-image: -ms-linear-gradient(top, #3498DB, #2980C9); + background-image: -o-linear-gradient(top, #3498DB, #2980C9); + background-image: linear-gradient(to bottom, #3498DB, #2980C9); + border-right: 1px solid #fff; + padding: 0.2em; + display: block; + color: white; + text-align: center; + white-space: nowrap; + /* btn-excluir */ } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-excluir, .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar { + text-align: left; + background: #A70808; + color: #c99; + padding-left: 1.7em; + position: relative; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-excluir:hover, .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar:hover { + background-color: #c70808; + color: #ecc; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-excluir::before, .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before { + z-index: 20; + position: absolute; + background: url(/static/img/icon_delete_white.png) no-repeat 50% 50%; + content: ""; + top: 0; + left: 0; + display: block; + color: black; + margin-left: 0.4em; + height: 100%; + width: 2em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar { + background: #1f8b4d; + color: white; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar:hover { + background: #2d9c5c; + color: white; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before { + background: url(/static/img/icon_save_white.png) no-repeat 50% 50%; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a span { + padding: 0 0.7em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li:last-child > a { + border-right: 0px solid #fff; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > ul li:nth-child(even) a { + background: #3385CA; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > ul li a { + border-right: 1px solid #fff; + display: block; + color: white; + background: #2980C9; + font-size: 80%; + padding: 0.23em 1em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > ul li a:hover { + background: #0a5ea4; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior { + table-layout: fixed; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul { + transform: translateY(30px); + transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position: absolute; + margin-left: 0.5em; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + -webkit-transition-delay: 0.4s; + /* Safari */ + transition-delay: 0.4s; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul li a { + border-right: 0px !important; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul li:first-child::before { + border-width: 0.375rem; + border-style: inset inset solid; + content: ""; + display: block; + height: 0px; + width: 0px; + border-color: transparent transparent #3385CA; + position: absolute; + top: -0.71rem; + left: 0.9375rem; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul li:first-child:hover::before { + border-color: transparent transparent #0A5EA4; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior > ul::after { + content: ""; + position: absolute; + z-index: -1; + left: 0; + top: rem-calc(-25px); + height: rem-calc(25px); + width: 100%; + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.add_prior:hover > ul { + transform: translateY(7px); + transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s; + opacity: 1; + clip: rect(-100px, 2000px, 2000px, -100px); } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir { + display: block; + position: static; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul { + transform: translateY(30px); + transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position: absolute; + margin-left: 0.5em; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + -webkit-transition-delay: 0.4s; + /* Safari */ + transition-delay: 0.4s; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li a { + border-right: 0px !important; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child::before { + border-width: 0.375rem; + border-style: inset inset solid; + content: ""; + display: block; + height: 0px; + width: 0px; + border-color: transparent transparent #3385CA; + position: absolute; + top: -0.71rem; + left: 0.9375rem; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child:hover::before { + border-color: transparent transparent #0A5EA4; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul::after { + content: ""; + position: absolute; + z-index: -1; + left: 0; + top: rem-calc(-25px); + height: rem-calc(25px); + width: 100%; + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir:hover > ul { + transform: translateY(7px); + transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s; + opacity: 1; + clip: rect(-100px, 2000px, 2000px, -100px); } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul { + right: 0.5em; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li a { + background-color: #A70808; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li a:hover { + background: #c70808; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child::before { + border-color: transparent transparent #A70808; + right: 10%; + left: auto; } + .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child:hover::before { + border-color: transparent transparent #c70808; } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo { + z-index: 2000; } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul { + transform: translateY(30px); + transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position: absolute; + margin-left: 0.5em; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + -webkit-transition-delay: 0.4s; + /* Safari */ + transition-delay: 0.4s; } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul li a, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul li a { + border-right: 0px !important; } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul li:first-child::before, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul li:first-child::before { + border-width: 0.375rem; + border-style: inset inset solid; + content: ""; + display: block; + height: 0px; + width: 0px; + border-color: transparent transparent #3385CA; + position: absolute; + top: -0.71rem; + left: 0.9375rem; } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul li:first-child:hover::before, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul li:first-child:hover::before { + border-color: transparent transparent #0A5EA4; } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li > ul::after, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li > ul::after { + content: ""; + position: absolute; + z-index: -1; + left: 0; + top: rem-calc(-25px); + height: rem-calc(25px); + width: 100%; + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li:hover > ul, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li:hover > ul { + transform: translateY(7px); + transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s; + opacity: 1; + clip: rect(-100px, 2000px, 2000px, -100px); } + .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante > li.menu_excluir > ul li:first-child::before, .cp.cpe1_old_apagar .dpt-selected .csform .menu_flutuante_fixo > li.menu_excluir > ul li:first-child::before { + right: auto; + left: 0.9375rem; } + .cp.cpe1_old_apagar .dpt-selected .csform textarea { + margin: 0; + resize: vertical; + min-height: 12.6em; + border: 0px; + font-size: 120%; + width: 100%; } + .cp.cpe1_old_apagar .dpt-selected .csform textarea:focus { + background: #fff; } + .cp.cpe1_old_apagar .dpt-selected .csform textarea::-webkit-input-placeholder { + color: #c70808; + opacity: 0.6; + font-size: 80%; } + .cp.cpe1_old_apagar .dpt-selected .csform textarea:-moz-placeholder { + /* Firefox 18- */ + color: #c70808; } + .cp.cpe1_old_apagar .dpt-selected .csform textarea::-moz-placeholder { + /* Firefox 19+ */ + color: #c70808; } + .cp.cpe1_old_apagar .dpt-selected .csform textarea:-ms-input-placeholder { + color: #c70808; + opacity: 0.6; } + .cp.cpe1_old_apagar .selected { + background-color: rgba(255, 255, 255, 0.5); } + .cp.cpe1_old_apagar .selected a:hover { + color: #16407c !important; + font-weight: normal !important; } + +.result-busca-dispositivo, .lista-dispositivo { + padding: 0 0 1em; + min-height: 3em; } + .result-busca-dispositivo ul, .lista-dispositivo ul { + list-style: none; + margin: 0; + padding: 1em 0 0; + transition: all 2s linear; + clear: both; } + .result-busca-dispositivo ul li, .lista-dispositivo ul li { + display: table; + border-collapse: separate; + border-bottom: 1px solid white; + width: 100%; } + .result-busca-dispositivo ul li.ta_title, .lista-dispositivo ul li.ta_title { + background-color: rgba(0, 0, 0, 0.15); + border-radius: 4px 4px 0 0; + width: 100%; } + .result-busca-dispositivo ul li:last-child .itemlabel, .lista-dispositivo ul li:last-child .itemlabel { + border-radius: 0 0 4px 0px; + margin: 0px; } + .result-busca-dispositivo ul li:last-child .iteminput, .lista-dispositivo ul li:last-child .iteminput { + border-radius: 0 0 0px 4px; } + .result-busca-dispositivo ul li .iteminput, .lista-dispositivo ul li .iteminput { + background-color: rgba(0, 0, 0, 0.1); + border-right: 1px solid white; + display: table-cell; + padding: 0.5em; + vertical-align: middle; + text-align: center; } + .result-busca-dispositivo ul li .iteminput input, .lista-dispositivo ul li .iteminput input { + margin: 0; } + .result-busca-dispositivo ul li .itemlabel, .lista-dispositivo ul li .itemlabel { + background-color: rgba(0, 0, 0, 0.1); + display: table-cell; + padding: 0.5em; + vertical-align: middle; + width: 100%; } + .result-busca-dispositivo ul li .itemlabel .artigo, .lista-dispositivo ul li .itemlabel .artigo { + float: none; } + .result-busca-dispositivo .nomenclatura_heranca, .lista-dispositivo .nomenclatura_heranca { + font-size: 90%; + color: #057dba; + display: inline; } + +.lista-dispositivo.controls-radio-checkbox { + border: 0px; } + +.label_vigencia { + border-top: 1px solid white; + display: inline-block; + color: #555; } + .label_vigencia span { + color: gray; } + +.cp-nav-parents > .dropdown-menu { + left: 0; + right: auto; } + .cp-nav-parents > .dropdown-menu::before { + content: ''; + position: absolute; + top: -11px; + width: 100%; + height: 11px; } + +.cp-nav-parents:hover > .dropdown-menu { + display: block; } + +.table-notificacoes tbody tr td { + border-top: 1px solid white; + padding: 5px; + vertical-align: middle; } + .table-notificacoes tbody tr td ul { + margin: 0px; + /*padding: 0px; + list-style: none;*/ } + .table-notificacoes tbody tr td ul li:hover { + background-color: rgba(0, 0, 0, 0.1); } + +.btn-modal-open { + float: right; } + +.class_color_container { + background: #ddd !important; } + +.clear { + clear: both; } + +.mce-tinymce.mce-container { + border: 1px solid #ccc !important; + margin-right: 2px; } + +.mce-btn button:hover { + background-color: rgba(0, 0, 0, 0.1) !important; + text-shadow: 0 0 5px #fff; + box-shadow: 0 0 5px #777; } + +.mce-menu { + background: #eee !important; } + +.displaynone { + display: none !important; } + +@media only screen and (max-width: 800px) { + .cp .fixed { + z-index: 98; + position: relative; } + .cp.cpe1 .dpt-selected { + margin: 1em 0; } + .cp.cpe1 .dpt-selected .csform .actions_parents, .cp.cpe1 .dpt-selected .csform .label_status { + font-size: 80%; + position: static !important; + display: block !important; + padding: 0em; + height: auto !important; + left: 0; + right: auto; + text-align: left; } + .cp.cpe1 .dpt-selected .csform .actions_parents div, .cp.cpe1 .dpt-selected .csform .actions_parents li, .cp.cpe1 .dpt-selected .csform .label_status div, .cp.cpe1 .dpt-selected .csform .label_status li { + display: inline-block !important; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul { + transform: translateY(30px); + transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s; + clip: rect(0, 0, 0, 0); + opacity: 0; + position: absolute; + margin-left: 0.5em; + box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); + -webkit-transition-delay: 0.4s; + /* Safari */ + transition-delay: 0.4s; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul li a { + border-right: 0px !important; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul li:first-child::before { + border-width: 0.375rem; + border-style: inset inset solid; + content: ""; + display: block; + height: 0px; + width: 0px; + border-color: transparent transparent #3385CA; + position: absolute; + top: -0.71rem; + left: 0.9375rem; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul li:first-child:hover::before { + border-color: transparent transparent #0A5EA4; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > ul::after { + content: ""; + position: absolute; + z-index: -1; + left: 0; + top: rem-calc(-25px); + height: rem-calc(25px); + width: 100%; + transition: all 0.3s cubic-bezier(0.55, 0, 0.1, 1); } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li:hover > ul { + transform: translateY(7px); + transition: transform 0.4s linear, opacity 0.4s linear, clip 0s 0.2s; + opacity: 1; + clip: rect(-100px, 2000px, 2000px, -100px); } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a span { + display: none; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-excluir, .cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar, .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar { + padding-left: 0; + min-width: 1em; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-excluir::before, .cp.cpe1 .cp.cpe1_old_apagar .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before, .cp.cpe1_old_apagar .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before, .cp.cpe1 .dpt-selected .csform .actions_inserts > li > a.btn-salvar::before { + width: 100%; + margin: 0; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_in, .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_next, .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_prior { + position: static; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_in > ul { + left: 1em !important; + right: 1em !important; + margin-left: 0; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_in > ul li:first-child::before { + left: 37%; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_next > ul { + left: 0 !important; + right: 1em !important; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_prior > ul { + left: 1em !important; + right: 0 !important; + margin-left: 0; + margin-right: 0.5em; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.add_prior > ul li:first-child::before { + right: 42%; + left: auto; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.menu_excluir > ul { + left: 10% !important; + right: 0 !important; + margin-left: 0; + margin-right: 0.5em; } + .cp.cpe1 .dpt-selected .csform .actions_inserts > li.menu_excluir > ul li:first-child::before { + right: 0; + left: auto; } } + +@media print { + .cp .vigencias, .toggle-topbar, .menu-icon, .button, .tipo-vigencias, .dne { + display: none; } + #btn_font_menos, #btn_font_mais { + display: none; } + .container { + width: 100%; } } diff --git a/sapl/templates/auth/user_list.html b/sapl/templates/auth/user_list.html index b24cb764e..949e544cb 100644 --- a/sapl/templates/auth/user_list.html +++ b/sapl/templates/auth/user_list.html @@ -29,7 +29,6 @@ {% endif %} - Criar Usuário + Criar Usuário - {% include 'paginacao.html'%} {% endblock base_content %} diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 5e768ae4e..b86684e61 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -25,6 +25,8 @@ url: expedientemateria_list - title: {% trans 'Oradores do Expediente' %} url: oradorexpediente_list + - title: {% trans 'Votação em Bloco' %} + url: votacao_bloco_expediente - title: {% trans 'Ordem do Dia' %} children: @@ -32,6 +34,8 @@ url: ordemdia_list - title: {% trans 'Presença Ordem do Dia' %} url: presencaordemdia + - title: {% trans 'Votação em Bloco' %} + url: votacao_bloco_ordemdia - title: {% trans 'Painel Eletrônico' %} url: painel diff --git a/sapl/templates/sessao/votacao/nominal.html b/sapl/templates/sessao/votacao/nominal.html index 96dd28622..27d95c7a0 100644 --- a/sapl/templates/sessao/votacao/nominal.html +++ b/sapl/templates/sessao/votacao/nominal.html @@ -72,46 +72,46 @@ window.history.back(); } - function conta_votos() { - var votos_sim = 0; - var votos_nao = 0; - var votos_abstencao = 0; - var nao_votou = 0; - $('[name=voto_parlamentar]').each(function() { - if (($(this).is(':hidden')) == false) { - switch ($(this).val().substring(0,4)) { - case "Sim:": - votos_sim = votos_sim + 1; - break; - case "Não:": - votos_nao = votos_nao + 1; - break; - case "Abst": - votos_abstencao = votos_abstencao + 1; - break; - case "Não ": - nao_votou = nao_votou + 1; - break; - }; - }; - }); - - $("#soma_votos").empty(); - $("#soma_votos").append("
Sim: " + votos_sim + "
"); - $("#soma_votos").append("
Não: " + votos_nao + "
"); - $("#soma_votos").append("
Abstenções: " + votos_abstencao + "
"); - $("#soma_votos").append("
Ainda não votaram: " + nao_votou + "
"); - var t = setTimeout(function(){ - conta_votos() - }, 500); - } - conta_votos(); - - window.onload = conta_votos(); + function conta_votos() { + var votos_sim = 0; + var votos_nao = 0; + var votos_abstencao = 0; + var nao_votou = 0; + $('[name=voto_parlamentar]').each(function() { + if (($(this).is(':hidden')) == false) { + switch ($(this).val().substring(0,4)) { + case "Sim:": + votos_sim = votos_sim + 1; + break; + case "Não:": + votos_nao = votos_nao + 1; + break; + case "Abst": + votos_abstencao = votos_abstencao + 1; + break; + case "Não ": + nao_votou = nao_votou + 1; + break; + }; + }; + }); + + $("#soma_votos").empty(); + $("#soma_votos").append("
Sim: " + votos_sim + "
"); + $("#soma_votos").append("
Não: " + votos_nao + "
"); + $("#soma_votos").append("
Abstenções: " + votos_abstencao + "
"); + $("#soma_votos").append("
Ainda não votaram: " + nao_votou + "
"); + var t = setTimeout(function(){ + conta_votos() + }, 500); + } + conta_votos(); + + window.onload = conta_votos(); $(window).on('beforeunload', function () { - $("input[type=submit], input[type=button]").prop("disabled", "disabled"); - }); + $("input[type=submit], input[type=button]").prop("disabled", "disabled"); + }); {% endblock extra_js%} diff --git a/sapl/templates/sessao/votacao/votacao_bloco_expediente.html b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html new file mode 100644 index 000000000..55ecdff5a --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_bloco_expediente.html @@ -0,0 +1,173 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags %} + +{% block base_content %} + +
+ {% csrf_token %} +

+ + + + + + + + + +

{% trans "Tipo de Votação" %}

+
+ +
+ +
+
+
+ +
+

Selecione o(s) expediente(s) desejado(s).

+ + + + + + + +
+ +
+ + {% for o in expedientes %} + + + + {% endfor %} +

{% trans "Expediente" %}

+ + +
+ + + + + + + +{% endblock base_content %} + +{% block extra_js %} + + + +{% endblock extra_js%} diff --git a/sapl/templates/sessao/votacao/votacao_bloco_ordem.html b/sapl/templates/sessao/votacao/votacao_bloco_ordem.html new file mode 100644 index 000000000..a2af7dbe9 --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_bloco_ordem.html @@ -0,0 +1,174 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags %} + +{% block base_content %} + +
+ {% csrf_token %} +

+ + + + + + + + + +

{% trans "Tipo de Votação" %}

+
+ +
+ +
+
+
+ +
+

Selecione a(s) ordem(s) do dia desejada(s).

+ + + + + + + +
+ +
+ + {% for o in ordem_dia %} + + + + {% endfor %} +

{% trans "Ordem do dia" %}

+ + +
+ + + + + + + +{% endblock base_content %} + +{% block extra_js %} + + + +{% endblock extra_js%} diff --git a/sapl/templates/sessao/votacao/votacao_nominal_bloco.html b/sapl/templates/sessao/votacao/votacao_nominal_bloco.html new file mode 100644 index 000000000..3a9b74c1d --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_nominal_bloco.html @@ -0,0 +1,149 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags%} + +{% block detail_content %} +
+ {% csrf_token %} + +
+ Votação Nominal + {% if ordens %} + {% for o in ordens %} + +
+ Matéria: {{o.materia}} +
+ Ementa: {{o.materia.ementa|safe}} +
+
+ {% endfor %} + {% else %} + {% for e in expedientes %} + +
+ Matéria: {{e.materia}} +
+ Ementa: {{e.materia.ementa|safe}} +
+
+ {% endfor %} + {% endif %} + {% if total_presentes == 0 %} + + Voltar + {% else %} + +
+ + {% if parlamentares %} + Votos +
+ {% for parlamentar in parlamentares %} +
{{parlamentar.0.nome_parlamentar}}
+
+ {% if parlamentar.1 %} {% endif %} + +
+ {% endfor %} +
+ {% endif %} +
+ Situação da Votação: + +
+ + + + + +
+ +
+
+ Resultado da Votação + +
+
+ +
+
+
+ Observações
+ +
+
+ + + +

+ + + {% endif %} +
+
+{% endblock detail_content %} + +{% block extra_js %} + +{% endblock extra_js%} diff --git a/sapl/templates/sessao/votacao/votacao_simbolica_bloco.html b/sapl/templates/sessao/votacao/votacao_simbolica_bloco.html new file mode 100644 index 000000000..be25d4d69 --- /dev/null +++ b/sapl/templates/sessao/votacao/votacao_simbolica_bloco.html @@ -0,0 +1,80 @@ +{% extends "crud/detail.html" %} +{% load i18n crispy_forms_tags%} + +{% block detail_content %} +
+ {% csrf_token %} + +
+ Votação Simbólica + +
+ {% if ordens %} + {% for o in ordens %} + + Matéria: {{o.materia|safe}} +
+ Ementa: {{o.materia.ementa|safe}} +

+ {% endfor %} + {% else %} + {% for e in expedientes %} + + Matéria: {{e.materia|safe}} +
+ Ementa: {{e.materia.ementa|safe}} +

+ {% endfor %} + {% endif %} + Total presentes: {{total_presentes}} (com presidente) + +
+
+ {% if total_presentes == 0 %} + + Voltar + {% else %} + +
+
Sim:
+
Não:
+
Abstenções:
+
+ +
+
+ A totalização inclui o voto do Presidente? + +
+ +
+ Resultado da Votação + +
+
+ +
+
+ Observações + +
+
+ + + +

+ + + {% endif %} +
+
+{% endblock detail_content %}