Browse Source

Fix #918 cronometro painel set (#919)

* Fix #918

* Conserta alguns erros encontrados no teste
pull/929/head
eduardocalil 8 years ago
committed by Edward
parent
commit
eb214e0541
  1. 11
      sapl/base/forms.py
  2. 30
      sapl/base/migrations/0032_auto_20170308_1006.py
  3. 15
      sapl/base/models.py
  4. 11
      sapl/base/templatetags/common_tags.py
  5. 6
      sapl/parlamentares/models.py
  6. 4
      sapl/sessao/models.py
  7. 24
      sapl/sessao/views.py
  8. 1
      sapl/static/js/app.js
  9. 3
      sapl/templates/base/layouts.yaml
  10. 8
      sapl/templates/painel/index.html
  11. 7
      sapl/templates/sessao/painel.html
  12. 11
      sapl/utils.py

11
sapl/base/forms.py

@ -694,7 +694,16 @@ class ConfiguracoesAppForm(ModelForm):
'texto_articulado_proposicao', 'texto_articulado_proposicao',
'texto_articulado_materia', 'texto_articulado_materia',
'texto_articulado_norma', 'texto_articulado_norma',
'proposicao_incorporacao_obrigatoria'] 'proposicao_incorporacao_obrigatoria',
'cronometro_discurso',
'cronometro_aparte',
'cronometro_ordem']
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'
class RecuperarSenhaForm(PasswordResetForm): class RecuperarSenhaForm(PasswordResetForm):

30
sapl/base/migrations/0032_auto_20170308_1006.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-03-08 10:06
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0031_auto_20170203_1019'),
]
operations = [
migrations.AddField(
model_name='appconfig',
name='cronometro_aparte',
field=models.TimeField(blank=True, null=True, verbose_name='Cronômetro do Aparte'),
),
migrations.AddField(
model_name='appconfig',
name='cronometro_discurso',
field=models.TimeField(blank=True, null=True, verbose_name='Cronômetro do Discurso'),
),
migrations.AddField(
model_name='appconfig',
name='cronometro_ordem',
field=models.TimeField(blank=True, null=True, verbose_name='Cronômetro da Ordem'),
),
]

15
sapl/base/models.py

@ -114,6 +114,21 @@ class AppConfig(models.Model):
verbose_name=_('Regra de incorporação de proposições e protocolo'), verbose_name=_('Regra de incorporação de proposições e protocolo'),
max_length=1, choices=POLITICA_PROTOCOLO_CHOICES, default='O') max_length=1, choices=POLITICA_PROTOCOLO_CHOICES, default='O')
cronometro_discurso = models.TimeField(
verbose_name=_('Cronômetro do Discurso'),
blank=True,
null=True)
cronometro_aparte = models.TimeField(
verbose_name=_('Cronômetro do Aparte'),
blank=True,
null=True)
cronometro_ordem = models.TimeField(
verbose_name=_('Cronômetro da Ordem'),
blank=True,
null=True)
class Meta: class Meta:
verbose_name = _('Configurações da Aplicação') verbose_name = _('Configurações da Aplicação')
verbose_name_plural = _('Configurações da Aplicação') verbose_name_plural = _('Configurações da Aplicação')

11
sapl/base/templatetags/common_tags.py

@ -121,3 +121,14 @@ def url(value):
if value.startswith('http://') or value.startswith('https://'): if value.startswith('http://') or value.startswith('https://'):
return True return True
return False return False
@register.filter
def cronometro_to_seconds(value):
if not AppConfig.attr('cronometro_' + value):
return 0
m, s, x = AppConfig.attr(
'cronometro_' + value).isoformat().split(':')
return 60 * int(m) + int(s)

6
sapl/parlamentares/models.py

@ -7,9 +7,9 @@ from model_utils import Choices
from sapl.base.models import Autor from sapl.base.models import Autor
from sapl.utils import (INDICADOR_AFASTAMENTO, UF, YES_NO_CHOICES, from sapl.utils import (INDICADOR_AFASTAMENTO, UF, YES_NO_CHOICES,
SaplGenericRelation, intervalos_tem_intersecao, SaplGenericRelation, get_settings_auth_user_model,
restringe_tipos_de_arquivo_img, intervalos_tem_intersecao,
get_settings_auth_user_model, texto_upload_path) restringe_tipos_de_arquivo_img, texto_upload_path)
class Legislatura(models.Model): class Legislatura(models.Model):

