Browse Source

Merge branch '3.1.x' into 3174-perm-op-mat

pull/3215/head
Edward 5 years ago
committed by GitHub
parent
commit
2e1a5a31e1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      requirements/requirements.txt
  2. 9
      sapl/materia/forms.py
  3. 23
      sapl/materia/migrations/0068_configetiquetamaterialegislativa.py
  4. 20
      sapl/materia/migrations/0069_auto_20200518_1519.py
  5. 8
      sapl/materia/models.py
  6. 4
      sapl/materia/urls.py
  7. 20
      sapl/materia/views.py
  8. 6
      sapl/norma/views.py
  9. 11
      sapl/parlamentares/forms.py
  10. 4
      sapl/relatorios/urls.py
  11. 59
      sapl/relatorios/views.py
  12. 1
      sapl/rules/map_rules.py
  13. 180
      sapl/sessao/views.py
  14. 19
      sapl/templates/materia/config_etiqueta_materia.html
  15. 6
      sapl/templates/materia/layouts.yaml
  16. 6
      sapl/templates/materia/materialegislativa_detail.html
  17. 2
      sapl/templates/materia/materialegislativa_filter.html
  18. 182
      sapl/templates/materia/materialegislativa_form.html
  19. 3
      sapl/templates/menu_tabelas_auxiliares.yaml
  20. 116
      sapl/templates/norma/normajuridica_form.html
  21. 3
      sapl/templates/relatorios/blocos_sessao_plenaria/materias_expediente.html
  22. 3
      sapl/templates/relatorios/blocos_sessao_plenaria/materias_ordemdia.html
  23. 40
      sapl/templates/relatorios/etiqueta_materia_legislativa.html
  24. 3
      sapl/templates/sessao/blocos_ata/materias_expediente.html
  25. 3
      sapl/templates/sessao/blocos_ata/materias_ordem_dia.html
  26. 5
      sapl/templates/sessao/blocos_resumo/materias_expediente.html
  27. 5
      sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html
  28. 17
      sapl/templates/sessao/oradores_create.html

1
requirements/requirements.txt

@ -31,6 +31,7 @@ more-itertools==8.2.0
pysolr==3.6.0
PyPDF4==1.27.0
pyoai==2.5.0
Unidecode==1.1.1
git+https://github.com/interlegis/trml2pdf
git+https://github.com/interlegis/django-admin-bootstrapped

9
sapl/materia/forms.py

@ -34,7 +34,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
MateriaLegislativa, Orgao,
RegimeTramitacao, StatusTramitacao,
TipoDocumento, TipoProposicao,
UnidadeTramitacao)
UnidadeTramitacao,ConfigEtiquetaMateriaLegislativa)
from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
from sapl.parlamentares.models import Legislatura, Partido, Parlamentar
@ -2913,3 +2913,10 @@ class MateriaPesquisaSimplesForm(forms.Form):
_('A Data Final não pode ser menor que a Data Inicial'))
return cleaned_data
class ConfigEtiquetaMateriaLegislativaForms(ModelForm):
class Meta:
model = ConfigEtiquetaMateriaLegislativa
fields = '__all__'

23
sapl/materia/migrations/0068_configetiquetamaterialegislativa.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-05-18 18:14
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('materia', '0067_auto_20200416_1538'),
]
operations = [
migrations.CreateModel(
name='ConfigEtiquetaMateriaLegislativa',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('largura', models.FloatField(default=5)),
('altura', models.FloatField(default=3)),
],
),
]

20
sapl/materia/migrations/0069_auto_20200518_1519.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-05-18 18:19
from __future__ import unicode_literals
from django.db import migrations
def create_first(apps, schema_editor):
db_alias = schema_editor.connection.alias
Type = apps.get_model("materia", "ConfigEtiquetaMateriaLegislativa")
Type.objects.using(db_alias).create()
class Migration(migrations.Migration):
dependencies = [
('materia', '0068_configetiquetamaterialegislativa'),
]
operations = [
migrations.RunPython(create_first),
]

8
sapl/materia/models.py

@ -1116,3 +1116,11 @@ class MateriaEmTramitacao(models.Model):
def __str__(self):
return '{}/{}'.format(self.materia, self.tramitacao)
class ConfigEtiquetaMateriaLegislativa(models.Model):
largura = models.FloatField(default=5)
altura = models.FloatField(default=3)
def save(self, *args, **kwargs):
self.id = 1
return super().save(*args, **kwargs)

4
sapl/materia/urls.py

@ -27,7 +27,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
proposicao_texto, recuperar_materia,
ExcluirTramitacaoEmLoteView, RetornarProposicao,
MateriaPesquisaSimplesView,
DespachoInicialMultiCreateView, get_zip_docacessorios, get_pdf_docacessorios)
DespachoInicialMultiCreateView, get_zip_docacessorios,
get_pdf_docacessorios, configEtiquetaMateriaLegislativaCrud)
from sapl.norma.views import NormaPesquisaSimplesView
from sapl.protocoloadm.views import (
FichaPesquisaAdmView, FichaSelecionaAdmView)
@ -172,6 +173,7 @@ urlpatterns_sistema = [
url(r'^sistema/materia/status-tramitacao/',
include(StatusTramitacaoCrud.get_urls())),
url(r'^sistema/materia/orgao/', include(OrgaoCrud.get_urls())),
url(r'^sistema/materia/config-etiqueta-materia-legislativas/',configEtiquetaMateriaLegislativaCrud, name="configEtiquetaMateriaLegislativaCrud"),
]
urlpatterns = urlpatterns_impressos + urlpatterns_materia + \

20
sapl/materia/views.py

