Browse Source

Merge branch '3.1.x' into 2402-nome-autores

pull/2406/head
Cesar Augusto de Carvalho 7 years ago
committed by GitHub
parent
commit
a113fdcb75
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 35
      sapl/base/migrations/0024_auto_20181126_1534.py
  2. 21
      sapl/base/migrations/0025_auto_20181126_1648.py
  3. 20
      sapl/base/migrations/0026_auto_20181126_1727.py
  4. 8
      sapl/base/models.py
  5. 5
      sapl/base/templatetags/common_tags.py
  6. 13
      sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json
  7. 2
      sapl/norma/forms.py
  8. 2
      sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py
  9. 2
      sapl/norma/migrations/0009_auto_20171113_1339.py
  10. 20
      sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py
  11. 20
      sapl/norma/migrations/0017_auto_20181127_0955.py
  12. 3
      sapl/norma/models.py
  13. 2
      sapl/norma/views.py
  14. 1
      sapl/painel/views.py
  15. 2
      sapl/parlamentares/views.py
  16. 19
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  17. 20
      sapl/relatorios/views.py
  18. 31
      sapl/sessao/views.py
  19. 2
      sapl/static/js/app.js
  20. 2
      sapl/templates/norma/layouts.yaml
  21. 6
      sapl/templates/sessao/blocos_ata/lista_presenca.html
  22. 25
      sapl/templates/sessao/blocos_resumo/lista_presenca.html

35
sapl/base/migrations/0024_auto_20181126_1534.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-26 17:34
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0023_auto_20181105_1804'),
]
operations = [
migrations.AlterField(
model_name='appconfig',
name='cronometro_aparte',
field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Aparte'),
),
migrations.AlterField(
model_name='appconfig',
name='cronometro_consideracoes',
field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro de Considerações Finais'),
),
migrations.AlterField(
model_name='appconfig',
name='cronometro_discurso',
field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Discurso'),
),
migrations.AlterField(
model_name='appconfig',
name='cronometro_ordem',
field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro da Ordem'),
),
]

21
sapl/base/migrations/0025_auto_20181126_1648.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-26 18:48
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0024_auto_20181126_1534'),
]
operations = [
migrations.AlterField(
model_name='appconfig',
name='cronometro_discurso',
field=models.DurationField(blank=True, default=datetime.timedelta(0, 2400), null=True, verbose_name='Cronômetro do Discurso'),
),
]

20
sapl/base/migrations/0026_auto_20181126_1727.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-26 19:27
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0025_auto_20181126_1648'),
]
operations = [
migrations.AlterField(
model_name='appconfig',
name='cronometro_discurso',
field=models.DurationField(blank=True, null=True, verbose_name='Cronômetro do Discurso'),
),
]

8
sapl/base/models.py