4
sapl/sessao/models.py

@ -8,8 +8,8 @@ from sapl.materia.models import MateriaLegislativa
from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar, from sapl.parlamentares.models import (CargoMesa, Legislatura, Parlamentar,
Partido, SessaoLegislativa) Partido, SessaoLegislativa)
from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation, from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation,
restringe_tipos_de_arquivo_txt, texto_upload_path, get_settings_auth_user_model,
get_settings_auth_user_model) restringe_tipos_de_arquivo_txt, texto_upload_path)
class CargoBancada(models.Model): class CargoBancada(models.Model):

24
sapl/sessao/views.py

@ -590,16 +590,38 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if request.user.is_anonymous(): if request.user.is_anonymous():
self.template_name = 'painel/index.html' self.template_name = 'painel/index.html'
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_aparte = AppsAppConfig.attr('cronometro_aparte')
cronometro_ordem = AppsAppConfig.attr('cronometro_ordem')
if not cronometro_discurso or not cronometro_aparte or not cronometro_ordem:
msg = _(
'Você precisa primeiro configurar os cronômetros nas Configurações da Aplicação')
messages.add_message(self.request, messages.ERROR, msg)
else:
m, s, x = cronometro_discurso.isoformat().split(':')
cronometro_discurso = int(m) * 60 + int(s)
m, s, x = cronometro_aparte.isoformat().split(':')
cronometro_aparte = int(m) * 60 + int(s)
m, s, x = cronometro_ordem.isoformat().split(':')
cronometro_ordem = int(m) * 60 + int(s)
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,
'cronometro_aparte': cronometro_aparte,
'cronometro_ordem': cronometro_ordem})
return context return context

1
sapl/static/js/app.js