@ -32,6 +32,8 @@ from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django.shortcuts import render
from django_filters.views import FilterView
@ -48,7 +50,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, AutoriaMultiCreateForm
ConfirmarProposicaoForm, DevolverProposicaoForm,
DespachoInicialCreateForm, LegislacaoCitadaForm,
MateriaPesquisaSimplesForm, OrgaoForm, ProposicaoForm,
TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm)
TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm,ConfigEtiquetaMateriaLegislativaForms)
from sapl.norma.models import LegislacaoCitada
from sapl.parlamentares.models import Legislatura
from sapl.protocoloadm.models import Protocolo
@ -72,7 +74,7 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, De
DocumentoAcessorio, MateriaAssunto, MateriaLegislativa, Numeracao, Orgao,
Origem, Proposicao, RegimeTramitacao, Relatoria, StatusTramitacao,
TipoDocumento, TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao,
Tramitacao, UnidadeTramitacao)
Tramitacao, UnidadeTramitacao,ConfigEtiquetaMateriaLegislativa)
AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia')
@ -2822,3 +2824,17 @@ def get_pdf_docacessorios(request, pk):
response['Content-Disposition'] = ('attachment; filename="%s"'
% external_name)
return response
def configEtiquetaMateriaLegislativaCrud(request):
config = ConfigEtiquetaMateriaLegislativa.objects.last()
if request.method == "POST":
form = ConfigEtiquetaMateriaLegislativaForms(request.POST, instance=config)
if form.is_valid():
config = form.save(commit=False)
config.published_date = timezone.now()
config.save()
return redirect('materia/config_etiqueta_materia.html', {'form': form})
else:
form = ConfigEtiquetaMateriaLegislativaForms(instance=config)
return render(request, 'materia/config_etiqueta_materia.html', {'form': form})

6
sapl/norma/views.py

@ -258,7 +258,7 @@ class NormaCrud(Crud):
def get_initial(self):
initial = super().get_initial()
norma = NormaJuridica.objects.get(id=self.kwargs['pk'])
norma = NormaJuridica.objects.select_related("materia").get(id=self.kwargs['pk'])
if norma.materia:
initial['tipo_materia'] = norma.materia.tipo
initial['ano_materia'] = norma.materia.ano
@ -267,9 +267,7 @@ class NormaCrud(Crud):
return initial
def form_valid(self, form):
norma_antiga = NormaJuridica.objects.get(
pk=self.kwargs['pk']
)
norma_antiga = NormaJuridica.objects.get(pk=self.kwargs['pk'])
# Feito desta forma para que sejam materializados os assuntos
# antigos

11
sapl/parlamentares/forms.py

@ -216,6 +216,17 @@ class ParlamentarForm(FileFieldCheckMixin, ModelForm):
'biografia': forms.Textarea(
attrs={'id': 'texto-rico'})}
def save(self, commit=True):
parlamentar = super().save()
autor = parlamentar.autor.first()
usuario = autor.user if autor else None
if autor and usuario:
usuario.is_active = parlamentar.ativo
usuario.save()
return parlamentar
class ParlamentarFilterSet(django_filters.FilterSet):
nome_parlamentar = django_filters.CharFilter(

4
sapl/relatorios/urls.py

@ -6,7 +6,7 @@ from .views import (relatorio_capa_processo,
relatorio_etiqueta_protocolo, relatorio_materia,
relatorio_ordem_dia, relatorio_pauta_sessao,
relatorio_protocolo, relatorio_sessao_plenaria,
resumo_ata_pdf, relatorio_sessao_plenaria_pdf)
resumo_ata_pdf, relatorio_sessao_plenaria_pdf, etiqueta_materia_legislativa)
app_name = AppConfig.name
@ -33,4 +33,6 @@ urlpatterns = [
resumo_ata_pdf, name='resumo_ata_pdf'),
url(r'^relatorios/(?P<pk>\d+)/sessao-plenaria-pdf$',
relatorio_sessao_plenaria_pdf, name='relatorio_sessao_plenaria_pdf'),
url(r'^relatorios/(?P<pk>\d+)/etiqueta-materia-legislativa$',
etiqueta_materia_legislativa, name='etiqueta_materia_legislativa'),
]

59
sapl/relatorios/views.py

