Browse Source

Merge branch '3.1.x' of https://github.com/interlegis/sapl into votacao-bloco

pull/2416/head
Cesar Carvalho 7 years ago
parent
commit
574d40c996
  1. 2
      docker-compose.yml
  2. 15
      sapl/compilacao/forms.py
  3. 20
      sapl/compilacao/models.py
  4. 139
      sapl/compilacao/views.py
  5. 7
      sapl/materia/views.py
  6. 8
      sapl/norma/forms.py
  7. 20
      sapl/norma/migrations/0015_auto_20181109_1422.py
  8. 2
      sapl/norma/models.py
  9. 1
      sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py
  10. 26
      sapl/relatorios/views.py
  11. 9
      sapl/sessao/forms.py
  12. 20
      sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py
  13. 20
      sapl/sessao/migrations/0031_auto_20181119_1103.py
  14. 1
      sapl/sessao/models.py
  15. 5
      sapl/sessao/views.py
  16. 33
      sapl/static/js/app.js
  17. 51
      sapl/static/js/compilacao.js
  18. 41
      sapl/static/js/compilacao_edit.js
  19. 38
      sapl/static/styles/app.scss
  20. 2
      sapl/templates/base.html
  21. 4
      sapl/templates/norma/layouts.yaml
  22. 4
      sapl/templates/protocoloadm/comprovante.html
  23. 1
      sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html
  24. 6
      sapl/templates/sessao/expedientemateria_list.html
  25. 6
      sapl/templates/sessao/ordemdia_list.html
  26. 33
      sapl/templates/sessao/presenca.html
  27. 17
      sapl/templates/sessao/presenca_ordemdia.html
  28. 2
      setup.py

2
docker-compose.yml

@ -11,7 +11,7 @@ sapldb:
ports: ports:
- "5432:5432" - "5432:5432"
sapl: sapl:
image: interlegis/sapl:3.1.132 image: interlegis/sapl:3.1.134
restart: always restart: always
environment: environment:
ADMIN_PASSWORD: interlegis ADMIN_PASSWORD: interlegis

15
sapl/compilacao/forms.py

