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. 22
      sapl/compilacao/models.py
  4. 141
      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. 9
      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. 40
      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. 155
      sapl/templates/sessao/presenca.html
  27. 145
      sapl/templates/sessao/presenca_ordemdia.html
  28. 2
      sapl/templates/sessao/resumo_ata.html
  29. 2
      setup.py

2
docker-compose.yml

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

15
sapl/compilacao/forms.py

@ -1343,7 +1343,7 @@ class DispositivoRegistroAlteracaoForm(Form):
'dispositivo_alterado',
data_sapl_ta='DispositivoSearch',
data_field='dispositivo_alterado',
data_type_selection='radio',
data_type_selection='checkbox',
template="compilacao/layout/dispositivo_radio.html")
layout.append(Fieldset(_('Registro de Alteração - '
@ -1378,6 +1378,14 @@ class DispositivoRegistroRevogacaoForm(Form):
required=False,
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(),
required=False)
@ -1391,11 +1399,12 @@ class DispositivoRegistroRevogacaoForm(Form):
'dispositivo_revogado',
data_sapl_ta='DispositivoSearch',
data_field='dispositivo_revogado',
data_type_selection='radio',
data_type_selection='checkbox',
template="compilacao/layout/dispositivo_radio.html")
layout.append(Fieldset(_('Registro de Revogação - '
'Seleção do Dispositivo a ser Revogado'),
Field(InlineRadios('revogacao_em_bloco')),
row_dispositivo,
css_class="col-md-12"))
layout.append(Field('dispositivo_search_form'))
@ -1439,7 +1448,7 @@ class DispositivoRegistroInclusaoForm(Form):
'dispositivo_base_para_inclusao',
data_sapl_ta='DispositivoSearch',
data_field='dispositivo_base_para_inclusao',
data_type_selection='radio',
data_type_selection='checkbox',
template="compilacao/layout/dispositivo_radio.html")
layout.append(Fieldset(_('Registro de Inclusão - '

22
sapl/compilacao/models.py

@ -187,7 +187,7 @@ class TextoArticulado(TimestampedMixin):
ementa = models.TextField(verbose_name=_('Ementa'))
observacao = models.TextField(blank=True, verbose_name=_('Observação'))
numero = models.CharField(
max_length=8,verbose_name=_('Número'))
max_length=8, verbose_name=_('Número'))
ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'))
tipo_ta = models.ForeignKey(
TipoTextoArticulado,
@ -1386,28 +1386,30 @@ class Dispositivo(BaseModel, TimestampedMixin):
return result
def criar_espaco(self, espaco_a_criar, local):
def criar_espaco(self, espaco_a_criar, local=None):
if local == 'json_add_next':
proximo_bloco = Dispositivo.objects.filter(
ordem__gt=self.ordem,
nivel__lte=self.nivel,
ta_id=self.ta_id)[:1]
ta_id=self.ta_id).first()
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(
ordem__gt=self.ordem,
nivel__lte=self.nivel + 1,
ta_id=self.ta_id).exclude(
tipo_dispositivo__class_css='caput')[:1]
ta_id=self.ta_id).exclude(auto_inserido=True).first()
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:
proximo_bloco = Dispositivo.objects.filter(
ordem__gte=self.ordem,
ta_id=self.ta_id)[:1]
ta_id=self.ta_id).first()
if proximo_bloco.exists():
ordem = proximo_bloco[0].ordem
if proximo_bloco:
ordem = proximo_bloco.ordem
proximo_bloco = Dispositivo.objects.order_by('-ordem').filter(
ordem__gte=ordem,
ta_id=self.ta_id)

141
sapl/compilacao/views.py

