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. 383
      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 return AppConfig.attr('cronometro_' + value).seconds
@register.filter
def duration_to_seconds(cronometro_duration):
return cronometro_duration.seconds
@register.filter @register.filter
def to_list_pk(object_list): def to_list_pk(object_list):
return [o.pk for o in 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 -*- # -*- 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 __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -14,17 +14,27 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='cronometro', 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( migrations.RemoveField(
model_name='cronometro', model_name='cronometro',
name='data_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( migrations.AddField(
model_name='cronometro', model_name='cronometro',
name='duracao_cronometro', name='duracao_cronometro',
field=models.DurationField(blank=True, null=True, verbose_name='Duração do cronômetro'), 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( migrations.AlterField(
model_name='cronometro', model_name='cronometro',
name='status', 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 -*- # -*- 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 __future__ import unicode_literals
from django.db import migrations 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', tipos_default = ['Cronômetro do Discurso', 'Cronômetro do Aparte',
'Cronômetro da Ordem', 'Cronômetro de Considerações Finais'] 'Cronômetro da Ordem', 'Cronômetro de Considerações Finais']
Cronometro = apps.get_model('painel', 'Cronometro') Cronometro = apps.get_model('painel', 'Cronometro')
cont = 1
for tipo in tipos_default: 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): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('painel', '0003_auto_20190603_1009'), ('painel', '0003_auto_20190603_1033'),
] ]
operations = [ operations = [

14
sapl/painel/models.py

@ -1,6 +1,7 @@
import reversion import reversion
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from sapl.utils import YES_NO_CHOICES
@reversion.register() @reversion.register()
@ -46,14 +47,23 @@ class Cronometro(models.Model):
verbose_name=_('Duração do cronômetro'), verbose_name=_('Duração do cronômetro'),
blank=True, blank=True,
null=True) null=True)
tipo = models.CharField(max_length=100, tipo = models.CharField(
max_length=100,
verbose_name=_('Tipo Cronômetro'), verbose_name=_('Tipo Cronômetro'),
unique=True) 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: class Meta:
verbose_name = _('Cronômetro') verbose_name = _('Cronômetro')
verbose_name_plural = _('Cronômetros') verbose_name_plural = _('Cronômetros')
ordering = ['tipo'] ordering = ['ordenacao']
def __str__(self): def __str__(self):
return self.tipo 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, from sapl.materia.models import (Autoria, TipoMateriaLegislativa,
Tramitacao) Tramitacao)
from sapl.materia.views import MateriaLegislativaPesquisaView from sapl.materia.views import MateriaLegislativaPesquisaView
from sapl.painel.models import Cronometro
from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato, from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
Parlamentar, SessaoLegislativa) Parlamentar, SessaoLegislativa)
from sapl.sessao.apps import AppConfig from sapl.sessao.apps import AppConfig
@ -874,6 +875,8 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
if request.user.is_anonymous(): if request.user.is_anonymous():
self.template_name = 'painel/index.html' self.template_name = 'painel/index.html'
# import ipdb; ipdb.set_trace()
request.session['discurso'] = 'stop' request.session['discurso'] = 'stop'
request.session['aparte'] = 'stop' request.session['aparte'] = 'stop'
request.session['ordem'] = 'stop' request.session['ordem'] = 'stop'
@ -882,14 +885,15 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
return TemplateView.get(self, request, *args, **kwargs) return TemplateView.get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
cronometro_discurso = AppsAppConfig.attr('cronometro_discurso') # cronometro_discurso = AppsAppConfig.attr('cronometro_discurso')
cronometro_aparte = AppsAppConfig.attr('cronometro_aparte') # cronometro_aparte = AppsAppConfig.attr('cronometro_aparte')
cronometro_ordem = AppsAppConfig.attr('cronometro_ordem') # cronometro_ordem = AppsAppConfig.attr('cronometro_ordem')
cronometro_consideracoes = AppsAppConfig.attr( # cronometro_consideracoes = AppsAppConfig.attr(
'cronometro_consideracoes') # 'cronometro_consideracoes')
cronometros = Cronometro.objects.all().order_by('ordenacao')
if (not cronometro_discurso or not cronometro_aparte if not cronometros:
or not cronometro_ordem or not cronometro_consideracoes):
username = self.request.user.username username = self.request.user.username
self.logger.error('user=' + username + '. Você precisa primeiro configurar os cronômetros' 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') nas Configurações da Aplicação')
messages.add_message(self.request, messages.ERROR, msg) 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 = TemplateView.get_context_data(self, **kwargs)
context.update({ context.update({
'head_title': str(_('Painel Plenário')), 'head_title': str(_('Painel Plenário')),
'sessao_id': kwargs['pk'], 'sessao_id': kwargs['pk'],
'root_pk': kwargs['pk'], 'root_pk': kwargs['pk'],
'sessaoplenaria': SessaoPlenaria.objects.get(pk=kwargs['pk']), 'sessaoplenaria': SessaoPlenaria.objects.get(pk=kwargs['pk']),
'cronometro_discurso': cronometro_discurso, 'cronometros': cronometros})
'cronometro_aparte': cronometro_aparte,
'cronometro_ordem': cronometro_ordem,
'cronometro_consideracoes': cronometro_consideracoes})
return context return context

2
sapl/templates/painel/layouts.yaml

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