@ -1343,7 +1343,7 @@ class DispositivoRegistroAlteracaoForm(Form):
'dispositivo_alterado', 'dispositivo_alterado',
data_sapl_ta='DispositivoSearch', data_sapl_ta='DispositivoSearch',
data_field='dispositivo_alterado', data_field='dispositivo_alterado',
data_type_selection='radio', data_type_selection='checkbox',
template="compilacao/layout/dispositivo_radio.html") template="compilacao/layout/dispositivo_radio.html")
layout.append(Fieldset(_('Registro de Alteração - ' layout.append(Fieldset(_('Registro de Alteração - '
@ -1378,6 +1378,14 @@ class DispositivoRegistroRevogacaoForm(Form):
required=False, required=False,
queryset=Dispositivo.objects.all()) queryset=Dispositivo.objects.all())
revogacao_em_bloco = forms.ChoiceField(
label=_(
'Revogar todos os dispositivos internos dos '
'dispositivos abaixo selecionados?'),
choices=YES_NO_CHOICES,
widget=forms.RadioSelect(),
required=True)
dispositivo_search_form = forms.CharField(widget=forms.HiddenInput(), dispositivo_search_form = forms.CharField(widget=forms.HiddenInput(),
required=False) required=False)
@ -1391,11 +1399,12 @@ class DispositivoRegistroRevogacaoForm(Form):
'dispositivo_revogado', 'dispositivo_revogado',
data_sapl_ta='DispositivoSearch', data_sapl_ta='DispositivoSearch',
data_field='dispositivo_revogado', data_field='dispositivo_revogado',
data_type_selection='radio', data_type_selection='checkbox',
template="compilacao/layout/dispositivo_radio.html") template="compilacao/layout/dispositivo_radio.html")
layout.append(Fieldset(_('Registro de Revogação - ' layout.append(Fieldset(_('Registro de Revogação - '
'Seleção do Dispositivo a ser Revogado'), 'Seleção do Dispositivo a ser Revogado'),
Field(InlineRadios('revogacao_em_bloco')),
row_dispositivo, row_dispositivo,
css_class="col-md-12")) css_class="col-md-12"))
layout.append(Field('dispositivo_search_form')) layout.append(Field('dispositivo_search_form'))
@ -1439,7 +1448,7 @@ class DispositivoRegistroInclusaoForm(Form):
'dispositivo_base_para_inclusao', 'dispositivo_base_para_inclusao',
data_sapl_ta='DispositivoSearch', data_sapl_ta='DispositivoSearch',
data_field='dispositivo_base_para_inclusao', data_field='dispositivo_base_para_inclusao',
data_type_selection='radio', data_type_selection='checkbox',
template="compilacao/layout/dispositivo_radio.html") template="compilacao/layout/dispositivo_radio.html")
layout.append(Fieldset(_('Registro de Inclusão - ' layout.append(Fieldset(_('Registro de Inclusão - '

20
sapl/compilacao/models.py

@ -1386,28 +1386,30 @@ class Dispositivo(BaseModel, TimestampedMixin):
return result return result
def criar_espaco(self, espaco_a_criar, local): def criar_espaco(self, espaco_a_criar, local=None):
if local == 'json_add_next': if local == 'json_add_next':
proximo_bloco = Dispositivo.objects.filter( proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem, ordem__gt=self.ordem,
nivel__lte=self.nivel, nivel__lte=self.nivel,
ta_id=self.ta_id)[:1] ta_id=self.ta_id).first()
elif local == 'json_add_in': elif local == 'json_add_in':
# FIXME: o exclude não deve estar limitado a uma class_css caput e
# sim a qualquer filho de inserção automática
proximo_bloco = Dispositivo.objects.filter( proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem, ordem__gt=self.ordem,
nivel__lte=self.nivel + 1, nivel__lte=self.nivel + 1,
ta_id=self.ta_id).exclude( ta_id=self.ta_id).exclude(auto_inserido=True).first()
tipo_dispositivo__class_css='caput')[:1] elif local == 'json_add_in_with_auto':
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel__lte=self.nivel + 1,
ta_id=self.ta_id).first()
else: else:
proximo_bloco = Dispositivo.objects.filter( proximo_bloco = Dispositivo.objects.filter(
ordem__gte=self.ordem, ordem__gte=self.ordem,
ta_id=self.ta_id)[:1] ta_id=self.ta_id).first()
if proximo_bloco.exists(): if proximo_bloco:
ordem = proximo_bloco[0].ordem ordem = proximo_bloco.ordem
proximo_bloco = Dispositivo.objects.order_by('-ordem').filter( proximo_bloco = Dispositivo.objects.order_by('-ordem').filter(
ordem__gte=ordem, ordem__gte=ordem,
ta_id=self.ta_id) ta_id=self.ta_id)

139
sapl/compilacao/views.py

@ -9,10 +9,12 @@ from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.core.signing import Signer from django.core.signing import Signer
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
from django.db import transaction from django.db import transaction
from django.db.models import Q from django.db.models import Q
from django.db.models.query import QuerySet
from django.http.response import (HttpResponse, HttpResponseRedirect, from django.http.response import (HttpResponse, HttpResponseRedirect,
JsonResponse, Http404) JsonResponse, Http404)
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
@ -1525,6 +1527,13 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
return data return data
def remover_dispositivo(self, base, bloco): def remover_dispositivo(self, base, bloco):
if base.tipo_dispositivo.dispositivo_de_alteracao:
bloco = False
for d in base.dispositivos_alterados_set.all():
d.refresh_from_db()
self.remover_dispositivo(d, bloco)
username = self.request.user.username username = self.request.user.username
base_ordem = base.ordem base_ordem = base.ordem
if base.dispositivo_subsequente or base.dispositivo_substituido: if base.dispositivo_subsequente or base.dispositivo_substituido:
@ -1836,7 +1845,10 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
dpts = base.dispositivos_alterados_set.all().order_by( dpts = base.dispositivos_alterados_set.all().order_by(
'-ordem_bloco_atualizador') '-ordem_bloco_atualizador')
for dpt in dpts: for dpt in dpts:
try:
self.remover_dispositivo(dpt, False) self.remover_dispositivo(dpt, False)
except Exception as e:
print(e)
if base.pk: if base.pk:
""" """
@ -2585,17 +2597,20 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
return self.json_add_next_registra_inclusao( return self.json_add_next_registra_inclusao(
context, local_add='json_add_in') context, local_add='json_add_in')
def registra_revogacao(self, bloco_alteracao, dispositivo_a_revogar): def registra_revogacao(self, bloco_alteracao, dsp_a_rev, em_bloco=False):
return self.registra_alteracao( return self.registra_alteracao(
bloco_alteracao, bloco_alteracao,
dispositivo_a_revogar, dsp_a_rev,
revogacao=True revogacao=True,
em_bloco=em_bloco
) )
def registra_alteracao(self, def registra_alteracao(self,
bloco_alteracao, bloco_alteracao,
dispositivo_a_alterar, dsp_a_alterar,
revogacao=False): revogacao=False,
em_bloco=False):
""" """
Caracteristicas: Caracteristicas:
1 - Se é um dispositivo simples e sem subsequente 1 - Se é um dispositivo simples e sem subsequente
@ -2621,14 +2636,69 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
data.update({'pk': bloco_alteracao.pk, data.update({'pk': bloco_alteracao.pk,
'pai': [bloco_alteracao.pk, ]}) 'pai': [bloco_alteracao.pk, ]})
history = dispositivo_a_alterar.history() if isinstance(dsp_a_alterar, list):
dsps = Dispositivo.objects.filter(id__in=dsp_a_alterar)
dsps_ids = set()
for d in dsps:
ds = d
while ds.dispositivo_subsequente:
ds = ds.dispositivo_subsequente
dsps_ids.add(ds.pk)
if em_bloco:
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=ds.ordem,
nivel__lte=ds.nivel,
ta_id=ds.ta_id).first()
params = {
'ta_id': ds.ta_id,
'nivel__gte': ds.nivel,
'ordem__gte': ds.ordem,
'dispositivo_subsequente__isnull': True
}
for d in history: if proximo_bloco:
params['ordem__lt'] = proximo_bloco.ordem
bloco = Dispositivo.objects.filter(
**params).values_list('id', 'auto_inserido')
for id, auto in bloco:
if auto:
dsp_pai = Dispositivo.objects.filter(
pk=id
).values_list('dispositivo_pai', flat=True).first()
if dsp_pai in dsps_ids:
dsps_ids.remove(dsp_pai)
dsps_ids.add(id)
dsps_ids = Dispositivo.objects.filter(
id__in=dsps_ids
).values_list('id', flat="True")
for dsp in dsps_ids:
with transaction.atomic():
data.update(
self.registra_alteracao(
bloco_alteracao,
dsp,
revogacao
)
)
if 'message' in data and 'danger' in data['message']['type']:
return data
return data
dsp_a_alterar = Dispositivo.objects.get(
pk=dsp_a_alterar)
history = dsp_a_alterar.history()
for d in list(history):
if d.inicio_vigencia <= bloco_alteracao.inicio_vigencia: if d.inicio_vigencia <= bloco_alteracao.inicio_vigencia:
dispositivo_a_alterar = d dsp_a_alterar = d
break break
if (dispositivo_a_alterar.inicio_vigencia > if (dsp_a_alterar.inicio_vigencia >
bloco_alteracao.inicio_vigencia): bloco_alteracao.inicio_vigencia):
self.set_message( self.set_message(
data, 'danger', data, 'danger',
@ -2637,7 +2707,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
'Alterador!'), time=10000) 'Alterador!'), time=10000)
return data return data
if dispositivo_a_alterar.tipo_dispositivo.dispositivo_de_articulacao\ if dsp_a_alterar.tipo_dispositivo.dispositivo_de_articulacao\
and not revogacao: and not revogacao:
self.set_message( self.set_message(
data, 'warning', data, 'warning',
@ -2647,13 +2717,13 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
'para o dispositivo que se quer alterar.'), modal=True) 'para o dispositivo que se quer alterar.'), modal=True)
ndp = Dispositivo.new_instance_based_on( ndp = Dispositivo.new_instance_based_on(
dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo) dsp_a_alterar, dsp_a_alterar.tipo_dispositivo)
ndp.auto_inserido = dispositivo_a_alterar.auto_inserido ndp.auto_inserido = dsp_a_alterar.auto_inserido
ndp.rotulo = dispositivo_a_alterar.rotulo ndp.rotulo = dsp_a_alterar.rotulo
ndp.publicacao = bloco_alteracao.publicacao ndp.publicacao = bloco_alteracao.publicacao
if not revogacao: if not revogacao:
ndp.texto = dispositivo_a_alterar.texto ndp.texto = dsp_a_alterar.texto
else: else:
ndp.texto = Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO ndp.texto = Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO
ndp.dispositivo_de_revogacao = True ndp.dispositivo_de_revogacao = True
@ -2668,15 +2738,15 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
ndp.inicio_vigencia = bloco_alteracao.inicio_eficacia ndp.inicio_vigencia = bloco_alteracao.inicio_eficacia
try: try:
ordem = dispositivo_a_alterar.criar_espaco( ordem = dsp_a_alterar.criar_espaco(
espaco_a_criar=1, local='json_add_in') espaco_a_criar=1, local='json_add_in_with_auto')
ndp.ordem = ordem ndp.ordem = ordem
ndp.dispositivo_atualizador = bloco_alteracao ndp.dispositivo_atualizador = bloco_alteracao
ndp.ta_publicado = bloco_alteracao.ta ndp.ta_publicado = bloco_alteracao.ta
p = dispositivo_a_alterar p = dsp_a_alterar
n = dispositivo_a_alterar.dispositivo_subsequente n = dsp_a_alterar.dispositivo_subsequente
ndp.dispositivo_substituido = p ndp.dispositivo_substituido = p
ndp.dispositivo_subsequente = n ndp.dispositivo_subsequente = n
@ -2711,7 +2781,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
n.dispositivo_substituido = ndp n.dispositivo_substituido = ndp
n.save() n.save()
filhos_diretos = dispositivo_a_alterar.dispositivos_filhos_set filhos_diretos = dsp_a_alterar.dispositivos_filhos_set
for d in filhos_diretos.all(): for d in filhos_diretos.all():
d.dispositivo_pai = ndp d.dispositivo_pai = ndp
d.save() d.save()
@ -2728,14 +2798,20 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
self.set_message( self.set_message(
data, 'success', data, 'success',
_('Dispositivo de Revogação adicionado com sucesso.')) _('Dispositivo de Revogação adicionado com sucesso.'))
# data.update({'pk': ndp.pk,
# 'pai': [bloco_alteracao.pk, ]})
except ValidationError as ve:
self.set_message(
data, 'danger',
_('O dispositivo ({} - {}) já existe neste bloco.'.format(
ndp.tipo_dispositivo,
ndp.get_nomenclatura_completa())), time=10000)
except Exception as e: except Exception as e:
username = self.request.user.username username = self.request.user.username
self.logger.error("user=" + username + ". " + str(e)) self.logger.error("user=" + username + ". " + str(e))
print(e) self.set_message(
data, 'danger',
data.update({'pk': ndp.pk, _('Não é foi possível registrar sua solicitação!'), time=10000)
'pai': [bloco_alteracao.pk, ]})
return data return data
@ -2836,17 +2912,16 @@ class DispositivoDinamicEditView(
formtype = request.POST['formtype'] formtype = request.POST['formtype']
if formtype == 'get_form_alteracao': if formtype == 'get_form_alteracao':
dispositivo_a_alterar = Dispositivo.objects.get( data = self.registra_alteracao(
pk=request.POST['dispositivo_alterado']) d, request.POST.getlist('dispositivo_alterado[]', []))
data = self.registra_alteracao(d, dispositivo_a_alterar)
elif formtype == 'get_form_revogacao': elif formtype == 'get_form_revogacao':
dispositivo_a_revogar = Dispositivo.objects.get( data = self.registra_revogacao(
pk=request.POST['dispositivo_revogado']) d,
request.POST.getlist('dispositivo_revogado[]', []),
data = self.registra_revogacao(d, dispositivo_a_revogar) request.POST.get("revogacao_em_bloco") == "True"
)
if formtype == 'get_form_inclusao': if formtype == 'get_form_inclusao':

7
sapl/materia/views.py

@ -2179,6 +2179,10 @@ class EtiquetaPesquisaView(PermissionRequiredMixin, FormView):
if context['quantidade'] > 20: if context['quantidade'] > 20:
materias = materias[:20] materias = materias[:20]
for m in materias:
if len(m.ementa) > 100:
m.ementa = m.ementa[0:99] + "[...]"
context['materias'] = materias context['materias'] = materias
return gerar_pdf_impressos(self.request, context, return gerar_pdf_impressos(self.request, context,
@ -2267,7 +2271,8 @@ class FichaSelecionaView(PermissionRequiredMixin, FormView):
self.messages.add_message(self.request, messages.INFO, mensagem) self.messages.add_message(self.request, messages.INFO, mensagem)
return self.render_to_response(context) return self.render_to_response(context)
if len(materia.ementa) > 301:
materia.ementa = materia.ementa[0:300] + '[...]'
context['materia'] = materia context['materia'] = materia
context['despachos'] = materia.despachoinicial_set.all().values_list( context['despachos'] = materia.despachoinicial_set.all().values_list(
'comissao__nome', flat=True) 'comissao__nome', flat=True)

8
sapl/norma/forms.py

@ -64,7 +64,7 @@ class NormaFilterSet(django_filters.FilterSet):
class Meta: class Meta:
model = NormaJuridica model = NormaJuridica
fields = ['tipo', 'numero', 'ano', 'data', fields = ['tipo', 'numero', 'ano', 'data', 'data_vigencia',
'data_publicacao', 'ementa', 'assuntos'] 'data_publicacao', 'ementa', 'assuntos']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -73,13 +73,14 @@ class NormaFilterSet(django_filters.FilterSet):
row1 = to_row([('tipo', 4), ('numero', 4), ('ano', 4)]) row1 = to_row([('tipo', 4), ('numero', 4), ('ano', 4)])
row2 = to_row([('data', 6), ('data_publicacao', 6)]) row2 = to_row([('data', 6), ('data_publicacao', 6)])
row3 = to_row([('ementa', 6), ('assuntos', 6)]) row3 = to_row([('ementa', 6), ('assuntos', 6)])
row4 = to_row([('o',6), ('indexacao', 6)]) row4 = to_row([('data_vigencia', 12)])
row5 = to_row([('o',6), ('indexacao', 6)])
self.form.helper = FormHelper() self.form.helper = FormHelper()
self.form.helper.form_method = 'GET' self.form.helper.form_method = 'GET'
self.form.helper.layout = Layout( self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Norma'), Fieldset(_('Pesquisa de Norma'),
row1, row2, row3, row4, row1, row2, row3, row4, row5,
form_actions(label='Pesquisar')) form_actions(label='Pesquisar'))
) )
@ -120,6 +121,7 @@ class NormaJuridicaForm(ModelForm):
'numero_materia', 'numero_materia',
'ano_materia', 'ano_materia',
'data_publicacao', 'data_publicacao',
'data_vigencia',
'veiculo_publicacao', 'veiculo_publicacao',
'pagina_inicio_publicacao', 'pagina_inicio_publicacao',
'pagina_fim_publicacao', 'pagina_fim_publicacao',

