Browse Source

Altera view do painel em Sessao

pull/2829/head
Cesar Carvalho 7 years ago
parent
commit
97f645958a
  1. 5
      sapl/base/templatetags/common_tags.py
  2. 14
      sapl/painel/migrations/0003_auto_20190603_1033.py
  3. 8
      sapl/painel/migrations/0004_auto_20190603_1033.py
  4. 14
      sapl/painel/models.py
  5. 29
      sapl/sessao/views.py
  6. 2
      sapl/templates/painel/layouts.yaml
  7. 445
      sapl/templates/sessao/painel.html

5
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]

14
sapl/painel/migrations/0003_auto_20190603_1009.py → sapl/painel/migrations/0003_auto_20190603_1033.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-06-03 13:09
# Generated by Django 1.11.20 on 2019-06-03 13:33
from __future__ import unicode_literals
from django.db import migrations, models
@ -14,17 +14,27 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='cronometro',
options={'ordering': ['tipo'], 'verbose_name': 'Cronômetro', 'verbose_name_plural': 'Cronômetros'},
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(blank=True, null=True, 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',

8
sapl/painel/migrations/0004_auto_20190603_1010.py → sapl/painel/migrations/0004_auto_20190603_1033.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-06-03 13:10
# Generated by Django 1.11.20 on 2019-06-03 13:33
from __future__ import unicode_literals
from django.db import migrations
@ -9,14 +9,16 @@ def create_default_cronometros(apps, schema_editor):
tipos_default = ['Cronômetro do Discurso', 'Cronômetro do Aparte',
'Cronômetro da Ordem', 'Cronômetro de Considerações Finais']
Cronometro = apps.get_model('painel', 'Cronometro')
cont = 1
for tipo in tipos_default:
Cronometro.objects.get_or_create(tipo=tipo, duracao_cronometro='00:30:00', status='S')
Cronometro.objects.get_or_create(tipo=tipo, duracao_cronometro='00:30:00', status='S', ativo=True, ordenacao=cont)
cont += 1
class Migration(migrations.Migration):
dependencies = [
('painel', '0003_auto_20190603_1009'),
('painel', '0003_auto_20190603_1033'),
]
operations = [

14
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()
@ -46,14 +47,23 @@ class Cronometro(models.Model):
verbose_name=_('Duração do cronômetro'),
blank=True,
null=True)
tipo = models.CharField(max_length=100,
tipo = models.CharField(
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 = ['tipo']
ordering = ['ordenacao']
def __str__(self):
return self.tipo

29
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
@ -874,6 +875,8 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
if request.user.is_anonymous():
self.template_name = 'painel/index.html'
# import ipdb; ipdb.set_trace()
request.session['discurso'] = 'stop'
request.session['aparte'] = 'stop'
request.session['ordem'] = 'stop'
@ -882,14 +885,15 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
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')
# cronometro_discurso = AppsAppConfig.attr('cronometro_discurso')
# cronometro_aparte = AppsAppConfig.attr('cronometro_aparte')
# cronometro_ordem = AppsAppConfig.attr('cronometro_ordem')
# cronometro_consideracoes = AppsAppConfig.attr(
# 'cronometro_consideracoes')
cronometros = Cronometro.objects.all().order_by('ordenacao')
if (not cronometro_discurso or not cronometro_aparte
or not cronometro_ordem or not cronometro_consideracoes):
if not cronometros:
username = self.request.user.username
self.logger.error('user=' + username + '. Você precisa primeiro configurar os cronômetros'
@ -899,22 +903,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

2
sapl/templates/painel/layouts.yaml

@ -1,4 +1,4 @@
{% load i18n %}
Cronometro:
{% trans 'Cronometro' %}:
- tipo:6 duracao_cronometro:6
- tipo:4 duracao_cronometro:4 ativo:2 ordenacao:2

445
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,67 +29,25 @@
<h1>Operação do Painel Eletrônico</h1>
<h2><span id="relogio"></span></h2>
<br />
<div class="row">
<div class="col-md-12 mb-2"><h3>Cronômetro do Discurso</h3></div>
</div>
<div class="row">
<div class="col-md-2"><input size="2" id="discurso" name="discurso" value="" readyonly="true" class="form-control"></div>
</div>
<br />
<div class="row">
<div class="col-md-6"><button type="button" id="discursoStart" class="btn btn-success">Iniciar</button></div>
<div class="col-md-6"><button type="button" id="discursoReset" class="btn btn-success">Reiniciar</button></div>
</div>
<br /><br >
<div class="row">
<div class="col-md-12 mb-2"><h3>Cronômetro do Aparte</h3></div>
</div>
<div class="row">
<div class="col-md-2"><input size="2" id="aparte" name="aparte" value="" readyonly="true" class="form-control"></div>
</div>
<br />
<div class="row">
<div class="col-md-6"><button type="button" id="aparteStart" class="btn btn-success">Iniciar</button></div>
<div class="col-md-6"><button type="button" id="aparteReset" class="btn btn-success" class="btn btn-success">Reiniciar</button></div>
</div>
{% for cronometro in cronometros %}
<br /><br >
<div class="row">
<div class="col-md-12 mb-2"><h3>Cronômetro da Questão de Ordem </h3></div>
</div>
<div class="row">
<div class="col-md-12 mb-2"><h3>{{cronometro}}</h3></div>
</div>
<div class="row">
<div class="col-md-2"><input size="2" id="ordem" name="ordem" value="" readyonly="true" class="form-control"></div>
</div>
<br />
<div class="row">
<div class="col-md-2"><input size="2" id="cronometro_{{cronometro.id}}" name="{{cronometro.tipo}}" value="" readyonly="true" class="form-control"></div>
</div>
<br />
<div class="row">
<div class="col-md-6"><button type="button" id="ordemStart" class="btn btn-success">Iniciar</button></div>
<div class="col-md-6"><button type="button" id="ordemReset" class="btn btn-success">Reiniciar</button></div>
</div>
<div class="row">
<div class="col-md-6"><button type="button" id="cronometro_{{cronometro.id}}_Start" class="btn btn-success">Iniciar</button></div>
<div class="col-md-6"><button type="button" id="cronometro_{{cronometro.id}}_Reset" class="btn btn-success">Reiniciar</button></div>
</div>
<br/>
<br/>
<div class="row">
<div class="col-md-12 mb-2"><h3>Cronômetro de Considerações Finais</h3></div>
</div>
<div class="row">
<div class="col-md-4"><input size="2" id="consideracoes" name="consideracoes" value="" readyonly="true" class="form-control"></div>
</div>
<br />
<div class="row">
<div class="col-md-6"><button type="button" id="consideracoesStart" class="btn btn-success">Iniciar</button></div>
<div class="col-md-6"><button type="button" id="consideracoesReset" class="btn btn-success">Reiniciar</button></div>
</div>
<br /><br >
<br><br>
{% endfor %}
<div class="row">
<div class="col-md-6"><button type="button" id="sinalSonoro" class="btn btn-success" onclick="document.getElementById('audio').play();">Sinal Sonoro</button></div>
@ -95,291 +57,124 @@
{% block extra_js %}
<script language="JavaScript">
$(function() {
function checkTime(i) {
if (i<10) {i = "0" + i};
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");
$('#discurso').prop('disabled', false);
$('#aparte').prop('disabled', false);
$('#ordem').prop('disabled', false);
$('#consideracoes').prop('disabled', false);
$('#discurso').runner({
autostart: false,
countdown: true,
startAt: {{cronometro_discurso}} * 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){
$.get('/painel/cronometro', { tipo: 'discurso', action: 'stop' } );
audioAlertFinish.play();
$('#discursoReset').show();
$('#discurso').runner('stop');
$('#discursoStart').text('Iniciar');
});
$('#discursoStart').click(function() {
if ($('#discursoStart').text() == 'Iniciar'){
$.get('/painel/cronometro', { tipo: 'discurso', action: 'start' } );
$('#discursoReset').hide();
$('#discurso').runner('start');
$('#discursoStart').text('Parar');
} else {
$.get('/painel/cronometro', { tipo: 'discurso', action: 'stop' } );
$('#discursoReset').show();
$('#discurso').runner('stop');
$('#discursoStart').text('Iniciar');
}
});
$('#discursoReset').click(function() {
$.get('/painel/cronometro', { tipo: 'discurso', action: 'reset' } );
$('#discurso').runner('stop');
$('#discurso').runner('reset');
});
$('#aparte').runner({
autostart: false,
countdown: true,
startAt: {{cronometro_aparte}} * 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){
$.get('/painel/cronometro', { tipo: 'aparte', action: 'stop' } );
audioAlertFinish.play();
$('#aparteReset').show();
$('#aparte').runner('stop');
$('#aparteStart').text('Iniciar');
});
$('#aparteStart').click(function(){
if ($('#aparteStart').text() == 'Iniciar') {
$.get('/painel/cronometro', { tipo: 'aparte', action: 'start' } );
$('#aparteReset').hide();
$('#aparte').runner('start');
$('#aparteStart').text('Parar');
} else {
$.get('/painel/cronometro', { tipo: 'aparte', action: 'stop' } );
$('#aparteReset').show();
$('#aparte').runner('stop');
$('#aparteStart').text('Iniciar');
}
});
$('#aparteReset').click(function() {
$.get('/painel/cronometro', { tipo: 'aparte', action: 'reset' } );
$('#aparte').runner('stop');
$('#aparte').runner('reset');
});
$('#ordem').runner({
autostart: false,
countdown: true,
startAt: {{cronometro_ordem}} * 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){
$.get('/painel/cronometro', { tipo: 'ordem', action: 'stop' } );
audioAlertFinish.play();
$('#ordemReset').show();
$('#ordem').runner('stop');
$('#ordemStart').text('Iniciar');
});
$('#ordemStart').click(function() {
if ($('#ordemStart').text() == 'Iniciar') {
$.get('/painel/cronometro', { tipo: 'ordem', action: 'start' } );
$('#ordemReset').hide();
$('#ordem').runner('start');
$('#ordemStart').text('Parar');
} else {
$.get('/painel/cronometro', { tipo: 'ordem', action: 'stop' } );
$('#ordemReset').show();
$('#ordem').runner('stop');
$('#ordemStart').text('Iniciar');
}
});
$('#ordemReset').click(function() {
$.get('/painel/cronometro', { tipo: 'ordem', action: 'reset' } );
$('#ordem').runner('stop');
$('#ordem').runner('reset');
});
$('#consideracoes').runner({
autostart: false,
countdown: true,
startAt: {{cronometro_consideracoes}} * 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){
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'stop' } );
audioAlertFinish.play();
$('#consideracoesReset').show();
$('#consideracoes').runner('stop');
$('#consideracoesStart').text('Iniciar');
});
$('#consideracoesStart').click(function(){
if ($('#consideracoesStart').text() == 'Iniciar') {
function switch_painel(aberto) {
let pk_sessao = {{root_pk}};
let botao_abrir = $('#id_abrir_painel');
let botao_fechar = $('#id_fechar_painel');
$.ajax({
data: {pk_sessao: pk_sessao, aberto: aberto},
type: 'POST',
url: "{% url 'sapl.painel:switch_painel' %}",
headers: {'X-CSRFToken': getCookie('csrftoken')},
});
if (aberto) {
botao_abrir.hide();
botao_fechar.show();
} else {
botao_abrir.show();
botao_fechar.hide();
}
}
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'start' } );
function checkTime(i) {
if (i<10) {
i = "0" + i
};
return i;
}
$('#consideracoesReset').hide();
$('#consideracoes').runner('start');
$('#consideracoesStart').text('Parar');
function startTime() {
let today=new Date();
let h=today.getHours();
let m=today.getMinutes();
let s=today.getSeconds();
m = checkTime(m);
s = checkTime(s);
$("#relogio").text(h+":"+m+":"+s)
let t = setTimeout(function(){
startTime()
},500);
}
$(document).ready(function(){
let pk_sessao = {{root_pk}};
let botao_abrir = $('#id_abrir_painel');
let botao_fechar = $('#id_fechar_painel');
$.ajax({
data: {pk_sessao: pk_sessao},
type: 'GET',
dataType: 'json',
url: "{% url 'sapl.painel:verifica_painel' %}",
error: function () {
alert("Erro ao verificar o Painel");
},
success: function (data) {
if (data['status']) {
botao_abrir.hide();
botao_fechar.show();
} else {
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'stop' } );
$('#consideracoesReset').show();
$('#consideracoes').runner('stop');
$('#consideracoesStart').text('Iniciar');
botao_abrir.show();
botao_fechar.hide();
}
});
},
});
$('#consideracoesReset').click(function() {
startTime();
let audioAlertFinish = document.getElementById("audio");
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'reset' } );
{% for cron in cronometros %}
cronometro = "cronometro_" + "{{cron.id}}";
$('#consideracoes').runner('stop');
$('#consideracoes').runner('reset');
});
$('#' + cronometro).prop('disabled', false);
});
function switch_painel(aberto) {
var pk_sessao = {{root_pk}};
var botao_abrir = $('#id_abrir_painel');
var botao_fechar = $('#id_fechar_painel');
cronometroStart = '#' + cronometro + '_Start';
cronometroReset = '#' + cronometro + '_Reset';
duracao = {{cron.duracao_cronometro|duration_to_seconds}};
console.log(cronometro, duracao, cronometroStart, cronometroReset);
$.ajax({
data: {pk_sessao: pk_sessao, aberto: aberto},
type: 'POST',
url: "{% url 'sapl.painel:switch_painel' %}",
headers: {'X-CSRFToken': getCookie('csrftoken')},
$('#' + cronometro).runner({
autostart: false,
countdown: true,
startAt: duracao * 1000,
stopAt: 0,
milliseconds: false
}).on('runnerFinish', function(eventObject, info){
$.get('/painel/cronometro', { tipo: cronometro, action: 'stop' } );
audioAlertFinish.play();
$(cronometroReset).show();
$('#' + cronometro).runner('stop');
$(cronometroStart).text('Iniciar');
})
$(cronometroStart).click(function() {
if ($(cronometroStart).text() == 'Iniciar'){
$.get('/painel/cronometro', { tipo: cronometro, action: 'start' } );
$(cronometroReset).hide();
$('#' + cronometro).runner('start');
$(cronometroStart).text('Parar');
} else{
$.get('/painel/cronometro', { tipo: cronometro, action: 'stop' } );
$(cronometroReset).show();
$('#' + cronometro).runner('stop');
$(cronometroStart).text('Iniciar');
}
});
if (aberto) {
botao_abrir.hide();
botao_fechar.show();
} else {
botao_abrir.show();
botao_fechar.hide();
}
}
$(cronometroReset).click(function() {
$(document).ready(function(){
var pk_sessao = {{root_pk}};
var botao_abrir = $('#id_abrir_painel');
var botao_fechar = $('#id_fechar_painel');
$.ajax({
data: {pk_sessao: pk_sessao},
type: 'GET',
dataType: 'json',
url: "{% url 'sapl.painel:verifica_painel' %}",
error: function () {
alert("Erro ao verificar o Painel");
},
success: function (data) {
if (data['status']) {
botao_abrir.hide();
botao_fechar.show();
} else {
botao_abrir.show();
botao_fechar.hide();
}
},
});
$.get('/painel/cronometro', { tipo: cronometro, action: 'reset' } );
$('#' + cronometro).runner('stop');
$('#' + cronometro).runner('reset');
});
{% endfor %}
});

Loading…
Cancel
Save