diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 0205beaa8..3b910f104 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -45,3 +45,4 @@ channels==2.1.7 git+git://github.com/interlegis/trml2pdf.git git+git://github.com/interlegis/django-admin-bootstrapped +cryptography==2.7 diff --git a/sapl/base/forms.py b/sapl/base/forms.py index e2bdd0ebf..69d8d11bb 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1219,10 +1219,6 @@ class ConfiguracoesAppForm(ModelForm): 'texto_articulado_norma', 'proposicao_incorporacao_obrigatoria', 'protocolo_manual', - 'cronometro_discurso', - 'cronometro_aparte', - 'cronometro_ordem', - 'cronometro_consideracoes', 'mostrar_brasao_painel', 'receber_recibo_proposicao', 'assinatura_ata', @@ -1231,13 +1227,6 @@ class ConfiguracoesAppForm(ModelForm): 'tramitacao_materia', 'tramitacao_documento'] - def __init__(self, *args, **kwargs): - super(ConfiguracoesAppForm, self).__init__(*args, **kwargs) - self.fields['cronometro_discurso'].widget.attrs['class'] = 'cronometro' - self.fields['cronometro_aparte'].widget.attrs['class'] = 'cronometro' - self.fields['cronometro_ordem'].widget.attrs['class'] = 'cronometro' - self.fields['cronometro_consideracoes'].widget.attrs['class'] = 'cronometro' - def clean_mostrar_brasao_painel(self): mostrar_brasao_painel = self.cleaned_data.get( 'mostrar_brasao_painel', False) diff --git a/sapl/base/migrations/0038_auto_20190604_1109.py b/sapl/base/migrations/0038_auto_20190604_1109.py new file mode 100644 index 000000000..edc4703eb --- /dev/null +++ b/sapl/base/migrations/0038_auto_20190604_1109.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-04 14:09 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0037_auto_20190527_0901'), + ] + + operations = [ + migrations.RemoveField( + model_name='appconfig', + name='cronometro_aparte', + ), + migrations.RemoveField( + model_name='appconfig', + name='cronometro_consideracoes', + ), + migrations.RemoveField( + model_name='appconfig', + name='cronometro_discurso', + ), + migrations.RemoveField( + model_name='appconfig', + name='cronometro_ordem', + ), + ] diff --git a/sapl/base/models.py b/sapl/base/models.py index 0171afe49..b152b1711 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -139,26 +139,6 @@ class AppConfig(models.Model): verbose_name=_('Quem deve assina a ata'), max_length=1, choices=ASSINATURA_ATA_CHOICES, default='T') - cronometro_discurso = models.DurationField( - verbose_name=_('Cronômetro do Discurso'), - blank=True, - null=True) - - cronometro_aparte = models.DurationField( - verbose_name=_('Cronômetro do Aparte'), - blank=True, - null=True) - - cronometro_ordem = models.DurationField( - verbose_name=_('Cronômetro da Ordem'), - blank=True, - null=True) - - cronometro_consideracoes = models.DurationField( - verbose_name=_('Cronômetro de Considerações Finais'), - blank=True, - null=True) - mostrar_brasao_painel = models.BooleanField( default=False, verbose_name=_('Mostrar brasão da Casa no painel?')) diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py index 26fd54f4d..35424ddb9 100644 --- a/sapl/base/templatetags/common_tags.py +++ b/sapl/base/templatetags/common_tags.py @@ -241,6 +241,11 @@ def cronometro_to_seconds(value): return AppConfig.attr('cronometro_' + value).seconds +@register.filter +def duration_to_seconds(cronometro_duration): + return cronometro_duration.seconds + + @register.filter def to_list_pk(object_list): return [o.pk for o in object_list] diff --git a/sapl/painel/forms.py b/sapl/painel/forms.py new file mode 100644 index 000000000..619a120d3 --- /dev/null +++ b/sapl/painel/forms.py @@ -0,0 +1,14 @@ +from django import forms +from .models import Cronometro + +class CronometroForm(forms.ModelForm): + + class Meta: + model = Cronometro + fields = ['tipo', 'duracao_cronometro', 'ativo', 'ordenacao'] + + def __init__(self, *args, **kwargs): + super(CronometroForm, self).__init__(*args, **kwargs) + self.fields['duracao_cronometro'].widget.attrs['class'] = 'cronometro' + if not self.instance.ordenacao: + self.fields['ordenacao'].initial = Cronometro.objects.last().ordenacao + 1 \ No newline at end of file diff --git a/sapl/painel/migrations/0003_auto_20190603_1033.py b/sapl/painel/migrations/0003_auto_20190603_1033.py new file mode 100644 index 000000000..7df9c2b83 --- /dev/null +++ b/sapl/painel/migrations/0003_auto_20190603_1033.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-03 13:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('painel', '0002_auto_20180523_1430'), + ] + + operations = [ + migrations.AlterModelOptions( + name='cronometro', + options={'ordering': ['ordenacao'], 'verbose_name': 'Cronômetro', 'verbose_name_plural': 'Cronômetros'}, + ), + migrations.RemoveField( + model_name='cronometro', + name='data_cronometro', + ), + migrations.AddField( + model_name='cronometro', + name='ativo', + field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Ativo?'), + ), + migrations.AddField( + model_name='cronometro', + name='duracao_cronometro', + field=models.DurationField(verbose_name='Duração do cronômetro'), + ), + migrations.AddField( + model_name='cronometro', + name='ordenacao', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Ordenação'), + ), + migrations.AlterField( + model_name='cronometro', + name='status', + field=models.CharField(choices=[('I', 'Start'), ('R', 'Reset'), ('S', 'Stop'), ('C', 'Increment')], default='S', max_length=1, verbose_name='Status do cronômetro'), + ), + migrations.AlterField( + model_name='cronometro', + name='tipo', + field=models.CharField(max_length=100, unique=True, verbose_name='Tipo Cronômetro'), + ), + ] diff --git a/sapl/painel/migrations/0004_auto_20190603_1033.py b/sapl/painel/migrations/0004_auto_20190603_1033.py new file mode 100644 index 000000000..f3256ae61 --- /dev/null +++ b/sapl/painel/migrations/0004_auto_20190603_1033.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-03 13:33 +from __future__ import unicode_literals + +from django.db import migrations + + +def create_default_cronometros(apps, schema_editor): + tipos_default = ['Cronômetro do Discurso', 'Cronômetro do Aparte', + 'Cronômetro da Questão de Ordem', 'Cronômetro de Considerações Finais'] + Cronometro = apps.get_model('painel', 'Cronometro') + + for i,tipo in enumerate(tipos_default): + Cronometro.objects.get_or_create(tipo=tipo, duracao_cronometro='00:05:00', status='S', ativo=True, ordenacao=i+1) + + +class Migration(migrations.Migration): + + dependencies = [ + ('painel', '0003_auto_20190603_1033'), + ] + + operations = [ + migrations.RunPython(create_default_cronometros) + ] diff --git a/sapl/painel/models.py b/sapl/painel/models.py index f999ca480..702fb00fe 100644 --- a/sapl/painel/models.py +++ b/sapl/painel/models.py @@ -1,6 +1,7 @@ import reversion from django.db import models from django.utils.translation import ugettext_lazy as _ +from sapl.utils import YES_NO_CHOICES @reversion.register() @@ -34,6 +35,7 @@ class Cronometro(models.Model): ('I', 'Start'), ('R', 'Reset'), ('S', 'Stop'), + ('C', 'Increment'), ) status = models.CharField( @@ -41,7 +43,25 @@ class Cronometro(models.Model): verbose_name=_('Status do cronômetro'), choices=CRONOMETRO_STATUS, default='S') - data_cronometro = models.DateField(verbose_name=_('Data do cronômetro')) + duracao_cronometro = models.DurationField( + verbose_name=_('Duração do cronômetro')) tipo = models.CharField( - max_length=1, choices=CRONOMETRO_TYPES, - verbose_name=_('Tipo Cronômetro')) + max_length=100, + verbose_name=_('Tipo Cronômetro'), + unique=True) + ativo = models.BooleanField( + default=False, + choices=YES_NO_CHOICES, + verbose_name=_('Ativo?')) + ordenacao = models.PositiveIntegerField( + blank=True, + null=True, + verbose_name=_("Ordenação")) + + class Meta: + verbose_name = _('Cronômetro') + verbose_name_plural = _('Cronômetros') + ordering = ['ordenacao'] + + def __str__(self): + return self.tipo \ No newline at end of file diff --git a/sapl/painel/urls.py b/sapl/painel/urls.py index 0795d0a35..d3921f2e2 100644 --- a/sapl/painel/urls.py +++ b/sapl/painel/urls.py @@ -1,9 +1,9 @@ -from django.conf.urls import url +from django.conf.urls import url, include from .apps import AppConfig from .views import (cronometro_painel, get_dados_painel, painel_mensagem_view, painel_parlamentar_view, painel_view, painel_votacao_view, - switch_painel, verifica_painel, votante_view) + switch_painel, verifica_painel, votante_view, CronometroPainelCrud) app_name = AppConfig.name @@ -20,7 +20,7 @@ urlpatterns = [ url(r'^painel/verifica-painel$', verifica_painel, name="verifica_painel"), url(r'^painel/cronometro$', cronometro_painel, name='cronometro_painel'), - # url(r'^painel/cronometro$', include(CronometroPainelCrud.get_urls())), + url(r'^sistema/cronometro/', include(CronometroPainelCrud.get_urls())), url(r'^voto-individual/$', votante_view, name='voto_individual'), diff --git a/sapl/painel/views.py b/sapl/painel/views.py index 333c3771e..ba1f65493 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -15,7 +15,7 @@ from django.utils.translation import ugettext_lazy as _ from sapl.base.models import AppConfig as ConfiguracoesAplicacao from sapl.base.models import CasaLegislativa -from sapl.crud.base import Crud +from sapl.crud.base import Crud, CrudAux from sapl.painel.apps import AppConfig from sapl.parlamentares.models import Legislatura, Parlamentar, Votante from sapl.sessao.models import (ExpedienteMateria, OradorExpediente, OrdemDia, @@ -24,11 +24,17 @@ from sapl.sessao.models import (ExpedienteMateria, OradorExpediente, OrdemDia, VotoParlamentar) from sapl.utils import filiacao_data, get_client_ip, sort_lista_chave +from .forms import CronometroForm from .models import Cronometro VOTACAO_NOMINAL = 2 -CronometroPainelCrud = Crud.build(Cronometro, '') +class CronometroPainelCrud(CrudAux): + model = Cronometro + + class BaseMixin(CrudAux.BaseMixin): + form_class = CronometroForm + # FIXME mudar lógica @@ -290,7 +296,10 @@ def votante_view(request): @user_passes_test(check_permission) def painel_view(request, pk): - context = {'head_title': str(_('Painel Plenário')), 'sessao_id': pk} + context = {'head_title': str(_('Painel Plenário')), + 'sessao_id': pk, + 'cronometros': Cronometro.objects.filter(ativo=True).order_by('ordenacao') + } return render(request, 'painel/index.html', context) @@ -331,9 +340,20 @@ def painel_votacao_view(request): return render(request, 'painel/votacao.html') +CRONOMETRO_STATUS = { + 'start': 'I', + 'reset': 'R', + 'stop': 'S', + 'increment': 'C' +} + @user_passes_test(check_permission) def cronometro_painel(request): - request.session[request.GET['tipo']] = request.GET['action'] + acao = request.GET['action'] + cronometro_id = request.GET['tipo'].split('cronometro_')[1] + cronometro = Cronometro.objects.get(id=cronometro_id) + cronometro.status = CRONOMETRO_STATUS[acao] + cronometro.save() return HttpResponse({}) @@ -523,15 +543,24 @@ def get_dados_painel(request, pk): if casa and app_config and (bool(casa.logotipo)): brasao = casa.logotipo.url \ if app_config.mostrar_brasao_painel else None + + CRONOMETRO_STATUS = { + 'I': 'start', + 'R': 'reset', + 'S': 'stop', + 'C': 'increment' + } + + dict_status_cronometros = dict(Cronometro.objects.filter(ativo=True).order_by('ordenacao').values_list('id', 'status')) + + for key, value in dict_status_cronometros.items(): + dict_status_cronometros[key] = CRONOMETRO_STATUS[dict_status_cronometros[key]] response = { 'sessao_plenaria': str(sessao), 'sessao_plenaria_data': sessao.data_inicio.strftime('%d/%m/%Y'), 'sessao_plenaria_hora_inicio': sessao.hora_inicio, - 'cronometro_aparte': get_cronometro_status(request, 'aparte'), - 'cronometro_discurso': get_cronometro_status(request, 'discurso'), - 'cronometro_ordem': get_cronometro_status(request, 'ordem'), - 'cronometro_consideracoes': get_cronometro_status(request, 'consideracoes'), + 'cronometros': dict_status_cronometros, 'status_painel': sessao.painel_aberto, 'brasao': brasao } diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 41354d58c..9372b5398 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -31,6 +31,7 @@ from sapl.materia.forms import filtra_tramitacao_status from sapl.materia.models import (Autoria, TipoMateriaLegislativa, Tramitacao) from sapl.materia.views import MateriaLegislativaPesquisaView +from sapl.painel.models import Cronometro from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, Parlamentar, SessaoLegislativa) from sapl.sessao.apps import AppConfig @@ -890,22 +891,18 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): if request.user.is_anonymous(): self.template_name = 'painel/index.html' - request.session['discurso'] = 'stop' - request.session['aparte'] = 'stop' - request.session['ordem'] = 'stop' - request.session['consideracoes'] = 'stop' + cronometros = Cronometro.objects.filter(ativo=True).order_by('ordenacao') + for cronometro in cronometros: + cronometro.status = 'S' # Stop + cronometro.save() return TemplateView.get(self, request, *args, **kwargs) def get_context_data(self, **kwargs): - cronometro_discurso = AppsAppConfig.attr('cronometro_discurso') - cronometro_aparte = AppsAppConfig.attr('cronometro_aparte') - cronometro_ordem = AppsAppConfig.attr('cronometro_ordem') - cronometro_consideracoes = AppsAppConfig.attr( - 'cronometro_consideracoes') - if (not cronometro_discurso or not cronometro_aparte - or not cronometro_ordem or not cronometro_consideracoes): + cronometros = Cronometro.objects.filter(ativo=True).order_by('ordenacao') + + if not cronometros: username = self.request.user.username self.logger.error('user=' + username + '. Você precisa primeiro configurar os cronômetros' @@ -915,22 +912,13 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): nas Configurações da Aplicação') messages.add_message(self.request, messages.ERROR, msg) - else: - cronometro_discurso = cronometro_discurso.seconds - cronometro_aparte = cronometro_aparte.seconds - cronometro_ordem = cronometro_ordem.seconds - cronometro_consideracoes = cronometro_consideracoes.seconds - context = TemplateView.get_context_data(self, **kwargs) context.update({ 'head_title': str(_('Painel Plenário')), 'sessao_id': kwargs['pk'], 'root_pk': kwargs['pk'], 'sessaoplenaria': SessaoPlenaria.objects.get(pk=kwargs['pk']), - 'cronometro_discurso': cronometro_discurso, - 'cronometro_aparte': cronometro_aparte, - 'cronometro_ordem': cronometro_ordem, - 'cronometro_consideracoes': cronometro_consideracoes}) + 'cronometros': cronometros}) return context diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index b3b0daca0..c970f91b9 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -34,10 +34,6 @@ AppConfig: {% trans 'Assinaturas' %}: - assinatura_ata - {% trans 'Cronômetros do Painel' %}: - - cronometro_discurso cronometro_aparte - - cronometro_ordem cronometro_consideracoes - {% trans 'Configurações do Painel' %}: - mostrar_brasao_painel diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index ebe873366..9b02fb73a 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/sapl/templates/menu_tabelas_auxiliares.yaml @@ -167,6 +167,12 @@ - title: {% trans 'Tipo de Justificativa' %} url: sapl.sessao:tipojustificativa_list css_class: btn btn-link +- title: {% trans 'Módulo Painel' %} + css_class: head_title + children: + - title: {% trans 'Cronômetro' %} + url: sapl.painel:cronometro_list + css_class: btn btn-link - title: {% trans 'Módulo LexML' %} css_class: head_title children: diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 476e700c8..e250a0c41 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -21,7 +21,6 @@ {% render_bundle 'painel' 'css' %} {% endblock webpack_loader_css %} - - - - -
-