20
sapl/norma/migrations/0015_auto_20181109_1422.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-09 16:22
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('norma', '0014_auto_20181008_1655'),
]
operations = [
migrations.AlterField(
model_name='normajuridica',
name='data_vigencia',
field=models.DateField(blank=True, null=True, verbose_name='Data Fim Vigência'),
),
]

2
sapl/norma/models.py

@ -119,7 +119,7 @@ class NormaJuridica(models.Model):
assuntos = models.ManyToManyField( assuntos = models.ManyToManyField(
AssuntoNorma, blank=True, AssuntoNorma, blank=True,
verbose_name=_('Assuntos')) verbose_name=_('Assuntos'))
data_vigencia = models.DateField(blank=True, null=True) data_vigencia = models.DateField(blank=True, null=True, verbose_name=_('Data Fim Vigência'))
timestamp = models.DateTimeField(null=True) timestamp = models.DateTimeField(null=True)
texto_articulado = GenericRelation( texto_articulado = GenericRelation(

1
sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py

@ -352,6 +352,7 @@ def principal(cabecalho_dic, rodape_dic, imagem, sessao, inf_basicas_dic, lst_me
tmp += dict_ord_template[ordenacao.oitavo] tmp += dict_ord_template[ordenacao.oitavo]
tmp += dict_ord_template[ordenacao.nono] tmp += dict_ord_template[ordenacao.nono]
tmp += dict_ord_template[ordenacao.decimo] tmp += dict_ord_template[ordenacao.decimo]
tmp += dict_ord_template[ordenacao.decimo_primeiro]
else: else:
tmp += inf_basicas(inf_basicas_dic) tmp += inf_basicas(inf_basicas_dic)

26
sapl/relatorios/views.py

@ -466,6 +466,29 @@ def get_espelho(mats):
return materias return materias
def remove_html_comments(text):
"""
Assume comentários bem formados <!-- texto --> e
não aninhados como <!-- <!-- texto --> -->
:param text:
:return:
"""
clean_text = text
start = clean_text.find('<!--')
while start > -1:
end = clean_text.find('-->') + 2
output_text = []
for idx, i in enumerate(clean_text):
if not start <= idx <= end:
output_text.append(i)
clean_text = ''.join(output_text)
start = clean_text.find('<!--')
# por algum motivo usar clean_text ao invés de len(clean_text)
# não tava funcionando
return clean_text if len(clean_text) > 0 else text
def get_sessao_plenaria(sessao, casa): def get_sessao_plenaria(sessao, casa):
inf_basicas_dic = {} inf_basicas_dic = {}
@ -535,6 +558,9 @@ def get_sessao_plenaria(sessao, casa):
# https://github.com/interlegis/sapl/issues/1009 # https://github.com/interlegis/sapl/issues/1009
conteudo = conteudo.replace('&', '&amp;') conteudo = conteudo.replace('&', '&amp;')
# https://github.com/interlegis/sapl/issues/2386
conteudo = remove_html_comments(conteudo)
dic_expedientes["txt_expediente"] = conteudo dic_expedientes["txt_expediente"] = conteudo
if dic_expedientes: if dic_expedientes:

9
sapl/sessao/forms.py

@ -1,3 +1,4 @@
from datetime import datetime from datetime import datetime
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
@ -59,7 +60,7 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'),
('mesa_d', 'Mesa Diretora'), ('mesa_d', 'Mesa Diretora'),
('oradores_exped', 'Oradores do Expediente'), ('oradores_exped', 'Oradores do Expediente'),
('oradores_expli', 'Oradores das Explicações Pessoais'), ('oradores_expli', 'Oradores das Explicações Pessoais'),
('ocorrencia_sessao', 'Ocorrências da Sessão')] ('ocorr_sessao', 'Ocorrências da Sessão')]
class SessaoPlenariaForm(ModelForm): class SessaoPlenariaForm(ModelForm):
@ -647,6 +648,8 @@ class ResumoOrdenacaoForm(forms.Form):
choices=ORDENACAO_RESUMO) choices=ORDENACAO_RESUMO)
decimo = forms.ChoiceField(label='10°', decimo = forms.ChoiceField(label='10°',
choices=ORDENACAO_RESUMO) choices=ORDENACAO_RESUMO)
decimo_primeiro = forms.ChoiceField(label='11°',
choices=ORDENACAO_RESUMO)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs) super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs)
@ -671,12 +674,14 @@ class ResumoOrdenacaoForm(forms.Form):
[('nono', 12)]) [('nono', 12)])
row10 = to_row( row10 = to_row(
[('decimo', 12)]) [('decimo', 12)])
row11 = to_row(
[('decimo_primeiro', 12)])
self.helper = FormHelper() self.helper = FormHelper()
self.helper.layout = Layout( self.helper.layout = Layout(
Fieldset(_(''), Fieldset(_(''),
row1, row2, row3, row4, row5, row1, row2, row3, row4, row5,
row6, row7, row8, row9, row10, row6, row7, row8, row9, row10,row11,
form_actions(label='Atualizar')) form_actions(label='Atualizar'))
) )