@ -9,10 +9,12 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.core.signing import Signer
from django.core.urlresolvers import reverse, reverse_lazy
from django.db import transaction
from django.db.models import Q
from django.db.models.query import QuerySet
from django.http.response import (HttpResponse, HttpResponseRedirect,
JsonResponse, Http404)
from django.shortcuts import get_object_or_404, redirect
@ -1525,6 +1527,13 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
return data
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
base_ordem = base.ordem
if base.dispositivo_subsequente or base.dispositivo_substituido:
@ -1836,7 +1845,10 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
dpts = base.dispositivos_alterados_set.all().order_by(
'-ordem_bloco_atualizador')
for dpt in dpts:
self.remover_dispositivo(dpt, False)
try:
self.remover_dispositivo(dpt, False)
except Exception as e:
print(e)
if base.pk:
"""
@ -2585,17 +2597,20 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
return self.json_add_next_registra_inclusao(
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(
bloco_alteracao,
dispositivo_a_revogar,
revogacao=True
dsp_a_rev,
revogacao=True,
em_bloco=em_bloco
)
def registra_alteracao(self,
bloco_alteracao,
dispositivo_a_alterar,
revogacao=False):
dsp_a_alterar,
revogacao=False,
em_bloco=False):
"""
Caracteristicas:
1 - Se é um dispositivo simples e sem subsequente
@ -2621,14 +2636,69 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
data.update({'pk': 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
}
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)
for d in history:
history = dsp_a_alterar.history()
for d in list(history):
if d.inicio_vigencia <= bloco_alteracao.inicio_vigencia:
dispositivo_a_alterar = d
dsp_a_alterar = d
break
if (dispositivo_a_alterar.inicio_vigencia >
if (dsp_a_alterar.inicio_vigencia >
bloco_alteracao.inicio_vigencia):
self.set_message(
data, 'danger',
@ -2637,7 +2707,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
'Alterador!'), time=10000)
return data
if dispositivo_a_alterar.tipo_dispositivo.dispositivo_de_articulacao\
if dsp_a_alterar.tipo_dispositivo.dispositivo_de_articulacao\
and not revogacao:
self.set_message(
data, 'warning',
@ -2647,13 +2717,13 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
'para o dispositivo que se quer alterar.'), modal=True)
ndp = Dispositivo.new_instance_based_on(
dispositivo_a_alterar, dispositivo_a_alterar.tipo_dispositivo)
ndp.auto_inserido = dispositivo_a_alterar.auto_inserido
ndp.rotulo = dispositivo_a_alterar.rotulo
dsp_a_alterar, dsp_a_alterar.tipo_dispositivo)
ndp.auto_inserido = dsp_a_alterar.auto_inserido
ndp.rotulo = dsp_a_alterar.rotulo
ndp.publicacao = bloco_alteracao.publicacao
if not revogacao:
ndp.texto = dispositivo_a_alterar.texto
ndp.texto = dsp_a_alterar.texto
else:
ndp.texto = Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO
ndp.dispositivo_de_revogacao = True
@ -2668,15 +2738,15 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
ndp.inicio_vigencia = bloco_alteracao.inicio_eficacia
try:
ordem = dispositivo_a_alterar.criar_espaco(
espaco_a_criar=1, local='json_add_in')
ordem = dsp_a_alterar.criar_espaco(
espaco_a_criar=1, local='json_add_in_with_auto')
ndp.ordem = ordem
ndp.dispositivo_atualizador = bloco_alteracao
ndp.ta_publicado = bloco_alteracao.ta
p = dispositivo_a_alterar
n = dispositivo_a_alterar.dispositivo_subsequente
p = dsp_a_alterar
n = dsp_a_alterar.dispositivo_subsequente
ndp.dispositivo_substituido = p
ndp.dispositivo_subsequente = n
@ -2711,7 +2781,7 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
n.dispositivo_substituido = ndp
n.save()
filhos_diretos = dispositivo_a_alterar.dispositivos_filhos_set
filhos_diretos = dsp_a_alterar.dispositivos_filhos_set
for d in filhos_diretos.all():
d.dispositivo_pai = ndp
d.save()
@ -2728,14 +2798,20 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
self.set_message(
data, 'success',
_('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:
username = self.request.user.username
self.logger.error("user=" + username + ". " + str(e))
print(e)
data.update({'pk': ndp.pk,
'pai': [bloco_alteracao.pk, ]})
self.set_message(
data, 'danger',
_('Não é foi possível registrar sua solicitação!'), time=10000)
return data
@ -2836,17 +2912,16 @@ class DispositivoDinamicEditView(
formtype = request.POST['formtype']
if formtype == 'get_form_alteracao':
dispositivo_a_alterar = Dispositivo.objects.get(
pk=request.POST['dispositivo_alterado'])
data = self.registra_alteracao(d, dispositivo_a_alterar)
data = self.registra_alteracao(
d, request.POST.getlist('dispositivo_alterado[]', []))
elif formtype == 'get_form_revogacao':
dispositivo_a_revogar = Dispositivo.objects.get(
pk=request.POST['dispositivo_revogado'])
data = self.registra_revogacao(d, dispositivo_a_revogar)
data = self.registra_revogacao(
d,
request.POST.getlist('dispositivo_revogado[]', []),
request.POST.get("revogacao_em_bloco") == "True"
)
if formtype == 'get_form_inclusao':

7
sapl/materia/views.py

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

8
sapl/norma/forms.py

@ -64,7 +64,7 @@ class NormaFilterSet(django_filters.FilterSet):
class Meta:
model = NormaJuridica
fields = ['tipo', 'numero', 'ano', 'data',
fields = ['tipo', 'numero', 'ano', 'data', 'data_vigencia',
'data_publicacao', 'ementa', 'assuntos']
def __init__(self, *args, **kwargs):
@ -73,13 +73,14 @@ class NormaFilterSet(django_filters.FilterSet):
row1 = to_row([('tipo', 4), ('numero', 4), ('ano', 4)])
row2 = to_row([('data', 6), ('data_publicacao', 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.form_method = 'GET'
self.form.helper.layout = Layout(
Fieldset(_('Pesquisa de Norma'),
row1, row2, row3, row4,
row1, row2, row3, row4, row5,
form_actions(label='Pesquisar'))
)
@ -120,6 +121,7 @@ class NormaJuridicaForm(ModelForm):
'numero_materia',
'ano_materia',
'data_publicacao',
'data_vigencia',
'veiculo_publicacao',
'pagina_inicio_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(
AssuntoNorma, blank=True,
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)
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.nono]
tmp += dict_ord_template[ordenacao.decimo]
tmp += dict_ord_template[ordenacao.decimo_primeiro]
else:
tmp += inf_basicas(inf_basicas_dic)

26
sapl/relatorios/views.py

@ -466,6 +466,29 @@ def get_espelho(mats):
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):
inf_basicas_dic = {}
@ -535,6 +558,9 @@ def get_sessao_plenaria(sessao, casa):
# https://github.com/interlegis/sapl/issues/1009
conteudo = conteudo.replace('&', '&amp;')
# https://github.com/interlegis/sapl/issues/2386
conteudo = remove_html_comments(conteudo)
dic_expedientes["txt_expediente"] = conteudo
if dic_expedientes:

9
sapl/sessao/forms.py

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

9
sapl/sessao/views.py

@ -1,3 +1,4 @@
from operator import itemgetter
import logging
from re import sub
@ -783,8 +784,8 @@ class PresencaView(FormMixin, PresencaMixin, DetailView):
sessao.sessao_plenaria = self.object
sessao.parlamentar = Parlamentar.objects.get(id=p)
sessao.save()
username = request.user.username
self.logger.info("user=" + username + ". SessaoPlenariaPresenca salva com sucesso (parlamentar_id={})!".format(p))
username = request.user.username
self.logger.info("user=" + username + ". SessaoPlenariaPresenca salva com sucesso (parlamentar_id={})!".format(p))
msg = _('Presença em Sessão salva com sucesso!')
messages.add_message(request, messages.SUCCESS, msg)
@ -1337,6 +1338,7 @@ class ResumoView(DetailView):
context.update({'presenca_sessao': parlamentares_sessao})
# =====================================================================
# Expedientes
expediente = ExpedienteSessao.objects.filter(
@ -1541,7 +1543,8 @@ class ResumoView(DetailView):
'setimo_ordenacao': dict_ord_template[ordenacao.setimo],
'oitavo_ordenacao': dict_ord_template[ordenacao.oitavo],
'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:
context.update(
{'primeiro_ordenacao': dict_ord_template['id_basica'],

33
sapl/static/js/app.js

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

51
sapl/static/js/compilacao.js

@ -24,6 +24,7 @@ function insertWaitAjax(element) {
function DispostivoSearch(opts) {
$(function() {
let formData = {}
var container_ds = $('body').children("#container_ds");
if (container_ds.length > 0)
$(container_ds).remove();
@ -67,6 +68,7 @@ function DispostivoSearch(opts) {
onChangeFieldSelects();
var onChangeParamTA = function(event) {
var tipo_ta = $("select[name='tipo_ta']").val();
var tipo_model = $("select[name='tipo_model']").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) {
$("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');
}
else {
$("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', 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');
dispositivos_internos = 'False';
}
var formData = {
formData = {
'tipo_ta' : tipo_ta,
'tipo_model' : tipo_model,
'num_ta' : num_ta,
@ -101,12 +110,15 @@ function DispostivoSearch(opts) {
'data_function' : data_function,
};
window.localStorage.setItem("dispositivo_search_form_data", JSON.stringify(formData))
url = '/ta/search_fragment_form';
$('.result-busca-dispositivo').html('');
insertWaitAjax('.result-busca-dispositivo')
$.get(url, formData).done(function( data ) {
$('.result-busca-dispositivo').html(data);
//OptionalCustomFrontEnd().init();
if (data_type_selection == 'checkbox') {
var tas = $('.result-busca-dispositivo').find('input[name="ta_select_all"]');
tas.off();
@ -125,11 +137,17 @@ function DispostivoSearch(opts) {
if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) {
$("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');
}
else {
$("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', 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');
dispositivos_internos = 'False';
}
@ -150,6 +168,7 @@ function DispostivoSearch(opts) {
$.get(opts['url_form'], function(data) {
container_ds.html(data);
var modal_ds = $('#modal-ds');
OptionalCustomFrontEnd().init();
modal_ds.find("select[name='tipo_ta']").change(function(event) {
var url = '';
@ -166,6 +185,9 @@ function DispostivoSearch(opts) {
for (var i in data[item])
select.append($("<option>").attr('value',i).text(data[item][i]));
}
setTimeout(function() {
$("select[name='tipo_model']").val(formData.tipo_model);
}, 200)
//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');
onChangeParamTA();
})
});
});

41
sapl/static/js/compilacao_edit.js

@ -167,6 +167,7 @@ function DispositivoEdit() {
instance.scrollTo(_this);
dpt_form.submit(instance.onSubmitFormRegistraRevogacao);
var btn_fechar = _this.find('.btn-fechar');
btn_fechar.on('click', function() {
instance.clearEditSelected();
@ -228,6 +229,7 @@ function DispositivoEdit() {
if (editortype == 'tinymce' ) {
initTinymce();
}
OptionalCustomFrontEnd().init();
}
dpt.trigger(trigger);
}).always(function() {
@ -304,16 +306,29 @@ function DispositivoEdit() {
instance.onSubmitFormRegistraAlteracao = function(event) {
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 = {
'csrfmiddlewaretoken' : this['csrfmiddlewaretoken'].value,
'dispositivo_alterado' : this['dispositivo_alterado'].value,
'csrfmiddlewaretoken' : this.csrfmiddlewaretoken.value,
'dispositivo_alterado' : dispositivo_alterado.filter(
function(elem, idx, array) {
return elem.checked
}
).map(function(dsp) {
return dsp.value
}),
'formtype': 'get_form_alteracao',
};
var url = $(this).closest('.dpt').attr( "pk" )+'/refresh';
instance.waitShow();
$.post(url, form_data)
$.post(url, form_data, dataType="json")
.done(function(data) {
instance.clearEditSelected();
@ -364,11 +379,27 @@ function DispositivoEdit() {
instance.onSubmitFormRegistraRevogacao = function(event) {
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 = {
'csrfmiddlewaretoken' : this['csrfmiddlewaretoken'].value,
'dispositivo_revogado' : this['dispositivo_revogado'].value,
'csrfmiddlewaretoken' : this.csrfmiddlewaretoken.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',
};
var url = $(this).closest('.dpt').attr( "pk" )+'/refresh';
instance.waitShow();

40
sapl/static/styles/app.scss

@ -222,21 +222,49 @@ nav {
border: 1px solid #d6e1e5;
border-radius: 4px;
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 {
margin: $grid-gutter-width / 2;
padding: $grid-gutter-width / 2;
border: 2px dashed #d6e1e5;
}
}
.controls-radio-checkbox__old {
padding: 0px;
border: 1px solid #d6e1e5;
border-radius: 4px;
min-height: 20px;
label {
padding: 5px;
padding: 0;
line-height: 2.7;
padding-left: 36px;
.icons {
top: 5px;
top: 8px;
left: 8px;
}
&.checkbox-inline, &.radio-inline {
padding: 8px;
padding-left: 36px;
&.checkbox-inline, &.radio-inline, {
padding-right: 8px;
.icons {
top: 8px;
left: 8px;
@ -244,7 +272,7 @@ nav {
}
}
.checkbox, .radio, .checkbox-inline, .radio-inline {
margin: 0;
margin: 0;
&:hover {
background-color: #d6e1e5;
}

2
sapl/templates/base.html

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

4
sapl/templates/norma/layouts.yaml

@ -17,7 +17,7 @@ NormaJuridica:
- tipo numero ano
- data esfera_federacao complemento
- 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
- ementa
- indexacao
@ -35,7 +35,7 @@ NormaJuridicaCreate:
- tipo ano numero
- data esfera_federacao complemento
- 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
- ementa
- indexacao

4
sapl/templates/protocoloadm/comprovante.html

@ -3,7 +3,7 @@
{% load static %}
{% block detail_content %}
<style>
<style xmlns:max-width="http://www.w3.org/1999/xhtml">
table {
width: 100%;
}
@ -25,7 +25,7 @@
<table>
<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 %}"
alt="Logotipo"
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 }} ;
{% endfor %}
</p>
</fieldset>

6
sapl/templates/sessao/expedientemateria_list.html

@ -22,6 +22,12 @@
var pk_sessao = {{root_pk}};
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({
start: function(event, ui) {

6
sapl/templates/sessao/ordemdia_list.html

@ -22,6 +22,12 @@
var pk_sessao = {{root_pk}};
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({
start: function(event, ui) {

155
sapl/templates/sessao/presenca.html

@ -5,91 +5,90 @@
{% block actions %}{% endblock %}
{% block detail_content %}
{% if perms|get_add_perm:view %}
<form method="POST">
{% csrf_token %}
<div class="controls">
<div class="checkbox">
<label for="id_check_all">
<input type="checkbox" id="id_check_all" onchange="checkAll(event)" /> Marcar/Desmarcar Todos
</label>
</div>
</div>
<br />
<div class="controls">
<div class="checkbox">
<label for="id_ativos">
<input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente parlamentares ativos
</label>
</div>
</div>
<br />
<div class="controls">
{% for parlamentar, check in view.get_presencas %}
{% if parlamentar.ativo %}
<div class="checkbox">
<label for="id_presenca_{{forloop.counter}}">
<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 }}
</label>
</div>
{% else %}
<div class="checkbox inativos" style="display:none;">
<label for="id_presenca_{{forloop.counter}}">
<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 }}
</label>
</div>
{% endif %}
{% endfor %}
<form method="POST">
{% csrf_token %}
<div class="controls">
<div class="checkbox">
<label for="id_check_all">
<input type="checkbox" id="id_check_all" onchange="checkAll(event)" /> Marcar/Desmarcar Todos
</label>
</div>
<br />
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>
{% else %}
<div class="row">
<div class="col-md-6"><h2>Parlamentares presentes</div>
</div>
</br>
</div>
<br />
<div class="controls">
<div class="checkbox">
<label for="id_ativos">
<input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente
parlamentares ativos
</label>
</div>
</div>
<br />
<div class="controls ">
{% for parlamentar, check in view.get_presencas %}
{% if check %}
<div class="row">
<div class="col-md-6"><label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}</label></div>
</div>
{% endif %}
{% if parlamentar.ativo %}
<div class="checkbox">
<label for="id_presenca_{{forloop.counter}}">
<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 }}
</label>
</div>
{% else %}
<div class="checkbox inativos" style="display:none;">
<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 %}>
{{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label>
</div>
{% endif %}
{% endfor %}
</div>
<br />
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>
{% endif %}
{% else %}
<div class="row">
<div class="col-md-6">
<h2>Parlamentares presentes
</div>
</div>
<br />
{% for parlamentar, check in view.get_presencas %}
{% if check %}
<div class="row">
<div class="col-md-6">
<label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}
</label>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
{% endblock detail_content %}
{% block extra_js %}
<script language="JavaScript">
function checkAll(event) {
$('[name=presenca_ativos]').each(function() {
$(this).prop('checked', event.target.checked ? 'checked': null);
$(this).trigger('click');
});
if (($('[name=ativos]').is(':checked')) == false) {
$('[name=presenca_inativos]').each(function() {
$(this).prop('checked', event.target.checked ? 'checked': null);
$(this).trigger('click');
});
}
}
function escondeInativos() {
$(".inativos").toggle();
}
</script>
<script language="JavaScript">
function checkAll(event) {
$('[name=presenca_ativos]').each(function () {
$(this).prop('checked', event.target.checked ? 'checked' : null);
$(this).trigger('click');
});
if (($('[name=ativos]').is(':checked')) == false) {
$('[name=presenca_inativos]').each(function () {
$(this).prop('checked', event.target.checked ? 'checked' : null);
$(this).trigger('click');
});
}
}
function escondeInativos() {
$(".inativos").toggle();
}
</script>
{% endblock %}

145
sapl/templates/sessao/presenca_ordemdia.html

@ -7,90 +7,93 @@
{% block detail_content %}
{% if perms|get_add_perm:view %}
<form method="POST">
{% csrf_token %}
<div class="controls">
<div class="checkbox">
<label for="id_check_all">
<input type="checkbox" id="id_check_all" onchange="checkAll(event)" /> Marcar/Desmarcar Todos
</label>
</div>
<form method="POST">
{% csrf_token %}
<div class="controls">
<div class="checkbox">
<label for="id_check_all">
<input type="checkbox" id="id_check_all" onchange="checkAll(event)" /> Marcar/Desmarcar Todos
</label>
</div>
</div>
<br />
<br />
<div class="controls">
<div class="checkbox">
<label for="id_ativos">
<input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente parlamentares ativos
</label>
</div>
<div class="controls">
<div class="checkbox">
<label for="id_ativos">
<input type="checkbox" name="ativos" id="id_ativos" onchange="escondeInativos()" checked /> Exibir somente
parlamentares ativos
</label>
</div>
</div>
<br />
<div class="controls">
{% for parlamentar, check in view.get_presencas_ordem %}
{% if parlamentar.ativo %}
<div class="checkbox">
<label for="id_presenca_{{forloop.counter}}">
<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 }}
</label>
</div>
{% else %}
<div class="checkbox inativos" style="display:none;">
<label for="id_presenca_{{forloop.counter}}">
<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 }}
</label>
</div>
{% endif %}
{% endfor %}
</div>
<br />
<br />
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>
<div class="controls">
{% for parlamentar, check in view.get_presencas_ordem %}
{% if parlamentar.ativo %}
<div class="checkbox">
<label for="id_presenca_{{forloop.counter}}">
<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 }}
</label>
</div>
{% else %}
<div class="checkbox inativos" style="display:none;">
<label for="id_presenca_{{forloop.counter}}" >
<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 }}
</label>
</div>
{% endif %}
{% endfor %}
</div>
<br />
<input type="submit" value="Salvar" class="btn btn-primary" />
</form>
{% else %}
<div class="row">
<div class="col-md-6"><h2>Parlamentares presentes</div>
</div>
</br>
{% for parlamentar, check in view.get_presencas_ordem %}
{% if check %}
<div class="row">
<div class="col-md-6"><label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}</label></div>
</div>
{% endif %}
{% endfor %}
<div class="row">
<div class="col-md-6">
<h2>Parlamentares presentes
</div>
</div>
<br/>
{% for parlamentar, check in view.get_presencas_ordem %}
{% if check %}
<div class="row">
<div class="col-md-6"><label for="parlamentar"> - {{ parlamentar.nome_parlamentar }} / {{ parlamentar|filiacao_data_filter:object.data_inicio }}</label></div>
</div>
{% endif %}
{% endfor %}
{% endif %}
{% endblock detail_content %}
{% block extra_js %}
<script language="JavaScript">
function checkAll(event) {
$('[name=presenca_ativos]').each(function() {
$(this).prop('checked', event.target.checked ? 'checked': null);
$(this).trigger('click');
});
if (($('[name=ativos]').is(':checked')) == false) {
$('[name=presenca_inativos]').each(function() {
$(this).prop('checked', event.target.checked ? 'checked': null);
$(this).trigger('click');
});
}
}
function escondeInativos() {
$(".inativos").toggle();
}
</script>
<script language="JavaScript">
function checkAll(event) {
$('[name=presenca_ativos]').each(function () {
$(this).prop('checked', event.target.checked ? 'checked' : null);
$(this).trigger('click');
});
if (($('[name=ativos]').is(':checked')) == false) {
$('[name=presenca_inativos]').each(function () {
$(this).prop('checked', event.target.checked ? 'checked' : null);
$(this).trigger('click');
});
}
}
function escondeInativos() {
$(".inativos").toggle();
}
</script>
{% endblock %}

2
sapl/templates/sessao/resumo_ata.html

@ -19,6 +19,6 @@
{% include 'sessao/blocos_ata/'|add:oitavo_ordenacao %}
{% include 'sessao/blocos_ata/'|add:nono_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %}
{% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %}
{% include 'sessao/blocos_ata/assinaturas.html' %}
{% endblock detail_content %}

2
setup.py

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

Loading…
Cancel
Save