-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-

+ + +
+

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

Parlamentares

- -
+
+ +
+

+
+ +
+
+
+
+ +
+
+
+
+

Parlamentares

+ +
+
+
+
+

Oradores

+
-
-
-

Oradores

- -
-
-

Cronômetros

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

{% if cronometros|length == 1 %}Cronômetro{% elif cronometros|length > 1%}Cronômetros{% endif %}

+
+ {% for cronometro in cronometros %} + {{cronometro}}:
+ {% endfor %}
+
-
-

Resultado

- -

-

+
+

Resultado

+ +

+

-
-

Matéria em Votação

- - -
+
+

Matéria em Votação

+ +
+
- -
+
{% block webpack_loader_js %} @@ -122,89 +117,47 @@ var n = d.toLocaleDateString(); document.getElementById("date").innerHTML = n; - $(document).ready(function() { - //TODO: replace by a fancy jQuery clock - function checkTime(i) { - if (i<10) {i = "0" + i}; // add zero in front of numbers < 10 - return i; - } - function startTime() { - var today=new Date(); - var h=today.getHours(); - var m=today.getMinutes(); - var s=today.getSeconds(); - m = checkTime(m); - s = checkTime(s); - $("#relogio").text(h+":"+m+":"+s) - var t = setTimeout(function(){ - startTime() - }, 500); - } - startTime(); - - var audioAlertFinish = document.getElementById("audio"); - - $('#cronometro_discurso').runner({ - autostart: false, - countdown: true, - startAt: {{ 'discurso'|cronometro_to_seconds }} * 1000, - stopAt: 0, - milliseconds: false, - format: function(value) { - let h = Math.floor((value/1000) / 3600); - h = checkTime(h); - let m = Math.floor((value/1000) % 3600 / 60); - m = checkTime(m); - let s = Math.floor((value/1000) % 3600 % 60); - s = checkTime(s); - return h.toString() + ":" + m.toString() + ":" + s.toString(); - } - }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + function checkTime(i) { + if (i<10) {i = "0" + i}; // add zero in front of numbers < 10 + return i; + } + + function startTime() { + var today=new Date(); + var h=today.getHours(); + var m=today.getMinutes(); + var s=today.getSeconds(); + m = checkTime(m); + s = checkTime(s); + $("#relogio").text(h+":"+m+":"+s) + var t = setTimeout(function(){ + startTime() + }, 500); + } + + function show_voto(voto) { + if (voto == "Sim"){ + return ' Sim ' + } + else if (voto == "Não"){ + return ' Não ' + } + return voto + } - $('#cronometro_aparte').runner({ - autostart: false, - countdown: true, - startAt: {{ 'aparte'|cronometro_to_seconds }} * 1000, - stopAt: 0, - milliseconds: false, - format: function(value) { - let h = Math.floor((value/1000) / 3600); - h = checkTime(h); - let m = Math.floor((value/1000) % 3600 / 60); - m = checkTime(m); - let s = Math.floor((value/1000) % 3600 % 60); - s = checkTime(s); - return h.toString() + ":" + m.toString() + ":" + s.toString(); - } - }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + $(document).ready(function() { + //TODO: replace by a fancy jQuery clock + startTime(); - $('#cronometro_ordem').runner({ - autostart: false, - countdown: true, - startAt: {{ 'ordem'|cronometro_to_seconds }} * 1000, - stopAt: 0, - milliseconds: false, - format: function(value) { - let h = Math.floor((value/1000) / 3600); - h = checkTime(h); - let m = Math.floor((value/1000) % 3600 / 60); - m = checkTime(m); - let s = Math.floor((value/1000) % 3600 % 60); - s = checkTime(s); - return h.toString() + ":" + m.toString() + ":" + s.toString(); - } - }).on('runnerFinish', function(eventObject, info){ - audioAlertFinish.play(); - }); + var audioAlertFinish = document.getElementById("audio"); - $('#cronometro_consideracoes').runner({ + var cronometros_previous = []; + {% for cron in cronometros %} + cronometros_previous.push(0); + $('#cronometro_' + "{{cron.id}}").runner({ autostart: false, countdown: true, - startAt: {{ 'consideracoes'|cronometro_to_seconds }} * 1000, + startAt: {{cron.duracao_cronometro|duration_to_seconds}} * 1000, stopAt: 0, milliseconds: false, format: function(value) { @@ -218,15 +171,11 @@ } }).on('runnerFinish', function(eventObject, info){ audioAlertFinish.play(); - }); - - var discurso_previous; - var ordem_previous; - var aparte_previous; - var consideracoes_previous; + }) + {% endfor %} - var counter = 1; - (function poll() { + var counter = 1; + (function poll() { $.ajax({ url: "{% url 'sapl.painel:dados_painel' sessao_id %}", type: "GET", @@ -236,8 +185,7 @@ $("#sessao_plenaria_hora_inicio").text("Hora Início: " + data["sessao_plenaria_hora_inicio"]) if (data["status_painel"] == false) { $("#message").text("PAINEL ENCONTRA-SE FECHADO"); - } - else { + } else { $("#message").text(""); } @@ -256,56 +204,52 @@ var presentes_list = data["presentes"]; if (data["status_painel"] == true) { - presentes.append(''); - $.each(presentes_list, function (index, parlamentar) { - - - if (parlamentar.voto == 'Voto Informado'){ - $('#parlamentares_list').append('') - } - else{ - $('#parlamentares_list').append('') - } + presentes.append('
' + - parlamentar.nome + - ' ' + - parlamentar.partido + ' ' - + '
' + - parlamentar.nome + - ' ' + - parlamentar.partido + ' ' - + show_voto(parlamentar.voto) + '
'); + $.each(presentes_list, function (index, parlamentar) { + + if (parlamentar.voto == 'Voto Informado'){ + $('#parlamentares_list').append('') + } else{ + $('#parlamentares_list').append('') + } + }); + + presentes.append('
' + + parlamentar.nome + + ' ' + + parlamentar.partido + ' ' + + '
' + + parlamentar.nome + + ' ' + + parlamentar.partido + ' ' + + show_voto(parlamentar.voto) + '
') + if (data["oradores"].length > 0){ + $('#aparecer_oradores').show(); + oradores.append(''); + $.each(oradores_list, function (index, orador) { + $('#oradores_list').append('') }); - presentes.append('
' + + orador.numero + 'º  ' + + orador.nome +'
') - - if (data["oradores"].length > 0){ - $('#aparecer_oradores').show(); - oradores.append(''); - $.each(oradores_list, function (index, orador) { - $('#oradores_list').append('') - }); - oradores.append('
' + - orador.numero + 'º  ' + - orador.nome +'
'); - } - else { - $('#aparecer_oradores').hide(); - } - } - else{ - presentes.append(''); - $('#parlamentares_list').append( - '
A listagem de parlamentares só aparecerá quando o painel estiver aberto.
') - presentes.append('
'); - - oradores.append(''); - $('#oradores_list').append( - '
A listagem de oradores só aparecerá quando o painel estiver aberto.
') - oradores.append('
'); - - votacao.append(''); - $("#votacao").append('
A votação só aparecerá quando o painel estiver aberto
'); - votacao.append('
'); + oradores.append(''); + } else { + $('#aparecer_oradores').hide(); + } + } else{ + presentes.append(''); + $('#parlamentares_list').append( + '
A listagem de parlamentares só aparecerá quando o painel estiver aberto.
') + presentes.append('
'); + + oradores.append(''); + $('#oradores_list').append( + '
A listagem de oradores só aparecerá quando o painel estiver aberto.
') + oradores.append('
'); + + votacao.append(''); + $("#votacao").append('
A votação só aparecerá quando o painel estiver aberto
'); + votacao.append('
'); } if (data['materia_legislativa_texto'] && data["status_painel"] == true){ @@ -319,77 +263,39 @@ votacao.append("
  • Abstenções: " + data["numero_abstencoes"] + "
  • ") votacao.append("
  • Presentes: " + num_presentes + "
  • ") votacao.append("
  • Total votos: " + data["total_votos"] + "
  • ") - } - - else{ + } else{ $("#votacao").append('
    Não há votação, pois não há nenhuma matéria aberta ou já votada.
    '); + }; + + var ids = []; + var status_cronometros = [] + for (var key in data['cronometros']) { + if (data['cronometros'].hasOwnProperty(key)) { + ids.push(key); + status_cronometros.push(data['cronometros'][key]) + } } - var discurso_current = data["cronometro_discurso"]; - if (!discurso_previous){ - discurso_previous = '' - } - - if (discurso_current != discurso_previous) { - $('#cronometro_discurso').runner(discurso_current); - discurso_previous = discurso_current; - } - - var aparte_current = data["cronometro_aparte"]; - if (!aparte_previous){ - aparte_previous = '' - } - - if (aparte_current != aparte_previous) { - $('#cronometro_aparte').runner(aparte_current); - aparte_previous = aparte_current; - } - - var ordem_current = data["cronometro_ordem"]; - if (!ordem_previous){ - ordem_previous = '' - } - - if (ordem_current != ordem_previous) { - $('#cronometro_ordem').runner(ordem_current); - ordem_previous = ordem_current; - } - - var consideracoes_current = data["cronometro_consideracoes"]; - if (!consideracoes_previous){ - consideracoes_previous = '' - } - - if (consideracoes_current != consideracoes_previous) { - $('#cronometro_consideracoes').runner(consideracoes_current); - consideracoes_previous = consideracoes_current; - } - - if($('#cronometro_discurso').runner('info').formattedTime == "00:00:30") { - audioAlertFinish.play(); - } - - if($('#cronometro_aparte').runner('info').formattedTime == "00:00:30") { - audioAlertFinish.play(); - } - - if($('#cronometro_ordem').runner('info').formattedTime == "00:00:30") { - audioAlertFinish.play(); - } + for(let i=0; i 151) { $("#observacao_materia").text(texto.substr(0, 145).concat('(...)')); - } - else{ + } else{ $("#observacao_materia").text(texto); } - } - else{ + } else{ $("#observacao_materia").text(''); } @@ -410,36 +314,25 @@ $("#resultado_votacao").text(data["tipo_resultado"]); $("#resultado_votacao").css("color", "#45919D"); var resultado_votacao_upper = $("#resultado_votacao").text().toUpperCase(); - if (resultado_votacao_upper.search("APROV") != -1){ - $("#resultado_votacao").css("color", "green"); - } - if (resultado_votacao_upper.search("REJEIT") != -1){ - $("#resultado_votacao").css("color", "red"); - } - } - else{ + if (resultado_votacao_upper.search("APROV") != -1){ + $("#resultado_votacao").css("color", "green"); + } + if (resultado_votacao_upper.search("REJEIT") != -1){ + $("#resultado_votacao").css("color", "red"); + } + } else{ $("#resultado_votacao").text(''); } - }, - error: function(err) { - console.error(err); - }, - dataType: "json", - complete: setTimeout(function() {poll()}, 500), - timeout: 20000 // TODO: decrease + }, + error: function(err) { + console.error(err); + }, + dataType: "json", + complete: setTimeout(function() {poll()}, 500), + timeout: 20000 // TODO: decrease }) })(); - }); - - function show_voto(voto) { - if (voto == "Sim"){ - return ' Sim ' - } - else if (voto == "Não"){ - return ' Não ' - } - return voto - } + }); diff --git a/sapl/templates/painel/layouts.yaml b/sapl/templates/painel/layouts.yaml index e0d01ac66..0238e74db 100644 --- a/sapl/templates/painel/layouts.yaml +++ b/sapl/templates/painel/layouts.yaml @@ -1,4 +1,4 @@ {% load i18n %} Cronometro: {% trans 'Cronometro' %}: - - status:3 data_cronometro:6 tipo + - tipo:4 duracao_cronometro:4 ativo:2 ordenacao:2 \ No newline at end of file diff --git a/sapl/templates/sessao/painel.html b/sapl/templates/sessao/painel.html index 44f345a75..e6b52dd2f 100644 --- a/sapl/templates/sessao/painel.html +++ b/sapl/templates/sessao/painel.html @@ -1,7 +1,11 @@ {% extends "crud/detail.html" %} {% load i18n %} +{% load common_tags %} {% load staticfiles %} + {% load webpack_static from webpack_loader %} +{% load render_bundle from webpack_loader %} + {% block actions %} {% endblock %} {% block title %} @@ -25,361 +29,145 @@

    Operação do Painel Eletrônico


    -
    -

    Cronômetro do Discurso

    -
    -
    -
    -
    -
    + {% for cronometro in cronometros %} -
    -
    -
    -
    + -

    -
    -

    Cronômetro do Aparte

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

    -
    -

    Cronômetro da Questão de Ordem

    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -

    Cronômetro de Considerações Finais

    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -

    +

    + {% endfor %}
    +

    {% endblock detail_content %} {% block extra_js %}