@ -121,22 +121,22 @@ class AppConfig(models.Model):
verbose_name=_('Quem deve assina a ata'),
max_length=1, choices=ASSINATURA_ATA_CHOICES, default='T')
cronometro_discurso = models.TimeField(
cronometro_discurso = models.DurationField(
verbose_name=_('Cronômetro do Discurso'),
blank=True,
null=True)
cronometro_aparte = models.TimeField(
cronometro_aparte = models.DurationField(
verbose_name=_('Cronômetro do Aparte'),
blank=True,
null=True)
cronometro_ordem = models.TimeField(
cronometro_ordem = models.DurationField(
verbose_name=_('Cronômetro da Ordem'),
blank=True,
null=True)
cronometro_consideracoes = models.TimeField(
cronometro_consideracoes = models.DurationField(
verbose_name=_('Cronômetro de Considerações Finais'),
blank=True,
null=True)

5
sapl/base/templatetags/common_tags.py

@ -229,10 +229,7 @@ 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)
return AppConfig.attr('cronometro_' + value).seconds
@register.filter

13
sapl/norma/fixtures/pre_popula_tipo_vinculo_norma.json

@ -1,6 +1,7 @@
[
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Altera o(a)",
"descricao_passiva": "Alterado(a) pelo(a)",
"sigla": "A"
@ -10,6 +11,7 @@
},
{
"fields": {
"revoga_integralmente": "True",
"descricao_ativa": "Revoga integralmente o(a)",
"descricao_passiva": "Revogado(a) integralmente pelo(a)",
"sigla": "R"
@ -19,6 +21,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Revoga parcialmente o(a)",
"descricao_passiva": "Revogado(a) parcialmente pelo(a)",
"sigla": "P"
@ -28,6 +31,7 @@
},
{
"fields": {
"revoga_integralmente": "True",
"descricao_ativa": "Revoga integralmente por consolida\u00e7\u00e3o",
"descricao_passiva": "Revogado(a) integralmente por consolida\u00e7\u00e3o",
"sigla": "T"
@ -37,6 +41,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Norma correlata",
"descricao_passiva": "Norma correlata",
"sigla": "C"
@ -46,6 +51,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Ressalva o(a)",
"descricao_passiva": "Ressalvada pelo(a)",
"sigla": "S"
@ -55,6 +61,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Reedita o(a)",
"descricao_passiva": "Reeditada pelo(a)",
"sigla": "E"
@ -64,6 +71,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Reedita com altera\u00e7\u00e3o o(a)",
"descricao_passiva": "Reeditada com altera\u00e7\u00e3o pelo(a)",
"sigla": "I"
@ -73,6 +81,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Regulamenta o(a)",
"descricao_passiva": "Regulamentada pelo(a)",
"sigla": "G"
@ -82,6 +91,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Suspende parcialmente o(a)",
"descricao_passiva": "Suspenso(a) parcialmente pelo(a)",
"sigla": "K"
@ -91,6 +101,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Suspende integralmente o(a)",
"descricao_passiva": "Suspenso(a) integralmente pelo(a)",
"sigla": "L"
@ -100,6 +111,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Julga integralmente inconstitucional",
"descricao_passiva": "Julgada integralmente inconstitucional",
"sigla": "N"
@ -109,6 +121,7 @@
},
{
"fields": {
"revoga_integralmente": "False",
"descricao_ativa": "Julga parcialmente inconstitucional",
"descricao_passiva": "Julgada parcialmente inconstitucional",
"sigla": "O"

2
sapl/norma/forms.py

@ -344,6 +344,8 @@ class NormaRelacionadaForm(ModelForm):
def save(self, commit=False):
relacionada = super(NormaRelacionadaForm, self).save(commit)
relacionada.norma_relacionada = self.cleaned_data['norma_relacionada']
relacionada.norma_relacionada.data_vigencia = relacionada.norma_principal.data
relacionada.norma_relacionada.save()
relacionada.save()
return relacionada

2
sapl/norma/migrations/0008_normajuridica_popula_tipo_vinculo_norma.py

@ -31,7 +31,7 @@ def gera_tipo_vinculo(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('norma', '0007_auto_20170904_1708'),
('norma', '0017_auto_20181127_0955'),
]
operations = [

2
sapl/norma/migrations/0009_auto_20171113_1339.py

@ -9,7 +9,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('norma', '0008_normajuridica_popula_tipo_vinculo_norma'),
('norma', '0007_auto_20170904_1708'),
]
operations = [

20
sapl/norma/migrations/0016_tipovinculonormajuridica_revoga_integramente.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-23 14:51
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('norma', '0015_auto_20181109_1422'),
]
operations = [
migrations.AddField(
model_name='tipovinculonormajuridica',
name='revoga_integramente',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Revoga Integralmente?'),
),
]

20
sapl/norma/migrations/0017_auto_20181127_0955.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-27 11:55
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('norma', '0016_tipovinculonormajuridica_revoga_integramente'),
]
operations = [
migrations.RenameField(
model_name='tipovinculonormajuridica',
old_name='revoga_integramente',
new_name='revoga_integralmente',
),
]

3
sapl/norma/models.py

@ -258,6 +258,9 @@ class TipoVinculoNormaJuridica(models.Model):
max_length=50, blank=True, verbose_name=_('Descrição Ativa'))
descricao_passiva = models.CharField(
max_length=50, blank=True, verbose_name=_('Descrição Passiva'))
revoga_integralmente = models.BooleanField(verbose_name=_('Revoga Integralmente?'),
choices=YES_NO_CHOICES,
default=False)
class Meta:
verbose_name = _('Tipo de Vínculo entre Normas Jurídicas')

2
sapl/norma/views.py

@ -37,7 +37,7 @@ TipoNormaCrud = CrudAux.build(
list_field_names=['sigla', 'descricao', 'equivalente_lexml'])
TipoVinculoNormaJuridicaCrud = CrudAux.build(
TipoVinculoNormaJuridica, '',
list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva'])
list_field_names=['sigla', 'descricao_ativa', 'descricao_passiva', 'revoga_integralmente'])
class NormaRelacionadaCrud(MasterDetailCrud):

1
sapl/painel/views.py

@ -340,7 +340,6 @@ def cronometro_painel(request):
def get_cronometro_status(request, name):
logger = logging.getLogger(__name__)
username = request.user.username
try:
logger.debug("user=" + username + ". Tentando obter cronometro.")
cronometro = request.session[name]

2
sapl/parlamentares/views.py

@ -498,7 +498,7 @@ class ParlamentarCrud(Crud):
if legislatura_id >= 0:
return queryset.filter(
mandato__legislatura_id=legislatura_id).annotate(
mandato_titular=F('mandato__titular'))
mandato_titular=F('mandato__titular')).distinct()
else:
try:
self.logger.debug("user=" + username + ". Tentando obter o mais recente registro do objeto Legislatura.")

19
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py

@ -142,7 +142,7 @@ def mesa(lst_mesa):
return tmp
def presenca(lst_presenca_sessao):
def presenca(lst_presenca_sessao,lst_ausencia_sessao):
"""
"""
@ -155,6 +155,19 @@ def presenca(lst_presenca_sessao):
tmp += '\t\t<para style="P2" spaceAfter="5">' + \
str(presenca['nom_parlamentar']) + '/' + \
str(presenca['sgl_partido']) + '</para>\n'
tmp += '\t\t<para style="P1">Justificativas de Ausência da Sessão</para>\n'
tmp += '\t\t<para style="P2">\n'
tmp += '\t\t\t<font color="white"> <br/></font>\n'
tmp += '\t\t</para>\n'
tmp += '<blockTable style="repeater" repeatRows="1">\n'
tmp += '<tr><td >Parlamentar</td><td>Justificativa</td><td>Ausente em</td></tr>\n'
for ausencia in lst_ausencia_sessao:
tmp += '<tr><td>' + \
str(ausencia['parlamentar']) + '</td><td> ' + \
str(ausencia['justificativa']) + '</td><td>' + \
str(ausencia['tipo']) + '</td></tr>\n'
tmp += '</blockTable>'
return tmp
@ -329,7 +342,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
'cont_mult': '',
'exp': expedientes(lst_expedientes),
'id_basica': inf_basicas(inf_basicas_dic),
'lista_p': presenca(lst_presenca_sessao),
'lista_p': presenca(lst_presenca_sessao,lst_ausencia_sessao),
'lista_p_o_d': presenca_ordem_dia(lst_presenca_ordem_dia),
'mat_exp': expediente_materia(lst_expediente_materia),
'mat_o_d': votacao(lst_votacao),
@ -355,7 +368,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao
else:
tmp += inf_basicas(inf_basicas_dic)
tmp += mesa(lst_mesa)
tmp += presenca(lst_presenca_sessao)
tmp += presenca(lst_presenca_sessao,lst_ausencia_sessao)
tmp += expedientes(lst_expedientes)
tmp += expediente_materia(lst_expediente_materia)
tmp += oradores_expediente(lst_oradores_expediente)

20
sapl/relatorios/views.py

@ -16,7 +16,8 @@ from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
TramitacaoAdministrativo)
from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
IntegranteMesa, Orador, OradorExpediente,
IntegranteMesa, JustificativaAusencia,
Orador, OradorExpediente,
OrdemDia, PresencaOrdemDia, SessaoPlenaria,
SessaoPlenariaPresenca, OcorrenciaSessao)
from sapl.settings import STATIC_ROOT
@ -538,6 +539,20 @@ def get_sessao_plenaria(sessao, casa):
dic_presenca['sgl_partido'] = partido_sigla
lst_presenca_sessao.append(dic_presenca)
# Lista de ausencias na sessão
lst_ausencia_sessao = []
ausencia = JustificativaAusencia.objects.filter(
sessao_plenaria=sessao).order_by('parlamentar__nome_parlamentar')
for ausente in ausencia:
dic_ausencia = {}
dic_ausencia['parlamentar'] = ausente.parlamentar
dic_ausencia['justificativa'] = ausente.tipo_ausencia
if ausente.ausencia == 1:
dic_ausencia['tipo'] = 'Matéria'
else:
dic_ausencia['tipo'] = 'Sessão'
lst_ausencia_sessao.append(dic_ausencia)
# Exibe os Expedientes
lst_expedientes = []
@ -751,6 +766,7 @@ def get_sessao_plenaria(sessao, casa):
return (inf_basicas_dic,
lst_mesa,
lst_presenca_sessao,
lst_ausencia_sessao,
lst_expedientes,
lst_expediente_materia,
lst_oradores_expediente,
@ -803,6 +819,7 @@ def relatorio_sessao_plenaria(request, pk):
(inf_basicas_dic,
lst_mesa,
lst_presenca_sessao,
lst_ausencia_sessao,
lst_expedientes,
lst_expediente_materia,
lst_oradores_expediente,
@ -824,6 +841,7 @@ def relatorio_sessao_plenaria(request, pk):
inf_basicas_dic,
lst_mesa,
lst_presenca_sessao,
lst_ausencia_sessao,
lst_expedientes,
lst_expediente_materia,
lst_oradores_expediente,

31
sapl/sessao/views.py

@ -846,17 +846,10 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView):
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)
m, s, x = cronometro_consideracoes.isoformat().split(':')
cronometro_consideracoes = int(m) * 60 + int(s)
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({
@ -1349,7 +1342,12 @@ class ResumoView(DetailView):
parlamentares_sessao = [p.parlamentar for p in presencas]
context.update({'presenca_sessao': parlamentares_sessao})
ausentes_sessao = JustificativaAusencia.objects.filter(
sessao_plenaria_id=self.object.id
).order_by('parlamentar__nome_parlamentar')
context.update({'presenca_sessao': parlamentares_sessao,
'justificativa_ausencia': ausentes_sessao})
# =====================================================================
@ -1383,10 +1381,13 @@ class ResumoView(DetailView):
turno = get_turno(tramitacao.turno)
rv = m.registrovotacao_set.first()
rp = m.retiradapauta_set.filter(materia=m.materia).first()
if rv:
resultado = rv.tipo_resultado_votacao.nome
resultado_observacao = rv.observacao
elif rp:
resultado = rp.tipo_de_retirada.descricao
resultado_observacao = rp.observacao
else:
resultado = _('Matéria não votada')
resultado_observacao = _(' ')
@ -1474,9 +1475,13 @@ class ResumoView(DetailView):
# Verificar resultado
rv = o.registrovotacao_set.filter(materia=o.materia).first()
rp = o.retiradapauta_set.filter(materia=o.materia).first()
if rv:
resultado = rv.tipo_resultado_votacao.nome
resultado_observacao = rv.observacao
elif rp:
resultado = rp.tipo_de_retirada.descricao
resultado_observacao = rp.observacao
else:
resultado = _('Matéria não votada')
resultado_observacao = _(' ')

2
sapl/static/js/app.js

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

2
sapl/templates/norma/layouts.yaml

@ -58,7 +58,7 @@ LegislacaoCitadaDetail:
TipoVinculoNormaJuridica:
{% trans 'Tipo de Vínculo entre Normas Jurídicas' %}:
- sigla:2 descricao_ativa descricao_passiva
- sigla:2 descricao_ativa descricao_passiva revoga_integralmente
NormaRelacionada:
{% trans 'Norma Relacionada' %}:

6
sapl/templates/sessao/blocos_ata/lista_presenca.html

@ -7,4 +7,10 @@
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
{% endfor %}
</p>
<p align="justify">
<strong>Justificativas de Ausências na Sessão: </strong>
{% for j in justificativa_ausencia %}
{{j.parlamentar}} / {{ j.tipo_ausencia }} ;
{% endfor %}
</p>
</fieldset>

25
sapl/templates/sessao/blocos_resumo/lista_presenca.html

@ -7,4 +7,29 @@
<div class="col-md-12">{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }}</div>
{% endfor %}
</div>
</br></br></br>
<div class="row">
<legend>Justificativas de Ausência na Sessão</legend>
<table class="table">
<thead>
<tr>
<th>Parlamentar</th>
<th>Justificativa</th>
<th>Ausente em</th>
</tr>
</thead>
<tbody>
{% for j in justificativa_ausencia %}
<tr>
<td> {{ j.parlamentar }} </td>
<td> {{ j.tipo_ausencia }} </td>
{% if j.ausencia == 1 %}
<td> Matéria </td>
{% else %}
<td> Sessão </td>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>
</fieldset>
Loading…
Cancel
Save