Browse Source

Crônometro personalizado com nome estátitco

Websocket_painel
Gustavo274 3 years ago
parent
commit
48233ea9af
  1. 72
      frontend/src/__apps/painel/main.js
  2. 2
      sapl/base/forms.py
  3. 5
      sapl/base/models.py
  4. 2
      sapl/painel/tasks.py
  5. 13
      sapl/painel/views.py
  6. 8
      sapl/sessao/views.py
  7. 1
      sapl/templates/base/layouts.yaml
  8. 5
      sapl/templates/painel/index.html
  9. 59
      sapl/templates/sessao/painel.html

72
frontend/src/__apps/painel/main.js

@ -10,10 +10,12 @@ var time_d = null
var time_o = null
var time_a = null
var time_c = null
var time_p = null
var timeEnd_o = null
var timeEnd_d = null
var timeEnd_a = null
var timeEnd_c = null
var timeEnd_p = null
var audioAlertFinish = document.getElementById('audio')
var cronometroStart = []
var started = []
@ -35,6 +37,7 @@ const v = new Vue({ // eslint-disable-line
cronometro_aparte: '',
cronometro_ordem: '',
cronometro_consideracoes: '',
cronometro_personalizado: '',
sessao_solene: false,
sessao_solene_tema: '',
presentes: [],
@ -57,7 +60,8 @@ const v = new Vue({ // eslint-disable-line
status_cronometro_discurso: '',
status_cronometro_aparte: '',
status_cronometro_ordem: '',
status_cronometro_consideracoes: ''
status_cronometro_consideracoes: '',
status_cronometro_personalizado: ''
}
},
methods: {
@ -127,6 +131,7 @@ const v = new Vue({ // eslint-disable-line
this.status_cronometro_ordem = objeto.status_cronometro_ordem
this.status_cronometro_aparte = objeto.status_cronometro_aparte
this.status_cronometro_consideracoes = objeto.status_cronometro_consideracoes
this.status_cronometro_personalizado = objeto.status_cronometro_personalizado
this.presentes = objeto.presentes
this.presentes.forEach(parlamentar => {
@ -155,11 +160,13 @@ const v = new Vue({ // eslint-disable-line
cronometroStart[1] = objeto.cronometro_aparte
cronometroStart[2] = objeto.cronometro_ordem
cronometroStart[3] = objeto.cronometro_consideracoes
cronometroStart[4] = objeto.cronometro_personalizado
this.running[0] = 0
this.running[1] = 0
this.running[2] = 0
this.running[3] = 0
this.running[4] = 0
// Status cronometro
if (this.status_cronometro_discurso === 'S') {
@ -186,6 +193,12 @@ const v = new Vue({ // eslint-disable-line
this.start(4)
}
if (this.status_cronometro_personalizado === 'S') {
this.stop(5)
} else if (this.status_cronometro_personalizado === 'I') {
this.start(5)
}
// Setar os timers no caso de nulo ou resetado
if (time_d === null || this.status_cronometro_discurso === 'R') {
this.setTimer(1)
@ -203,17 +216,22 @@ const v = new Vue({ // eslint-disable-line
this.setTimer(4)
this.stop(4)
}
if (time_p === null || this.status_cronometro_personalizado === 'R') {
this.setTimer(5)
this.stop(5)
}
},
setTimer (temp_crono) {
var temp
var res
var now
if (temp_crono === 5) {
if (temp_crono === 6) {
// Pegar data atual
this.cronometro_discurso = new Date()
this.cronometro_aparte = this.cronometro_discurso
this.cronometro_ordem = this.cronometro_discurso
this.cronometro_consideracoes = this.cronometro_discurso
this.cronometro_personalizado = this.cronometro_discurso
// Setar cada Cronometro
temp = new Date()
@ -239,6 +257,12 @@ const v = new Vue({ // eslint-disable-line
res = new Date(temp - this.cronometro_consideracoes)
res.setHours(temp.getHours() - this.cronometro_consideracoes.getHours())
this.cronometro_consideracoes = this.formatTime(res)
temp = new Date()
temp.setSeconds(this.cronometro_personalizado.getSeconds() + cronometroStart[4])
res = new Date(temp - this.cronometro_personalizado)
res.setHours(temp.getHours() - this.cronometro_personalizado.getHours())
this.cronometro_personalizado = this.formatTime(res)
} else {
now = new Date()
switch (temp_crono) {
@ -273,6 +297,14 @@ const v = new Vue({ // eslint-disable-line
res = new Date(temp - now)
res.setHours(cronometroStart[3] / 3600)
this.cronometro_consideracoes = this.formatTime(res)
break
case 5:
time_p = null
temp = new Date()
temp.setSeconds(now.getSeconds() + cronometroStart[4])
res = new Date(temp - now)
res.setHours(cronometroStart[4] / 3600)
this.cronometro_personalizado = this.formatTime(res)
}
}
},
@ -290,7 +322,7 @@ const v = new Vue({ // eslint-disable-line
return tempo
},
stop: function stop (crono) {
if (crono === 5) {
if (crono === 6) {
audioAlertFinish.play()
} else {
this.running[crono - 1] = 0
@ -367,6 +399,23 @@ const v = new Vue({ // eslint-disable-line
}, 5000)
}
break
case 5:
if (this.status_cronometro_personalizado !== 'I') return
var now_p = new Date()
time_p = new Date(timeEnd_p - now_p)
// Definir propriamento o tempo
time_p.setHours((time_p.getTime() / 1000) / 3600)
if (timeEnd_p > now_p) {
this.cronometro_personalizado = this.formatTime(time_p)
} else {
audioAlertFinish.play()
this.alert = setTimeout(() => {
this.reset()
}, 5000)
}
break
}
},
start: function startStopWatch (temp_crono) {
@ -441,6 +490,23 @@ const v = new Vue({ // eslint-disable-line
this.clockRunning(temp_crono)
}, 50)
break
case 5:
if (time_p === null) {
time_p = cronometroStart[4]
timeEnd_p = new Date()
timeEnd_p.setSeconds(timeEnd_p.getSeconds() + time_p)
} else {
timeEnd_p = new Date()
timeEnd_p.setHours(timeEnd_p.getHours() + time_p.getHours())
timeEnd_p.setMinutes(timeEnd_p.getMinutes() + time_p.getMinutes())
timeEnd_p.setSeconds(timeEnd_p.getSeconds() + time_p.getSeconds())
}
this.running[4] = 1
started[4] = setInterval(() => {
this.clockRunning(temp_crono)
}, 50)
break
}
}
},

2
sapl/base/forms.py

@ -1556,6 +1556,7 @@ class ConfiguracoesAppForm(ModelForm):
'cronometro_aparte',
'cronometro_ordem',
'cronometro_consideracoes',
'cronometro_personalizado',
'mostrar_brasao_painel',
'receber_recibo_proposicao',
'assinatura_ata',
@ -1573,6 +1574,7 @@ class ConfiguracoesAppForm(ModelForm):
self.fields['cronometro_aparte'].widget.attrs['class'] = 'cronometro'
self.fields['cronometro_ordem'].widget.attrs['class'] = 'cronometro'
self.fields['cronometro_consideracoes'].widget.attrs['class'] = 'cronometro'
self.fields['cronometro_personalizado'].widget.attrs['class'] = 'cronometro'
def clean(self):
cleaned_data = super().clean()

5
sapl/base/models.py

@ -168,6 +168,11 @@ class AppConfig(models.Model):
blank=True,
null=True)
cronometro_personalizado = models.DurationField(
verbose_name=_('Cronômetro Personalizado'),
blank=True,
null=True)
mostrar_brasao_painel = models.BooleanField(
default=False,
verbose_name=_('Mostrar brasão da Casa no painel?'))

2
sapl/painel/tasks.py

@ -7,4 +7,6 @@ channel_layer = get_channel_layer()
def get_dados_painel_final(id):
json_data = views.get_dados_painel(id)
print(json_data)
print('\n')
async_to_sync(channel_layer.group_send)('painel', {'type':'send_data', 'message': json_data})

13
sapl/painel/views.py

@ -372,6 +372,9 @@ def get_cronometro_status(request):
elif tipo == 4:
sessao.status_cronometro_consideracoes_finais = 'I'
elif tipo == 5:
sessao.status_cronometro_personalizado = 'I'
elif ligado == 2:
if tipo == 1:
sessao.status_cronometro_discurso = 'S'
@ -385,6 +388,9 @@ def get_cronometro_status(request):
elif tipo == 4:
sessao.status_cronometro_consideracoes_finais = 'S'
elif tipo == 5:
sessao.status_cronometro_personalizado = 'S'
elif ligado == 3:
if tipo == 1:
sessao.status_cronometro_discurso = 'R'
@ -398,6 +404,9 @@ def get_cronometro_status(request):
elif tipo == 4:
sessao.status_cronometro_consideracoes_finais = 'R'
elif tipo == 5:
sessao.status_cronometro_personalizado = 'R'
sessao.save()
tasks.get_dados_painel_final(pk)
return JsonResponse({})
@ -412,6 +421,8 @@ def get_cronometro_value(name):
result = ConfiguracoesAplicacao.objects.first().cronometro_ordem
if name == 'consideracoes':
result = ConfiguracoesAplicacao.objects.first().cronometro_consideracoes
if name == 'personalizado':
result = ConfiguracoesAplicacao.objects.first().cronometro_personalizado
return result.total_seconds()
@ -628,10 +639,12 @@ def get_dados_painel(pk):
'status_cronometro_aparte': sessao.status_cronometro_aparte,
'status_cronometro_ordem': sessao.status_cronometro_ordem_do_dia,
'status_cronometro_consideracoes': sessao.status_cronometro_consideracoes_finais,
'status_cronometro_personalizado': sessao.status_cronometro_personalizado,
'cronometro_aparte': get_cronometro_value('aparte'),
'cronometro_discurso': get_cronometro_value('discurso'),
'cronometro_ordem': get_cronometro_value('ordem'),
'cronometro_consideracoes': get_cronometro_value('consideracoes'),
'cronometro_personalizado': get_cronometro_value('personalizado'),
'status_painel': sessao.painel_aberto,
'brasao': brasao
}

8
sapl/sessao/views.py

@ -1404,9 +1404,11 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
cronometro_ordem = AppsAppConfig.attr('cronometro_ordem')
cronometro_consideracoes = AppsAppConfig.attr(
'cronometro_consideracoes')
cronometro_personalizado = AppsAppConfig.attr(
'cronometro_personalizado')
if (not cronometro_discurso or not cronometro_aparte
or not cronometro_ordem or not cronometro_consideracoes):
or not cronometro_ordem or not cronometro_consideracoes or not cronometro_personalizado):
username = self.request.user.username
self.logger.error('user=' + username + '. Você precisa primeiro configurar os cronômetros'
@ -1421,6 +1423,7 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
cronometro_aparte = cronometro_aparte.seconds
cronometro_ordem = cronometro_ordem.seconds
cronometro_consideracoes = cronometro_consideracoes.seconds
cronometro_personalizado = cronometro_personalizado.seconds
sessao_pk = kwargs['pk']
sessao = SessaoPlenaria.objects.get(pk=sessao_pk)
@ -1433,7 +1436,8 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
'cronometro_discurso': cronometro_discurso,
'cronometro_aparte': cronometro_aparte,
'cronometro_ordem': cronometro_ordem,
'cronometro_consideracoes': cronometro_consideracoes})
'cronometro_consideracoes': cronometro_consideracoes,
'cronometro_personalizado' : cronometro_personalizado})
tipo_sessao = sessao.tipo
if tipo_sessao.nome == "Solene":

1
sapl/templates/base/layouts.yaml

@ -59,6 +59,7 @@ AppConfig:
{% trans 'Módulo Painel' %}:
- cronometro_discurso cronometro_aparte
- cronometro_ordem cronometro_consideracoes
- cronometro_personalizado
- mostrar_brasao_painel
{% trans 'Segurança' %}:

5
sapl/templates/painel/index.html

@ -131,7 +131,10 @@
</span><br>
Considerações Finais: <span id='discurso' style="margin-right: 20px;">[[ cronometro_consideracoes ]]</span><span v-if="painel_aberto">
</span>
</span><br>
Personalizado: <span id='personalizado' style="margin-right: 20px;">[[ cronometro_personalizado ]]</span><span v-if="painel_aberto">
</span><br>
</div>
</div>
<div v-if="sessao_solene">

59
sapl/templates/sessao/painel.html

@ -91,6 +91,22 @@
</div>
<br /><br >
<div class="row">
<div class="col-md-12 mb-2"><h3>Cronômetro Personalizado</h3></div>
</div>
<div class="row">
<div class="col-md-4"><input size="2" id="personalizado" name="personalizado" value="" readyonly="true" class="form-control"></div>
</div>
<br />
<div class="row">
<div class="col-md-3"><button onclick="switch_cronometro(1, 5)" id="personalizadoStart" class="btn btn-success">Iniciar</button></div>
<div class="col-md-3"><button onclick="switch_cronometro(2, 5)" id="personalizadoStop" class="btn btn-danger">Parar</button></div>
<div class="col-md-6"><button onclick="switch_cronometro(3, 5)" id="personalizadoReset" class="btn btn-success">Reiniciar</button></div>
</div>
<br /><br >
<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>
@ -300,6 +316,49 @@ $(function() {
$('#consideracoes').runner('reset');
});
$('#personalizado').runner({
autostart: false,
countdown: true,
startAt: {{cronometro_personalizado}} * 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: 'personalizado', action: 'stop' } );
audioAlertFinish.play();
$('#personalizadoReset').show();
$('#personalizado').runner('stop');
$('#personalizadoStart').text('Iniciar');
});
$('#personalizadoStart').click(function(){
$.get('/painel/cronometro', { tipo: 'personalizado', action: 'start' } );
$('#personalizado').runner('start');
});
$('#personalizadoStop').click(function(){
$.get('/painel/cronometro', { tipo: 'personalizado', action: 'stop' } );
$('#personalizado').runner('stop');
});
$('#personalizadoReset').click(function() {
$.get('/painel/cronometro', { tipo: 'personalizado', action: 'reset' } );
$('#personalizado').runner('stop');
$('#personalizado').runner('reset');
});
});
function switch_painel(aberto) {

Loading…
Cancel
Save