383
sapl/templates/sessao/painel.html

@ -1,7 +1,11 @@
{% extends "crud/detail.html" %} {% extends "crud/detail.html" %}
{% load i18n %} {% load i18n %}
{% load common_tags %}
{% load staticfiles %} {% load staticfiles %}
{% load webpack_static from webpack_loader %} {% load webpack_static from webpack_loader %}
{% load render_bundle from webpack_loader %}
{% block actions %} {% endblock %} {% block actions %} {% endblock %}
{% block title %} {% block title %}
@ -25,67 +29,25 @@
<h1>Operação do Painel Eletrônico</h1> <h1>Operação do Painel Eletrônico</h1>
<h2><span id="relogio"></span></h2> <h2><span id="relogio"></span></h2>
<br /> <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 > {% for cronometro in cronometros %}
<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>
<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="row">
<div class="col-md-2"><input size="2" id="ordem" name="ordem" value="" readyonly="true" class="form-control"></div> <div class="col-md-12 mb-2"><h3>{{cronometro}}</h3></div>
</div> </div>
<br />
<div class="row"> <div class="row">
<div class="col-md-6"><button type="button" id="ordemStart" class="btn btn-success">Iniciar</button></div> <div class="col-md-2"><input size="2" id="cronometro_{{cronometro.id}}" name="{{cronometro.tipo}}" value="" readyonly="true" class="form-control"></div>
<div class="col-md-6"><button type="button" id="ordemReset" class="btn btn-success">Reiniciar</button></div>
</div> </div>
<br/>
<br /> <br />
<div class="row"> <div class="row">
<div class="col-md-12 mb-2"><h3>Cronômetro de Considerações Finais</h3></div> <div class="col-md-6"><button type="button" id="cronometro_{{cronometro.id}}_Start" class="btn btn-success">Iniciar</button></div>
</div> <div class="col-md-6"><button type="button" id="cronometro_{{cronometro.id}}_Reset" class="btn btn-success">Reiniciar</button></div>
<div class="row">
<div class="col-md-4"><input size="2" id="consideracoes" name="consideracoes" value="" readyonly="true" class="form-control"></div>
</div> </div>
<br />
<div class="row"> <br><br>
<div class="col-md-6"><button type="button" id="consideracoesStart" class="btn btn-success">Iniciar</button></div> {% endfor %}
<div class="col-md-6"><button type="button" id="consideracoesReset" class="btn btn-success">Reiniciar</button></div>
</div>
<br /><br >
<div class="row"> <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> <div class="col-md-6"><button type="button" id="sinalSonoro" class="btn btn-success" onclick="document.getElementById('audio').play();">Sinal Sonoro</button></div>
@ -95,250 +57,11 @@
{% block extra_js %} {% block extra_js %}
<script language="JavaScript"> <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') {
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'start' } );
$('#consideracoesReset').hide();
$('#consideracoes').runner('start');
$('#consideracoesStart').text('Parar');
} else {
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'stop' } );
$('#consideracoesReset').show();
$('#consideracoes').runner('stop');
$('#consideracoesStart').text('Iniciar');
}
});
$('#consideracoesReset').click(function() {
$.get('/painel/cronometro', { tipo: 'consideracoes', action: 'reset' } );
$('#consideracoes').runner('stop');
$('#consideracoes').runner('reset');
});
});
function switch_painel(aberto) { function switch_painel(aberto) {
var pk_sessao = {{root_pk}}; let pk_sessao = {{root_pk}};
var botao_abrir = $('#id_abrir_painel'); let botao_abrir = $('#id_abrir_painel');
var botao_fechar = $('#id_fechar_painel'); let botao_fechar = $('#id_fechar_painel');
$.ajax({ $.ajax({
data: {pk_sessao: pk_sessao, aberto: aberto}, data: {pk_sessao: pk_sessao, aberto: aberto},
@ -356,10 +79,30 @@ function switch_painel(aberto) {
} }
} }
function checkTime(i) {
if (i<10) {
i = "0" + i
};
return i;
}
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(){ $(document).ready(function(){
var pk_sessao = {{root_pk}}; let pk_sessao = {{root_pk}};
var botao_abrir = $('#id_abrir_painel'); let botao_abrir = $('#id_abrir_painel');
var botao_fechar = $('#id_fechar_painel'); let botao_fechar = $('#id_fechar_painel');
$.ajax({ $.ajax({
data: {pk_sessao: pk_sessao}, data: {pk_sessao: pk_sessao},
@ -380,6 +123,58 @@ $(document).ready(function(){
}, },
}); });
startTime();
let audioAlertFinish = document.getElementById("audio");
{% for cron in cronometros %}
cronometro = "cronometro_" + "{{cron.id}}";
$('#' + cronometro).prop('disabled', false);
cronometroStart = '#' + cronometro + '_Start';
cronometroReset = '#' + cronometro + '_Reset';
duracao = {{cron.duracao_cronometro|duration_to_seconds}};
console.log(cronometro, duracao, cronometroStart, cronometroReset);
$('#' + 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');
}
});
$(cronometroReset).click(function() {
$.get('/painel/cronometro', { tipo: cronometro, action: 'reset' } );
$('#' + cronometro).runner('stop');
$('#' + cronometro).runner('reset');
});
{% endfor %}
}); });

Loading…
Cancel
Save