@ -3,6 +3,7 @@ import html
import logging
import re
import tempfile
import unidecode
from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404, HttpResponse
@ -15,7 +16,7 @@ from sapl.settings import MEDIA_URL
from sapl.base.models import Autor, CasaLegislativa
from sapl.comissoes.models import Comissao
from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao,
Tramitacao, UnidadeTramitacao)
Tramitacao, UnidadeTramitacao, ConfigEtiquetaMateriaLegislativa)
from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
TramitacaoAdministrativo)
@ -26,7 +27,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
SessaoPlenariaPresenca, OcorrenciaSessao,
RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao)
from sapl.settings import STATIC_ROOT
from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data
from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data, create_barcode
from sapl.sessao.views import (get_identificacao_basica, get_mesa_diretora,
get_presenca_sessao, get_expedientes,
@ -601,6 +602,7 @@ def get_sessao_plenaria(sessao, casa):
str(materia.ano)),
"des_numeracao": ' ',
"des_turno": get_turno(materia)[0],
"situacao": materia.materiaemtramitacao_set.first().tramitacao.status,
"txt_ementa": str(materia.ementa),
"ordem_observacao": expediente_materia.observacao,
"nom_resultado": '',
@ -703,7 +705,8 @@ def get_sessao_plenaria(sessao, casa):
# https://github.com/interlegis/sapl/issues/1009
"txt_ementa": html.unescape(materia.ementa),
"ordem_observacao": html.unescape(votacao.observacao),
"nom_autor": ''
"nom_autor": '',
"situacao": materia.materiaemtramitacao_set.first().tramitacao.status
})
autoria = materia.autoria_set.all()
@ -1003,6 +1006,8 @@ def relatorio_etiqueta_protocolo(request, nro, ano):
protocolo = Protocolo.objects.filter(numero=nro, ano=ano)
m = MateriaLegislativa.objects.filter(numero_protocolo=nro,ano=ano)
protocolo_data = get_etiqueta_protocolos(protocolo)
pdf = pdf_etiqueta_protocolo_gerar.principal(imagem,
@ -1498,3 +1503,51 @@ def relatorio_sessao_plenaria_pdf(request, pk):
response.write(pdf_file)
return response
def gera_etiqueta_ml(materia_legislativa, base_url):
confg = ConfigEtiquetaMateriaLegislativa.objects.first()
ml_info = unidecode.unidecode("{}/{}-{}".format(materia_legislativa.numero,
materia_legislativa.ano,
materia_legislativa.tipo.sigla))
base64_data = create_barcode(ml_info, 100, 500)
barcode = 'data:image/png;base64,{0}'.format(base64_data)
max_ementa_size = 240
ementa = materia_legislativa.ementa
ementa = ementa if len(ementa) < max_ementa_size else ementa[:max_ementa_size]+"..."
context = {
'numero': materia_legislativa.numero,
'ano': materia_legislativa.ano,
'tipo': materia_legislativa.tipo,
'data_apresentacao':materia_legislativa.data_apresentacao,
'autores': materia_legislativa.autores.all(),
'ementa':ementa,
'largura': confg.largura,
'altura':confg.largura,
'barcode': barcode
}
main_template = render_to_string('relatorios/etiqueta_materia_legislativa.html', context)
html = HTML(base_url=base_url, string=main_template)
main_doc = html.render(stylesheets=[CSS(string="@page {{size: {}cm {}cm;}}".format(confg.largura,confg.altura))])
pdf_file = main_doc.write_pdf()
return pdf_file
def etiqueta_materia_legislativa(request, pk):
base_url = request.build_absolute_uri()
materia_legislativa = MateriaLegislativa.objects.get(pk=pk)
pdf_file = gera_etiqueta_ml(materia_legislativa, base_url)
response = HttpResponse(content_type='application/pdf;')
response['Content-Disposition'] = 'inline; filename=etiqueta.pdf'
response['Content-Transfer-Encoding'] = 'binary'
response.write(pdf_file)
return response

1
sapl/rules/map_rules.py

@ -258,6 +258,7 @@ rules_group_geral = {
(materia.Parecer, __base__, __perms_publicas__),
(materia.StatusTramitacao, __base__, __perms_publicas__),
(materia.UnidadeTramitacao, __base__, __perms_publicas__),
(materia.ConfigEtiquetaMateriaLegislativa, __base__, set()),
(norma.AssuntoNorma, __base__, __perms_publicas__),

180
sapl/sessao/views.py

@ -29,7 +29,7 @@ from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
PermissionRequiredForAppCrudMixin, make_pagination)
from sapl.materia.forms import filtra_tramitacao_status
from sapl.materia.models import (Autoria, TipoMateriaLegislativa,
Tramitacao)
Tramitacao, MateriaEmTramitacao)
from sapl.materia.views import MateriaLegislativaPesquisaView
from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
Parlamentar, SessaoLegislativa)
@ -228,19 +228,23 @@ def customize_link_materia(context, pk, has_permission, is_expediente):
if t[0] == tramitacao.turno:
turno = t[1]
break
situacao = MateriaEmTramitacao.objects.select_related("materia", "tramitacao")\
.filter(materia=materia).first().tramitacao.status
title_materia = """<a id=id%s href=%s>%s</a> </br>
<b>Processo:</b> %s </br>
<b>Autor:</b> %s </br>
<b>Protocolo:</b> %s </br>
<b>Turno:</b> %s </br>
<b>Situação:</b> %s </br>
""" % (obj.materia.id,
url_materia,
row[1][0],
numeracao if numeracao else '',
autor if autor else '',
num_protocolo if num_protocolo else '',
turno)
turno,
situacao if situacao else '')
# Na linha abaixo, o segundo argumento é None para não colocar
# url em toda a string de title_materia
@ -706,6 +710,8 @@ class OradorCrud(MasterDetailCrud):
class CreateView(MasterDetailCrud.CreateView):
form_class = OradorForm
template_name = 'sessao/oradores_create.html'
def get_initial(self):
return {'id_sessao': self.kwargs['pk']}
@ -718,6 +724,8 @@ class OradorCrud(MasterDetailCrud):
if tipo_sessao.nome == "Solene":
context.update(
{'subnav_template_name': 'sessao/subnav-solene.yaml'})
ultimo_orador = Orador.objects.filter(sessao_plenaria=kwargs['root_pk']).order_by("-numero_ordem").first()
context["ultima_ordem"] = ultimo_orador.numero_ordem if ultimo_orador else 0
return context
def get_success_url(self):
@ -775,6 +783,7 @@ class OradorExpedienteCrud(OradorCrud):
class CreateView(MasterDetailCrud.CreateView):
form_class = OradorExpedienteForm
template_name = 'sessao/oradores_create.html'
def get_initial(self):
return {'id_sessao': self.kwargs['pk']}
@ -787,6 +796,8 @@ class OradorExpedienteCrud(OradorCrud):
if tipo_sessao.nome == "Solene":
context.update(
{'subnav_template_name': 'sessao/subnav-solene.yaml'})
ultimo_orador = OradorExpediente.objects.filter(sessao_plenaria=kwargs['root_pk']).order_by("-numero_ordem").first()
context["ultima_ordem"] = ultimo_orador.numero_ordem if ultimo_orador else 0
return context
def get_success_url(self):
@ -850,9 +861,9 @@ class OradorExpedienteCrud(OradorCrud):
class OradorOrdemDiaCrud(OradorCrud):
model = OradorOrdemDia
class CreateView(MasterDetailCrud.CreateView):
form_class = OradorOrdemDiaForm
template_name = 'sessao/oradores_create.html'
def get_initial(self):
return {'id_sessao': self.kwargs['pk']}
@ -861,6 +872,12 @@ class OradorOrdemDiaCrud(OradorCrud):
return reverse('sapl.sessao:oradorordemdia_list',
kwargs={'pk': self.kwargs['pk']})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
ultimo_orador = OradorOrdemDia.objects.filter(sessao_plenaria=kwargs['root_pk']).order_by("-numero_ordem").first()
context["ultima_ordem"] = ultimo_orador.numero_ordem if ultimo_orador else 0
return context
class UpdateView(MasterDetailCrud.UpdateView):
form_class = OradorOrdemDiaForm
@ -1689,28 +1706,14 @@ def get_expedientes(sessao_plenaria):
def get_materias_expediente(sessao_plenaria):
materias = ExpedienteMateria.objects.filter(
sessao_plenaria_id=sessao_plenaria.id)
materias_expediente = []
for m in materias:
ementa = m.materia.ementa
titulo = m.materia
numero = m.numero_ordem
for m in ExpedienteMateria.objects.select_related("materia").filter(sessao_plenaria_id=sessao_plenaria.id):
tramitacao = ''
tramitacoes = Tramitacao.objects.filter(
materia=m.materia).order_by('-pk')
for aux_tramitacao in tramitacoes:
for aux_tramitacao in Tramitacao.objects.filter(materia=m.materia).order_by('-pk'):
if aux_tramitacao.turno:
tramitacao = aux_tramitacao
break
turno = None
if tramitacao:
turno = get_turno(tramitacao.turno)
rv = m.registrovotacao_set.first()
rp = m.retiradapauta_set.filter(materia=m.materia).first()
if rv:
@ -1720,30 +1723,24 @@ def get_materias_expediente(sessao_plenaria):
resultado = rp.tipo_de_retirada.descricao
resultado_observacao = rp.observacao
else:
if m.tipo_votacao == 4:
resultado = _('Matéria lida')
else:
resultado = _('Matéria não votada')
resultado = _('Matéria lida') if m.tipo_votacao == 4 else _('Matéria não votada')
resultado_observacao = _(' ')
autoria = Autoria.objects.filter(materia_id=m.materia_id)
autor = [str(x.autor) for x in autoria]
mat = {'ementa': ementa,
'titulo': titulo,
'numero': numero,
'turno': turno,
'resultado': resultado,
'resultado_observacao': resultado_observacao,
'autor': autor,
'numero_protocolo': m.materia.numero_protocolo,
'numero_processo': m.materia.numeracao_set.last(),
'observacao': m.observacao
}
materias_expediente.append(mat)
materias_expediente.append({
'ementa': m.materia.ementa,
'titulo': m.materia,
'numero': m.numero_ordem,
'turno': get_turno(tramitacao.turno) if tramitacao else None,
'situacao': m.materia.materiaemtramitacao_set.first().tramitacao.status,
'resultado': resultado,
'resultado_observacao': resultado_observacao,
'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=m.materia_id)],
'numero_protocolo': m.materia.numero_protocolo,
'numero_processo': m.materia.numeracao_set.last(),
'observacao': m.observacao
})
context = {'materia_expediente': materias_expediente}
return context
return {'materia_expediente': materias_expediente}
def get_oradores_expediente(sessao_plenaria):
@ -1811,26 +1808,14 @@ def get_assinaturas(sessao_plenaria):
def get_materias_ordem_do_dia(sessao_plenaria):
ordem = OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id)
materias_ordem = []
for o in ordem:
ementa = o.materia.ementa
ementa_observacao = o.observacao
titulo = o.materia
numero = o.numero_ordem
for o in OrdemDia.objects.filter(sessao_plenaria_id=sessao_plenaria.id):
tramitacao = ''
tramitacoes = Tramitacao.objects.filter(
materia=o.materia).order_by('-pk')
for aux_tramitacao in tramitacoes:
for aux_tramitacao in Tramitacao.objects.filter(materia=o.materia).order_by('-pk'):
if aux_tramitacao.turno:
tramitacao = aux_tramitacao
break
turno = None
if tramitacao:
turno = get_turno(tramitacao.turno)
# Verificar resultado
rv = o.registrovotacao_set.filter(materia=o.materia).first()
rp = o.retiradapauta_set.filter(materia=o.materia).first()
@ -1841,55 +1826,44 @@ def get_materias_ordem_do_dia(sessao_plenaria):
resultado = rp.tipo_de_retirada.descricao
resultado_observacao = rp.observacao
else:
if o.tipo_votacao == 4:
resultado = _('Matéria lida')
else:
resultado = _('Matéria não votada')
resultado = _('Matéria lida') if o.tipo_votacao == 4 else _('Matéria não votada')
resultado_observacao = _(' ')
voto_sim = ""
voto_nao = ""
voto_abstencoes = ""
voto_nominal = []
if o.tipo_votacao == 2:
votos = VotoParlamentar.objects.filter(ordem=o.id)
for voto in votos:
aux_voto = (voto.parlamentar.nome_completo, voto.voto)
voto_nominal.append(aux_voto)
try:
voto = RegistroVotacao.objects.filter(ordem=o.id).last()
for voto in VotoParlamentar.objects.filter(ordem=o.id):
voto_nominal.append((voto.parlamentar.nome_completo, voto.voto))
voto = RegistroVotacao.objects.filter(ordem=o.id).last()
if voto:
voto_sim = voto.numero_votos_sim
voto_nao = voto.numero_votos_nao
voto_abstencoes = voto.numero_abstencoes
except AttributeError:
else:
voto_sim = " Não Informado"
voto_nao = " Não Informado"
voto_abstencoes = " Não Informado"
autoria = Autoria.objects.filter(
materia_id=o.materia_id)
autor = [str(x.autor) for x in autoria]
mat = {'ementa': ementa,
'ementa_observacao': ementa_observacao,
'titulo': titulo,
'numero': numero,
'turno': turno,
'resultado': resultado,
'resultado_observacao': resultado_observacao,
'autor': autor,
'numero_protocolo': o.materia.numero_protocolo,
'numero_processo': o.materia.numeracao_set.last(),
'tipo_votacao': o.TIPO_VOTACAO_CHOICES[o.tipo_votacao],
'voto_sim': voto_sim,
'voto_nao': voto_nao,
'voto_abstencoes': voto_abstencoes,
'voto_nominal': voto_nominal,
}
materias_ordem.append(mat)
materias_ordem.append({
'ementa': o.materia.ementa,
'ementa_observacao': o.observacao,
'titulo': o.materia,
'numero': o.numero_ordem,
'turno': get_turno(tramitacao.turno) if tramitacao else None,
'situacao': o.materia.materiaemtramitacao_set.first().tramitacao.status,
'resultado': resultado,
'resultado_observacao': resultado_observacao,
'autor': [str(x.autor) for x in Autoria.objects.select_related("autor").filter(materia_id=o.materia_id)],
'numero_protocolo': o.materia.numero_protocolo,
'numero_processo': o.materia.numeracao_set.last(),
'tipo_votacao': o.TIPO_VOTACAO_CHOICES[o.tipo_votacao],
'voto_sim': voto_sim,
'voto_nao': voto_nao,
'voto_abstencoes': voto_abstencoes,
'voto_nominal': voto_nominal,
})
context = {'materias_ordem': materias_ordem}
return context
return {'materias_ordem': materias_ordem}
def get_oradores_ordemdia(sessao_plenaria):
@ -1957,13 +1931,9 @@ class ResumoView(DetailView):
context = self.get_context_data(object=self.object)
# Votos de Votação Nominal de Matérias Expediente
materias_expediente_votacao_nominal = ExpedienteMateria.objects.filter(
sessao_plenaria_id=self.object.id,
tipo_votacao=2).order_by('-materia')
votacoes = []
for mevn in materias_expediente_votacao_nominal:
for mevn in ExpedienteMateria.objects.filter(sessao_plenaria_id=self.object.id, tipo_votacao=2)\
.order_by('-materia'):
votos_materia = []
titulo_materia = mevn.materia
registro = RegistroVotacao.objects.filter(expediente=mevn)
@ -1971,11 +1941,10 @@ class ResumoView(DetailView):
for vp in VotoParlamentar.objects.filter(votacao=registro).order_by('parlamentar'):
votos_materia.append(vp)
dados_votacao = {
votacoes.append({
'titulo': titulo_materia,
'votos': votos_materia
}
votacoes.append(dados_votacao)
})
context.update({'votos_nominais_materia_expediente': votacoes})
@ -2009,12 +1978,8 @@ class ResumoView(DetailView):
# =====================================================================
# Matérias Ordem do Dia
# Votos de Votação Nominal de Matérias Ordem do Dia
materias_ordem_dia_votacao_nominal = OrdemDia.objects.filter(
sessao_plenaria_id=self.object.id,
tipo_votacao=2).order_by('-materia')
votacoes_od = []
for modvn in materias_ordem_dia_votacao_nominal:
for modvn in OrdemDia.objects.filter(sessao_plenaria_id=self.object.id, tipo_votacao=2).order_by('-materia'):
votos_materia_od = []
t_materia = modvn.materia
registro_od = RegistroVotacao.objects.filter(ordem=modvn)
@ -2022,11 +1987,10 @@ class ResumoView(DetailView):
for vp_od in VotoParlamentar.objects.filter(votacao=registro_od).order_by('parlamentar'):
votos_materia_od.append(vp_od)
dados_votacao_od = {
votacoes_od.append({
'titulo': t_materia,
'votos': votos_materia_od
}
votacoes_od.append(dados_votacao_od)
})
context.update({'votos_nominais_materia_ordem_dia': votacoes_od})