20
sapl/sessao/migrations/0030_resumoordenacao_decimo_primeiro.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-14 12:06
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sessao', '0029_auto_20181024_0952'),
]
operations = [
migrations.AddField(
model_name='resumoordenacao',
name='decimo_primeiro',
field=models.CharField(default='', max_length=30),
),
]

20
sapl/sessao/migrations/0031_auto_20181119_1103.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.8 on 2018-11-19 13:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sessao', '0030_resumoordenacao_decimo_primeiro'),
]
operations = [
migrations.AlterField(
model_name='resumoordenacao',
name='decimo_primeiro',
field=models.CharField(default='Ocorrências da Sessão', max_length=30),
),
]

1
sapl/sessao/models.py

@ -575,6 +575,7 @@ class ResumoOrdenacao(models.Model):
oitavo = models.CharField(max_length=30) oitavo = models.CharField(max_length=30)
nono = models.CharField(max_length=30) nono = models.CharField(max_length=30)
decimo = models.CharField(max_length=30) decimo = models.CharField(max_length=30)
decimo_primeiro = models.CharField(max_length=30,default="Ocorrências da Sessão")
class Meta: class Meta:
verbose_name = _('Ordenação do Resumo de uma Sessão') verbose_name = _('Ordenação do Resumo de uma Sessão')