@ -48,6 +48,7 @@ function refreshMask() {
$('.dateinput').mask('00/00/0000', {placeholder:"__/__/____"}); $('.dateinput').mask('00/00/0000', {placeholder:"__/__/____"});
$('.hora').mask("00:00", {placeholder:"hh:mm"}); $('.hora').mask("00:00", {placeholder:"hh:mm"});
$('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"}); $('.hora_hms').mask("00:00:00", {placeholder:"hh:mm:ss"});
$('.cronometro').mask("00:00", {placeholder:"mm:ss"});
} }
function autorModal() { function autorModal() {

3
sapl/templates/base/layouts.yaml

@ -20,6 +20,9 @@ AppConfig:
{% trans 'Textos Articulados' %}: {% trans 'Textos Articulados' %}:
- texto_articulado_proposicao texto_articulado_materia texto_articulado_norma - texto_articulado_proposicao texto_articulado_materia texto_articulado_norma
{% trans 'Cronômetros do Painel' %}:
- cronometro_discurso cronometro_aparte cronometro_ordem
TipoAutor: TipoAutor:
{% trans 'Tipo Autor' %}: {% trans 'Tipo Autor' %}:
- content_type:4 descricao - content_type:4 descricao

8
sapl/templates/painel/index.html

@ -1,5 +1,6 @@
{% load i18n %} {% load i18n %}
{% load staticfiles sass_tags %} {% load staticfiles sass_tags %}
{% load common_tags %}
<!DOCTYPE HTML> <!DOCTYPE HTML>
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]--> <!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <!--[if gt IE 8]><!-->
@ -39,6 +40,7 @@
<table style="width:100%"> <table style="width:100%">
<tr> <tr>
<th style="text-align:center"><font color="white" size="4"><span id="sessao_plenaria_data"></span></font></th> <th style="text-align:center"><font color="white" size="4"><span id="sessao_plenaria_data"></span></font></th>
<th style="text-align:center"><font color="white" size="4"><span id="sessao_plenaria_hora_inicio"></span></font></th> <th style="text-align:center"><font color="white" size="4"><span id="sessao_plenaria_hora_inicio"></span></font></th>
</tr> </tr>
</table> </table>
@ -119,7 +121,7 @@
$('#cronometro_discurso').runner({ $('#cronometro_discurso').runner({
autostart: false, autostart: false,
countdown: true, countdown: true,
startAt: 5 * 60 * 1000, // 5 minutes startAt: {{ 'discurso'|cronometro_to_seconds }} * 1000,
stopAt: 0, stopAt: 0,
milliseconds: false milliseconds: false
}).on('runnerFinish', function(eventObject, info){ }).on('runnerFinish', function(eventObject, info){
@ -129,7 +131,7 @@
$('#cronometro_aparte').runner({ $('#cronometro_aparte').runner({
autostart: false, autostart: false,
countdown: true, countdown: true,
startAt: 3 * 60 * 1000, // 3 minutes startAt: {{ 'aparte'|cronometro_to_seconds }} * 1000,
stopAt: 0, stopAt: 0,
milliseconds: false milliseconds: false
}).on('runnerFinish', function(eventObject, info){ }).on('runnerFinish', function(eventObject, info){
@ -139,7 +141,7 @@
$('#cronometro_ordem').runner({ $('#cronometro_ordem').runner({
autostart: false, autostart: false,
countdown: true, countdown: true,
startAt: 2 * 60 * 1000, // 2 minutes startAt: {{ 'ordem'|cronometro_to_seconds }} * 1000,
stopAt: 0, stopAt: 0,
milliseconds: false milliseconds: false
}).on('runnerFinish', function(eventObject, info){ }).on('runnerFinish', function(eventObject, info){

7
sapl/templates/sessao/painel.html

@ -21,6 +21,7 @@
<div class="col-md-6"><a href="{% url 'sapl.painel:painel_controlador' %}" class="btn btn-primary btn-sm active">Controlador Painel</a></div> <div class="col-md-6"><a href="{% url 'sapl.painel:painel_controlador' %}" class="btn btn-primary btn-sm active">Controlador Painel</a></div>
</div> </div>
<br /> <br />
<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 />
@ -101,7 +102,7 @@ $(function() {
$('#discurso').runner({ $('#discurso').runner({
autostart: false, autostart: false,
countdown: true, countdown: true,
startAt: 60 * 5 * 1000, startAt: {{cronometro_discurso}} * 1000,
stopAt: 0, stopAt: 0,
milliseconds: false milliseconds: false
}).on('runnerFinish', function(eventObject, info){ }).on('runnerFinish', function(eventObject, info){
@ -156,7 +157,7 @@ $(function() {
$('#aparte').runner({ $('#aparte').runner({
autostart: false, autostart: false,
countdown: true, countdown: true,
startAt: 60 * 3 * 1000, startAt: {{cronometro_aparte}} * 1000,
stopAt: 0, stopAt: 0,
milliseconds: false milliseconds: false
}).on('runnerFinish', function(eventObject, info){ }).on('runnerFinish', function(eventObject, info){
@ -210,7 +211,7 @@ $(function() {
$('#ordem').runner({ $('#ordem').runner({
autostart: false, autostart: false,
countdown: true, countdown: true,
startAt: 60 * 2 * 1000, startAt: {{cronometro_ordem}} * 1000,
stopAt: 0, stopAt: 0,
milliseconds: false milliseconds: false
}).on('runnerFinish', function(eventObject, info){ }).on('runnerFinish', function(eventObject, info){

11
sapl/utils.py

@ -1,10 +1,12 @@
from datetime import date
from functools import wraps
from unicodedata import normalize as unicodedata_normalize
import hashlib import hashlib
import logging import logging
import re import re
from datetime import date
from functools import wraps
from unicodedata import normalize as unicodedata_normalize
import django_filters
import magic
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Button from crispy_forms.layout import HTML, Button
from django import forms from django import forms
@ -17,13 +19,10 @@ from django.core.exceptions import ValidationError
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from floppyforms import ClearableFileInput from floppyforms import ClearableFileInput
import django_filters
import magic
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row from sapl.crispy_layout_mixin import SaplFormLayout, form_actions, to_row
from sapl.settings import BASE_DIR from sapl.settings import BASE_DIR
sapl_logger = logging.getLogger(BASE_DIR.name) sapl_logger = logging.getLogger(BASE_DIR.name)

Loading…
Cancel
Save