19
sapl/templates/materia/config_etiqueta_materia.html

@ -0,0 +1,19 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% block base_content %}
<h1>Configuração Etiqueta Materia Legislativa</h1>
<form action="." method="post">
{% csrf_token %}
{{ form|crispy }}
<div class="row">
<div class="col-md-12">
<div class="form-group row justify-content-between">
<a href="{% url 'sapl.base:sistema' %}" class="btn btn-dark">Cancelar</a>
<input type="submit" name="salvar" value="Salvar" class="btn btn-primary float-right" id="submit-id-salvar" onclick="this.form.submit();this.disabled=true;">
</div>
</div>
</div>
</form>
{% endblock base_content %}

6
sapl/templates/materia/layouts.yaml

@ -157,3 +157,9 @@ MateriaLegislativaDetail:
- ementa
- indexacao
- observacao
ConfigEtiquetaMateriaLegislativa:
{% trans 'Configurações de Etiqueta' %}:
- largura
- altura
- mostrar_em_arquivo

6
sapl/templates/materia/materialegislativa_detail.html

@ -10,6 +10,12 @@
{% endif %}
{% endblock sub_actions %}
{% block editions %}
{{ block.super }}
<a href="{% url 'sapl.relatorios:etiqueta_materia_legislativa' object.pk %}" class="btn btn-outline-primary">{% trans 'Etiqueta' %}</a>
{% endblock editions %}
{% block detail_content %}
{{ block.super }}
{% if object.registrovotacao_set.exists %}