5
sapl/sessao/views.py

@ -1,3 +1,4 @@
from operator import itemgetter from operator import itemgetter
import logging import logging
from re import sub from re import sub
@ -1337,6 +1338,7 @@ class ResumoView(DetailView):
context.update({'presenca_sessao': parlamentares_sessao}) context.update({'presenca_sessao': parlamentares_sessao})
# ===================================================================== # =====================================================================
# Expedientes # Expedientes
expediente = ExpedienteSessao.objects.filter( expediente = ExpedienteSessao.objects.filter(
@ -1541,7 +1543,8 @@ class ResumoView(DetailView):
'setimo_ordenacao': dict_ord_template[ordenacao.setimo], 'setimo_ordenacao': dict_ord_template[ordenacao.setimo],
'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo], 'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo],
'nono_ordenacao': dict_ord_template[ordenacao.nono], 'nono_ordenacao': dict_ord_template[ordenacao.nono],
'decimo_ordenacao': dict_ord_template[ordenacao.decimo]}) 'decimo_ordenacao': dict_ord_template[ordenacao.decimo],
'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro]})
else: else:
context.update( context.update(
{'primeiro_ordenacao': dict_ord_template['id_basica'], {'primeiro_ordenacao': dict_ord_template['id_basica'],

33
sapl/static/js/app.js

@ -178,30 +178,31 @@ function OptionalCustomFrontEnd() {
instance.customCheckBoxAndRadioWithoutLabel = function() { instance.customCheckBoxAndRadioWithoutLabel = function() {
$('[type=radio], [type=checkbox]').each(function() { $('[type=radio], [type=checkbox]').each(function() {
var _this = $(this); let _this = $(this)
var _label = _this.closest('label');
if (_label.length) if (this.id === undefined || this.id.length === 0) {
return; return
if (this.id)
_label = $('label[for='+this.id+']');
else {
_label = $('<label/>').insertBefore(this)
} }
if (_label.length) { let _label = _this.closest('label')
/*var _controls = _label.closest('.controls');
if (!_controls.length) { if (_label.length === 0) {
_controls = $('<div class="controls"/>').insertBefore(_label) _label = $('label[for='+this.id+']');
_controls.append(_label) if (_label.length === 0) {
}*/ _label = $('<label[for='+this.id+']/>').insertBefore(this)
}
}
_label.addClass('checkbox-inline'); if (this.type === "checkbox") {
_label.prepend(_this); _label.prepend(_this);
_this.checkbox(); _this.checkbox();
} }
else if (this.type === "radio") {
_label.prepend(_this);
_this.radio();
}
}); });
} }
instance.init = function() { instance.init = function() {

51
sapl/static/js/compilacao.js

@ -24,6 +24,7 @@ function insertWaitAjax(element) {
function DispostivoSearch(opts) { function DispostivoSearch(opts) {
$(function() { $(function() {
let formData = {}
var container_ds = $('body').children("#container_ds"); var container_ds = $('body').children("#container_ds");
if (container_ds.length > 0) if (container_ds.length > 0)
$(container_ds).remove(); $(container_ds).remove();
@ -67,6 +68,7 @@ function DispostivoSearch(opts) {
onChangeFieldSelects(); onChangeFieldSelects();
var onChangeParamTA = function(event) { var onChangeParamTA = function(event) {
var tipo_ta = $("select[name='tipo_ta']").val(); var tipo_ta = $("select[name='tipo_ta']").val();
var tipo_model = $("select[name='tipo_model']").val(); var tipo_model = $("select[name='tipo_model']").val();
var num_ta = $("input[name='num_ta']").val(); var num_ta = $("input[name='num_ta']").val();
@ -79,15 +81,22 @@ function DispostivoSearch(opts) {
if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) { if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) {
$("input[name='dispositivos_internos']").prop('disabled', false); $("input[name='dispositivos_internos']").prop('disabled', false);
$("input[name='dispositivos_internos']").each((idx, element) => {
element.parentElement.classList.remove('disabled')
});
$("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','1'); $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','1');
} }
else { else {
$("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', true); $("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', true);
$("input[name='dispositivos_internos']").prop('disabled', true); $("input[name='dispositivos_internos']").prop('disabled', true);
$("input[name='dispositivos_internos']").each((idx, element) => {
element.parentElement.classList.add('disabled')
});
$("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','0.3'); $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','0.3');
dispositivos_internos = 'False'; dispositivos_internos = 'False';
} }
var formData = { formData = {
'tipo_ta' : tipo_ta, 'tipo_ta' : tipo_ta,
'tipo_model' : tipo_model, 'tipo_model' : tipo_model,
'num_ta' : num_ta, 'num_ta' : num_ta,
@ -101,12 +110,15 @@ function DispostivoSearch(opts) {
'data_function' : data_function, 'data_function' : data_function,
}; };
window.localStorage.setItem("dispositivo_search_form_data", JSON.stringify(formData))
url = '/ta/search_fragment_form'; url = '/ta/search_fragment_form';
$('.result-busca-dispositivo').html(''); $('.result-busca-dispositivo').html('');
insertWaitAjax('.result-busca-dispositivo') insertWaitAjax('.result-busca-dispositivo')
$.get(url, formData).done(function( data ) { $.get(url, formData).done(function( data ) {
$('.result-busca-dispositivo').html(data); $('.result-busca-dispositivo').html(data);
//OptionalCustomFrontEnd().init();
if (data_type_selection == 'checkbox') { if (data_type_selection == 'checkbox') {
var tas = $('.result-busca-dispositivo').find('input[name="ta_select_all"]'); var tas = $('.result-busca-dispositivo').find('input[name="ta_select_all"]');
tas.off(); tas.off();
@ -125,11 +137,17 @@ function DispostivoSearch(opts) {
if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) { if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) {
$("input[name='dispositivos_internos']").prop('disabled', false); $("input[name='dispositivos_internos']").prop('disabled', false);
$("input[name='dispositivos_internos']").each((idx, element) => {
element.parentElement.classList.remove('disabled')
});
$("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','1'); $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','1');
} }
else { else {
$("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', true); $("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', true);
$("input[name='dispositivos_internos']").prop('disabled', true); $("input[name='dispositivos_internos']").prop('disabled', true);
$("input[name='dispositivos_internos']").each((idx, element) => {
element.parentElement.classList.add('disabled')
});
$("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','0.3'); $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','0.3');
dispositivos_internos = 'False'; dispositivos_internos = 'False';
} }
@ -150,6 +168,7 @@ function DispostivoSearch(opts) {
$.get(opts['url_form'], function(data) { $.get(opts['url_form'], function(data) {
container_ds.html(data); container_ds.html(data);
var modal_ds = $('#modal-ds'); var modal_ds = $('#modal-ds');
OptionalCustomFrontEnd().init();
modal_ds.find("select[name='tipo_ta']").change(function(event) { modal_ds.find("select[name='tipo_ta']").change(function(event) {
var url = ''; var url = '';
@ -166,6 +185,9 @@ function DispostivoSearch(opts) {
for (var i in data[item]) for (var i in data[item])
select.append($("<option>").attr('value',i).text(data[item][i])); select.append($("<option>").attr('value',i).text(data[item][i]));
} }
setTimeout(function() {
$("select[name='tipo_model']").val(formData.tipo_model);
}, 200)
//select.change(onChangeParamTA) //select.change(onChangeParamTA)
}); });
}); });
@ -222,8 +244,31 @@ function DispostivoSearch(opts) {
}); });
try {
formData = JSON.parse(window.localStorage.getItem("dispositivo_search_form_data"))
$("input[name='num_ta']").val(formData.num_ta);
$("input[name='ano_ta']").val(formData.ano_ta);
$("input[name='rotulo_dispositivo']").val(formData.rotulo);
$("input[name='texto_dispositivo']").val(formData.texto);
$("select[name='max_results']").val(formData.max_results);
} catch (e) {
}
setTimeout(function() {
try {
$("select[name='tipo_ta']").val(formData.tipo_ta);
$("select[name='tipo_ta']").trigger('change')
//modal_ds.find(".btn-busca").trigger('click')
//onChangeParamTA();
} catch (e) {
}
}, 200)
modal_ds.modal('show'); modal_ds.modal('show');
onChangeParamTA();
}) })
}); });
}); });

41
sapl/static/js/compilacao_edit.js

@ -167,6 +167,7 @@ function DispositivoEdit() {
instance.scrollTo(_this); instance.scrollTo(_this);
dpt_form.submit(instance.onSubmitFormRegistraRevogacao); dpt_form.submit(instance.onSubmitFormRegistraRevogacao);
var btn_fechar = _this.find('.btn-fechar'); var btn_fechar = _this.find('.btn-fechar');
btn_fechar.on('click', function() { btn_fechar.on('click', function() {
instance.clearEditSelected(); instance.clearEditSelected();
@ -228,6 +229,7 @@ function DispositivoEdit() {
if (editortype == 'tinymce' ) { if (editortype == 'tinymce' ) {
initTinymce(); initTinymce();
} }
OptionalCustomFrontEnd().init();
} }
dpt.trigger(trigger); dpt.trigger(trigger);
}).always(function() { }).always(function() {
@ -304,16 +306,29 @@ function DispositivoEdit() {
instance.onSubmitFormRegistraAlteracao = function(event) { instance.onSubmitFormRegistraAlteracao = function(event) {
var _this = this; var _this = this;
if (this.dispositivo_alterado === undefined) {
instance.modalMessage('Nenhum dispositivo selecionado', 'alert-info')
if (event != null)
event.preventDefault();
return
}
var dispositivo_alterado = this.dispositivo_alterado.length === undefined ? [this.dispositivo_alterado, ] : Array.from(this.dispositivo_alterado)
var form_data = { var form_data = {
'csrfmiddlewaretoken' : this['csrfmiddlewaretoken'].value, 'csrfmiddlewaretoken' : this.csrfmiddlewaretoken.value,
'dispositivo_alterado' : this['dispositivo_alterado'].value, 'dispositivo_alterado' : dispositivo_alterado.filter(
function(elem, idx, array) {
return elem.checked
}
).map(function(dsp) {
return dsp.value
}),
'formtype': 'get_form_alteracao', 'formtype': 'get_form_alteracao',
}; };
var url = $(this).closest('.dpt').attr( "pk" )+'/refresh'; var url = $(this).closest('.dpt').attr( "pk" )+'/refresh';
instance.waitShow(); instance.waitShow();
$.post(url, form_data) $.post(url, form_data, dataType="json")
.done(function(data) { .done(function(data) {
instance.clearEditSelected(); instance.clearEditSelected();
@ -364,11 +379,27 @@ function DispositivoEdit() {
instance.onSubmitFormRegistraRevogacao = function(event) { instance.onSubmitFormRegistraRevogacao = function(event) {
var _this = this; var _this = this;
if (this.dispositivo_revogado === undefined) {
instance.modalMessage('Nenhum dispositivo selecionado', 'alert-info')
if (event != null)
event.preventDefault();
return
}
var dispositivo_revogado = this.dispositivo_revogado.length === undefined ? [this.dispositivo_revogado, ] : Array.from(this.dispositivo_revogado)
var form_data = { var form_data = {
'csrfmiddlewaretoken' : this['csrfmiddlewaretoken'].value, 'csrfmiddlewaretoken' : this.csrfmiddlewaretoken.value,
'dispositivo_revogado' : this['dispositivo_revogado'].value, 'dispositivo_revogado' : dispositivo_revogado.filter(
function(elem, idx, array) {
return elem.checked
}
).map(function(dsp) {
return dsp.value
}),
'revogacao_em_bloco': this.revogacao_em_bloco.value,
'formtype': 'get_form_revogacao', 'formtype': 'get_form_revogacao',
}; };
var url = $(this).closest('.dpt').attr( "pk" )+'/refresh'; var url = $(this).closest('.dpt').attr( "pk" )+'/refresh';
instance.waitShow(); instance.waitShow();

38
sapl/static/styles/app.scss

@ -222,21 +222,49 @@ nav {
border: 1px solid #d6e1e5; border: 1px solid #d6e1e5;
border-radius: 4px; border-radius: 4px;
min-height: 20px; min-height: 20px;
.checkbox, .radio, .checkbox-inline, .radio-inline {
padding: 8px 8px 8px 36px;
margin: 0;
line-height: 1.6;
display: block;
&:hover {
background-color: #d6e1e5;
}
.icons {
top: auto;
left: 8px;
}
}
.checkbox-inline, .radio-inline {
display: inline-block;
}
.help-block { .help-block {
margin: $grid-gutter-width / 2; margin: $grid-gutter-width / 2;
padding: $grid-gutter-width / 2; padding: $grid-gutter-width / 2;
border: 2px dashed #d6e1e5; border: 2px dashed #d6e1e5;
} }
}
.controls-radio-checkbox__old {
padding: 0px;
border: 1px solid #d6e1e5;
border-radius: 4px;
min-height: 20px;
label { label {
padding: 5px; padding: 0;
line-height: 2.7;
padding-left: 36px;
.icons { .icons {
top: 5px; top: 8px;
left: 8px; left: 8px;
} }
&.checkbox-inline, &.radio-inline {
padding: 8px; &.checkbox-inline, &.radio-inline, {
padding-left: 36px; padding-right: 8px;
.icons { .icons {
top: 8px; top: 8px;
left: 8px; left: 8px;

2
sapl/templates/base.html

@ -184,7 +184,7 @@
<small> <small>
Desenvolvido pelo <a href="http://www.interlegis.leg.br/">Interlegis</a> em software livre e aberto. Desenvolvido pelo <a href="http://www.interlegis.leg.br/">Interlegis</a> em software livre e aberto.
</small> </small>
<span>Release: 3.1.132</span> <span>Release: 3.1.134</span>
</p> </p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">

4
sapl/templates/norma/layouts.yaml

@ -17,7 +17,7 @@ NormaJuridica:
- tipo numero ano - tipo numero ano
- data esfera_federacao complemento - data esfera_federacao complemento
- materia - materia
- data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao - data_publicacao veiculo_publicacao data_vigencia pagina_inicio_publicacao pagina_fim_publicacao
- texto_integral - texto_integral
- ementa - ementa
- indexacao - indexacao
@ -35,7 +35,7 @@ NormaJuridicaCreate:
- tipo ano numero - tipo ano numero
- data esfera_federacao complemento - data esfera_federacao complemento
- tipo_materia numero_materia ano_materia - tipo_materia numero_materia ano_materia
- data_publicacao veiculo_publicacao pagina_inicio_publicacao pagina_fim_publicacao - data_publicacao veiculo_publicacao data_vigencia pagina_inicio_publicacao pagina_fim_publicacao
- texto_integral - texto_integral
- ementa - ementa
- indexacao - indexacao

4
sapl/templates/protocoloadm/comprovante.html

@ -3,7 +3,7 @@
{% load static %} {% load static %}
{% block detail_content %} {% block detail_content %}
<style> <style xmlns:max-width="http://www.w3.org/1999/xhtml">
table { table {
width: 100%; width: 100%;
} }
@ -25,7 +25,7 @@
<table> <table>
<tr><td colspan="2" align="center"> <tr><td colspan="2" align="center">
<img height="150" width="150" <img height="90" width="90"
src="{% if logotipo %}{{ MEDIA_URL }}{{ logotipo }}{% else %}{% static 'img/logo.png' %}{% endif %}" src="{% if logotipo %}{{ MEDIA_URL }}{{ logotipo }}{% else %}{% static 'img/logo.png' %}{% endif %}"
alt="Logotipo" alt="Logotipo"
class="img-responsive visible-lg-inline-block vcenter"> class="img-responsive visible-lg-inline-block vcenter">

1
sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html

@ -7,4 +7,5 @@
{{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ; {{p.nome_parlamentar}} / {{ p|filiacao_data_filter:object.data_inicio }} ;
{% endfor %} {% endfor %}
</p> </p>
</fieldset> </fieldset>

6
sapl/templates/sessao/expedientemateria_list.html

@ -22,6 +22,12 @@
var pk_sessao = {{root_pk}}; var pk_sessao = {{root_pk}};
var pk_list = {{ object_list|to_list_pk|safe }}; var pk_list = {{ object_list|to_list_pk|safe }};
$(document).on('keyup', (e) => {
if (e.keyCode == 86){
window.open("{% url 'sapl.painel:voto_individual' %}",'Voto Individual','width=1000, height=800, scrollbars=yes');
};
});
$('tbody').sortable({ $('tbody').sortable({
start: function(event, ui) { start: function(event, ui) {

6
sapl/templates/sessao/ordemdia_list.html

@ -22,6 +22,12 @@
var pk_sessao = {{root_pk}}; var pk_sessao = {{root_pk}};
var pk_list = {{ object_list|to_list_pk|safe }}; var pk_list = {{ object_list|to_list_pk|safe }};
$(document).on('keyup', (e) => {
if (e.keyCode == 86){
window.open("{% url 'sapl.painel:voto_individual' %}",'Voto Individual','width=1000, height=800, scrollbars=yes');
};
});
$('tbody').sortable({ $('tbody').sortable({
start: function(event, ui) { start: function(event, ui) {

33
sapl/templates/sessao/presenca.html

@ -5,11 +5,9 @@
{% block actions %}{% endblock %} {% block actions %}{% endblock %}
{% block detail_content %} {% block detail_content %}
{% if perms|get_add_perm:view %} {% if perms|get_add_perm:view %}
<form method="POST"> <form method="POST">
{% csrf_token %} {% csrf_token %}
<div class="controls"> <div class="controls">
<div class="checkbox"> <div class="checkbox">
<label for="id_check_all"> <label for="id_check_all">
@ -17,59 +15,61 @@
</label> </label>
</div> </div>
</div> </div>
<br /> <br />
<div class="controls"> <div class="controls">
<div class="checkbox"> <div class="checkbox">
<label for="id_ativos"> <label for="id_ativos">
<input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente parlamentares ativos <input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente
parlamentares ativos
</label> </label>
</div> </div>
</div> </div>
<br /> <br />
<div class="controls "> <div class="controls ">
{% for parlamentar, check in view.get_presencas %} {% for parlamentar, check in view.get_presencas %}
{% if parlamentar.ativo %} {% if parlamentar.ativo %}
<div class="checkbox"> <div class="checkbox">
<label for="id_presenca_{{forloop.counter}}"> <label for="id_presenca_{{forloop.counter}}">
<input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_ativos" value="{{ parlamentar.id }}" {% if check %} checked {% endif %}/> <input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_ativos" value="{{ parlamentar.id }}"
{% if check %} checked {% endif %}>
{{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }} {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label> </label>
</div> </div>
{% else %} {% else %}
<div class="checkbox inativos" style="display:none;"> <div class="checkbox inativos" style="display:none;">
<label for="id_presenca_{{forloop.counter}}"> <label for="id_presenca_{{forloop.counter}}" class="inativos" style="display:none;">
<input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_inativos" value="{{ parlamentar.id }}" {% if check %} checked {% endif %}/> <input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_inativos" value="{{ parlamentar.id }}"
{% if check %} checked {% endif %}>
{{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }} {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label> </label>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</div> </div>
<br /> <br />
<input type="submit" value="Salvar" class="btn btn-primary" /> <input type="submit" value="Salvar" class="btn btn-primary" />
</form> </form>
{% else %} {% else %}
<div class="row"> <div class="row">
<div class="col-md-6"><h2>Parlamentares presentes</div> <div class="col-md-6">
<h2>Parlamentares presentes
</div> </div>
</br> </div>
<br />
{% for parlamentar, check in view.get_presencas %} {% for parlamentar, check in view.get_presencas %}
{% if check %} {% if check %}
<div class="row"> <div class="row">
<div class="col-md-6"><label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}</label></div> <div class="col-md-6">
<label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label>
</div>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endblock detail_content %} {% endblock detail_content %}
{% block extra_js %} {% block extra_js %}
@ -85,7 +85,6 @@
$(this).trigger('click'); $(this).trigger('click');
}); });
} }
} }
function escondeInativos() { function escondeInativos() {

17
sapl/templates/sessao/presenca_ordemdia.html

@ -9,7 +9,6 @@
{% if perms|get_add_perm:view %} {% if perms|get_add_perm:view %}
<form method="POST"> <form method="POST">
{% csrf_token %} {% csrf_token %}
<div class="controls"> <div class="controls">
<div class="checkbox"> <div class="checkbox">
<label for="id_check_all"> <label for="id_check_all">
@ -23,7 +22,8 @@
<div class="controls"> <div class="controls">
<div class="checkbox"> <div class="checkbox">
<label for="id_ativos"> <label for="id_ativos">
<input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente parlamentares ativos <input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente
parlamentares ativos
</label> </label>
</div> </div>
</div> </div>
@ -35,21 +35,22 @@
{% if parlamentar.ativo %} {% if parlamentar.ativo %}
<div class="checkbox"> <div class="checkbox">
<label for="id_presenca_{{forloop.counter}}"> <label for="id_presenca_{{forloop.counter}}">
<input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_ativos" value="{{ parlamentar.id }}" {% if check %} checked {% endif %}/> <input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_ativos" value="{{ parlamentar.id }}"
{% if check %} checked {% endif %} />
{{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }} {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label> </label>
</div> </div>
{% else %} {% else %}
<div class="checkbox inativos" style="display:none;"> <div class="checkbox inativos" style="display:none;">
<label for="id_presenca_{{forloop.counter}}" > <label for="id_presenca_{{forloop.counter}}" >
<input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_inativos" value="{{ parlamentar.id }}" {% if check %} checked {% endif %}/> <input type="checkbox" id="id_presenca_{{forloop.counter}}" name="presenca_inativos" value="{{ parlamentar.id }}"
{% if check %} checked {% endif %} />
{{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }} {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label> </label>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</div> </div>
<br /> <br />
<input type="submit" value="Salvar" class="btn btn-primary" /> <input type="submit" value="Salvar" class="btn btn-primary" />
</form> </form>
@ -57,9 +58,11 @@
{% else %} {% else %}
<div class="row"> <div class="row">
<div class="col-md-6"><h2>Parlamentares presentes</div> <div class="col-md-6">
<h2>Parlamentares presentes
</div> </div>
</br> </div>
<br/>
{% for parlamentar, check in view.get_presencas_ordem %} {% for parlamentar, check in view.get_presencas_ordem %}
{% if check %} {% if check %}

2
setup.py

@ -52,7 +52,7 @@ install_requires = [
] ]
setup( setup(
name='interlegis-sapl', name='interlegis-sapl',
version='3.1.132', version='3.1.134',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007',

Loading…
Cancel
Save