2
sapl/templates/materia/materialegislativa_filter.html

@ -1,6 +1,7 @@
{% extends "crud/detail.html" %}
{% load i18n %}
{% load crispy_forms_tags common_tags%}
{% load webpack_static from webpack_loader %}
{% block actions %}
@ -47,6 +48,7 @@
<tr>
<td>
<strong><a href="{% url 'sapl.materia:materialegislativa_detail' m.id %}">{{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}}</strong></a>
<a href="{% url 'sapl.relatorios:etiqueta_materia_legislativa' m.pk %}"><img src="{% webpack_static 'img/etiqueta.png' %}" alt="Etiqueta Individual"></a>
</br>
<strong>Ementa:</strong>&nbsp;{{ m.ementa|dont_break_out }}
</br>

182
sapl/templates/materia/materialegislativa_form.html

@ -1,111 +1,109 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block extra_js %}
<script language="Javascript">
function recuperar_numero_ano() {
var tipo = $("#id_tipo").val()
var ano = $("#id_ano").val()
if (tipo) {
$.get("/materia/recuperar-materia",{tipo: tipo, ano: ano},
function(data, status) {
$("#id_numero").val(data.numero);
$("#id_ano").val(data.ano);
console.log(data)
});
<script language="Javascript">
function recuperar_numero_ano() {
var tipo = $("#id_tipo").val()
var ano = $("#id_ano").val()
if (tipo){
$.get("/materia/recuperar-materia", { tipo: tipo, ano: ano },
function (data, status) {
$("#id_numero").val(data.numero);
$("#id_ano").val(data.ano);
console.log(data);
});
}
}
$("#id_tipo, #id_ano").change(recuperar_numero_ano);
function compare(a, b) {
if (a.text < b.text)
return -1;
if (a.text > b.text)
return 1;
return 0;
}
}
$("#id_tipo, #id_ano").change(recuperar_numero_ano);
function compare(a, b) {
if (a.text < b.text)
return -1;
if (a.text > b.text)
return 1;
return 0;
}
var modal_estilos = 'display: block;'
+'width: 85%; max-width: 600px;'
+'background: #fff; padding: 15px;'
+'border-radius: 5px;'
+'-webkit-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'-moz-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'position: fixed;'
+'top: 50%; left: 50%;'
+'transform: translate(-50%,-50%);'
+'z-index: 99999999; text-align: center';
var fundo_modal_estilos = 'top: 0; right: 0;'
+'bottom: 0; left: 0; position: fixed;'
+'background-color: rgba(0, 0, 0, 0.6); z-index: 99999999;'
+'display: none;';
var meu_modal = '<div id="fundo_modal" style="'+fundo_modal_estilos+'">'
+'<div id="meu_modal" style="'+modal_estilos+'">'
+'<h2>Atenção! Ano de apresentação e ano da matéria são diferentes.</h2><br />'
+'<button id="close_model_btn" type="button" class="btn btn-warning" data-dismiss="modal">'
+'Compreendo e quero continuar</button>'
+'</div></div>';
var modal_estilos = 'display: block;'
+'width: 85%; max-width: 600px;'
+'background: #fff; padding: 15px;'
+'border-radius: 5px;'
+'-webkit-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'-moz-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'position: fixed;'
+'top: 50%; left: 50%;'
+'transform: translate(-50%,-50%);'
+'z-index: 99999999; text-align: center';
var fundo_modal_estilos = 'top: 0; right: 0;'
+'bottom: 0; left: 0; position: fixed;'
+'background-color: rgba(0, 0, 0, 0.6); z-index: 99999999;'
+'display: none;';
var meu_modal = '<div id="fundo_modal" style="'+fundo_modal_estilos+'">'
+'<div id="meu_modal" style="'+modal_estilos+'">'
+'<h2>Atenção! Ano de apresentação e ano da matéria são diferentes.</h2><br />'
+'<button id="close_model_btn" type="button" class="btn btn-warning" data-dismiss="modal">'
+'Compreendo e quero continuar</button>'
+'</div></div>';
function verifica_ano() {
let ano = $("select#id_ano.select").val();
let data_apresentacao = $("input#id_data_apresentacao.dateinput").val();
let ano_apresentacao = data_apresentacao.substr(data_apresentacao.length - 4);
if (ano && ano_apresentacao && ano_apresentacao != ano){
$('#fundo_modal').fadeIn();
}
}
function verifica_ano(){
let ano = $("select#id_ano.select").val();
let data_apresentacao = $("input#id_data_apresentacao.dateinput").val();
let ano_apresentacao = data_apresentacao.substr(data_apresentacao.length - 4);
$(document).ready( function() {
$("#id_tipo_autor, #id_data_apresentacao").change( function() {
var tipo_selecionado = $("#id_tipo_autor").val();
var autor_selecionado = $("#id_autor").val();
if(ano && ano_apresentacao && ano_apresentacao != ano){
$('#fundo_modal').fadeIn();
}
}
$("#id_autor option").remove()
$(document).ready(function() {
$("#id_tipo_autor").change(function() {
var tipo_selecionado = $("#id_tipo_autor").val();
var autor_selecionado = $("#id_autor").val();
$("#id_autor option").remove()
if (tipo_selecionado !== undefined && tipo_selecionado !== null) {
var json_data = {
if (tipo_selecionado !== undefined && tipo_selecionado !== null){
var json_data = {
tipo : tipo_selecionado,
data_relativa : $("#id_data_apresentacao").val()
}
$.getJSON("/api/autor/possiveis", json_data, function(data){
if (data) {
var results = data.sort(compare);
if (results.length > 1) {
$("#id_autor").append("<option>-----</option>");
}
$.each(results, function(idx, obj) {
$("#id_autor")
.append($("<option></option>")
.attr("value", obj.value)
.text(obj.text));
});
$("#id_autor").val(autor_selecionado);
}
});
}
});
$("#id_tipo_autor").trigger('change');
$.getJSON("/api/autor/possiveis", json_data, function(data) {
if (data) {
var results = data.sort(compare);
if (results.length > 1) {
$("#id_autor").append("<option>-----</option>");
}
$.each(results, function(idx, obj) {
$("#id_autor")
.append($("<option></option>")
.attr("value", obj.value)
.text(obj.text));
});
$("#id_autor").val(autor_selecionado);
}
});
}
});
$("#id_tipo_autor").trigger('change');
$("body").append(meu_modal);
$("body").append(meu_modal);
$("#fundo_modal, #close_model_btn").click(function(){ $("#fundo_modal").hide(); });
$("#meu_modal").click(function(e){ e.stopPropagation(); });
$("#fundo_modal, #close_model_btn").click( function() { $("#fundo_modal").hide(); });
$("#meu_modal").click( function(e) { e.stopPropagation(); });
$("select#id_ano.select.form-control").change(function(){
verifica_ano();
$("select#id_ano.select.form-control").change( function() {
verifica_ano();
});
$("input#id_data_apresentacao.dateinput.form-control").change( function() {
verifica_ano();
});
});
$("input#id_data_apresentacao.dateinput.form-control").change(function(){
verifica_ano();
});
});
</script>
</script>
{% endblock %}

3
sapl/templates/menu_tabelas_auxiliares.yaml

@ -119,6 +119,9 @@
- title: {% trans 'Assunto Matéria' %}
url: sapl.materia:assuntomateria_list
css_class: btn btn-link
- title: {% trans 'Configuração Etiqueta Materia Legislativa' %}
url: sapl.materia:configEtiquetaMateriaLegislativaCrud
css_class: btn btn-link
- title: {% trans 'Módulo Normas Jurídicas' %}
css_class: head_title
children:

116
sapl/templates/norma/normajuridica_form.html

@ -10,20 +10,23 @@
var tipo_materia = $("#id_tipo_materia").val();
var numero_materia = $("#id_numero_materia").val();
var ano_materia = $("#id_ano_materia").val();
var tipo = $('#id_tipo').val();
var ano = $('#id_ano').val();
var numero = $('#id_numero').val();
var ementa = $('#id_ementa').val();
if (tipo_materia && numero_materia && ano_materia) {
$.get("/sessao/recuperar-materia",
{tipo_materia: tipo_materia,
numero_materia: numero_materia,
ano_materia: ano_materia},
function(data, status) {
$("#id_ementa").val(data.ementa);
$("#id_indexacao").val(data.indexacao);
}
);
$.get("/sessao/recuperar-materia", {
tipo_materia: tipo_materia,
numero_materia: numero_materia,
ano_materia: ano_materia
}, (data, status) => {
$("#id_fundo_confirmacao_mudanca_ementa_indexacao").fadeIn();
$("#id_sim_mudanca_ementa_indexacao").click(() => {
$("#id_ementa").val(data.ementa);
$("#id_indexacao").val(data.indexacao);
$("#id_fundo_confirmacao_mudanca_ementa_indexacao").hide();
});
$("#id_nao_mudanca_ementa_indexacao").click(() => {
$("#id_fundo_confirmacao_mudanca_ementa_indexacao").hide();
});
});
}
}
var fields = ["#id_tipo_materia", "#id_numero_materia", "#id_ano_materia"]
@ -36,12 +39,11 @@
var ano = $("#id_ano").val();
if (tipo) {
$.get("/norma/recuperar-numero-norma",{tipo: tipo,
ano: ano},
function(data, status) {
$("#id_numero").val(data.numero);
$("#id_ano").val(data.ano);
});
$.get("/norma/recuperar-numero-norma", { tipo: tipo, ano: ano },
(data, status) => {
$("#id_numero").val(data.numero);
$("#id_ano").val(data.ano);
});
}
}
var fields = ["#id_tipo", "#id_ano"];
@ -58,29 +60,57 @@
}
});
var modal_estilos = 'display: block;'
+'width: 85%; max-width: 600px;'
+'background: #fff; padding: 15px;'
+'border-radius: 5px;'
+'-webkit-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'-moz-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);'
+'position: fixed;'
+'top: 50%; left: 50%;'
+'transform: translate(-50%,-50%);'
+'z-index: 99999999; text-align: center';
var fundo_modal_estilos = 'top: 0; right: 0;'
+'bottom: 0; left: 0; position: fixed;'
+'background-color: rgba(0, 0, 0, 0.6); z-index: 99999999;'
+'display: none;';
var meu_modal = '<div id="fundo_modal" style="'+fundo_modal_estilos+'">'
+'<div id="meu_modal" style="'+modal_estilos+'">'
+'<h2>Atenção! Ano de apresentação e ano da norma são diferentes.</h2><br />'
+'<button id="close_model_btn" type="button" class="btn btn-warning" data-dismiss="modal">'
+'Compreendo e quero continuar</button>'
+'</div></div>';
var modal_estilos = `
display: block;
width: 85%;
max-width: 600px;
background: #fff;
padding: 15px;
border-radius: 5px;
-webkit-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);
-moz-box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);
box-shadow: 0px 6px 14px -2px rgba(0,0,0,0.75);
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
z-index: 99999999;
text-align: center;
`;
var fundo_modal_estilos = `
top: 0;
right: 0;
bottom: 0;
left: 0;
position: fixed;
background-color: rgba(0, 0, 0, 0.6);
z-index: 99999999;
display: none;
`;
var meu_modal = `
<div id="fundo_modal" style="${fundo_modal_estilos}">
<div id="meu_modal" style="${modal_estilos}">
<h2>Atenção! Ano de apresentação e ano da norma são diferentes.</h2><br />
<button id="close_model_btn" type="button" class="btn btn-warning" data-dismiss="modal">
Compreendo e quero continuar
</button>
</div>
</div>
`;
const confirmacao_mudanca_ementa_indexacao = `
<div id="id_fundo_confirmacao_mudanca_ementa_indexacao" style="${fundo_modal_estilos}">
<div id="id_confirmacao_mudanca_ementa_indexacao" style="${modal_estilos}">
<h3>Houve à mudança de Matéria vinculada a norma.</h3>
<h3>Deseja atualizar a Ementa e a Indexação com a nova Matéria?</h3><br/>
<button type="submit" id="id_sim_mudanca_ementa_indexacao" class="btn btn-primary">Sim</button>
<button type="button" id="id_nao_mudanca_ementa_indexacao" class="btn btn-secondary" data-dismiss="modal">Não</button>
</div>
</div>
`;
function verifica_ano(){
let ano = $("select#id_ano.select").val();
@ -93,7 +123,7 @@
}
$(document).ready(function() {
$("body").append(meu_modal);
$("body").append(meu_modal, confirmacao_mudanca_ementa_indexacao);
$("#fundo_modal, #close_model_btn").click(function(){ $("#fundo_modal").hide(); });
$("#meu_modal").click(function(e){ e.stopPropagation(); });

3
sapl/templates/relatorios/blocos_sessao_plenaria/materias_expediente.html

@ -16,6 +16,9 @@
<dt><b>{{materia.num_ordem}} -</b> {{materia.id_materia}}</dt>
<dt style="text-align: left;"><b>Turno:</b> {{materia.des_turno}}</dt>
<dt style="text-align: left;"><b>{{materia.num_autores}}: </b>{{materia.nom_autor}}</dt>
{% if materia.situacao %}
<dt style="text-align: left;"><b>Situação: </b>{{materia.situacao}}</dt>
{% endif %}
</dl>
</td>
<td style="width:60%"><div style="margin:10px">{{materia.txt_ementa}}</div></td>

3
sapl/templates/relatorios/blocos_sessao_plenaria/materias_ordemdia.html

@ -16,6 +16,9 @@
<dt><b>{{materia.num_ordem}} -</b> {{materia.id_materia}}</dt>
<dt style="text-align: left;"><b>Turno:</b> {{materia.des_turno}}</dt>
<dt style="text-align: left;"><b>{{materia.num_autores}}: </b>{{materia.nom_autor}}</dt>
{% if materia.situacao %}
<dt style="text-align: left;"><b>Situação: </b>{{materia.situacao}}</dt>
{% endif %}
</dl>
</td>
<td style="width:60%">{{materia.txt_ementa}}</td>

40
sapl/templates/relatorios/etiqueta_materia_legislativa.html

@ -0,0 +1,40 @@
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% load static %}
<head>
<style>
@page{
margin: 0cm
}
div {page-break-inside: avoid;}
p {
font-size:4pt;
margin: 5px;
font-family: Georgia, Times, "Times New Roman";
}
img {
position: absolute;
bottom:0px;
left: 0px;
padding:10px;
height: 20px;
width: 90%;
}
</style>
</head>
<body>
<div>
<p><strong>Materia Legislativa - {{numero}}/{{ano}}</strong></p>
<p>Tipo: {{tipo.sigla}} - {{tipo.descricao}}</p>
<p>Data: {{data_apresentacao}}</p>
<p>Ementa: {{ementa}}</p>
<img src="{{barcode}}">
</div>
</body>

3
sapl/templates/sessao/blocos_ata/materias_expediente.html

@ -15,6 +15,9 @@
{% if m.turno %}
Turno: {{m.turno}},
{% endif %}
{% if m.situacao %}
Situação: {{m.situacao}},
{% endif %}
{% if m.tipo_votacao %}
Tipo: {{m.tipo_votacao}},
Sim: {{ m.voto_sim }},

3
sapl/templates/sessao/blocos_ata/materias_ordem_dia.html

@ -15,6 +15,9 @@
{% if m.turno %}
Turno: {{m.turno}},
{% endif %}
{% if m.situacao %}
Situação: {{m.situacao}},
{% endif %}
{% if m.tipo_votacao %}
Tipo: {{m.tipo_votacao}},
Sim: {{ m.voto_sim }},

5
sapl/templates/sessao/blocos_resumo/materias_expediente.html

@ -34,6 +34,11 @@
<br />
<b>Processo:</b> {{ m.numero_processo }}
{% endif %}
{% if m.situacao %}
<br />
<b>Situação:</b> {{ m.situacao }}
{% endif %}
</td>
<td>
{{m.ementa|dont_break_out}}<br/>

5
sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html

@ -35,6 +35,11 @@
<br />
<b>Processo:</b> {{ m.numero_processo }}
{% endif %}
{% if m.situacao %}
<br />
<b>Situação:</b> {{ m.situacao }}
{% endif %}
</td>
<td>{{m.ementa|dont_break_out}}</b><br/>{{m.observacao|dont_break_out}}</td>
<td><b>{{m.resultado}}</b><br/>{{m.resultado_observacao}}</td>

17
sapl/templates/sessao/oradores_create.html

@ -0,0 +1,17 @@
{% extends "crud/form.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load common_tags %}
{% block extra_js %}
<script type="text/javascript" >
$(document).ready(function(){
if("{{ultima_ordem}}" != "None"){
$("#id_numero_ordem").val({{ultima_ordem}}+1);
}
else{
$("#id_numero_ordem").val(1);
}
});
</script>
{% endblock extra_js %}
Loading…
Cancel
Save