diff --git a/requirements/requirements.txt b/requirements/requirements.txt index c5a1f6fd9..65d3e3f87 100644 --- a/requirements/requirements.txt +++ b/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 diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 65d227894..b8a1ed246 100644 --- a/sapl/materia/forms.py +++ b/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__' + + \ No newline at end of file diff --git a/sapl/materia/migrations/0068_configetiquetamaterialegislativa.py b/sapl/materia/migrations/0068_configetiquetamaterialegislativa.py new file mode 100644 index 000000000..3dce8a3f3 --- /dev/null +++ b/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)), + ], + ), + ] diff --git a/sapl/materia/migrations/0069_auto_20200518_1519.py b/sapl/materia/migrations/0069_auto_20200518_1519.py new file mode 100644 index 000000000..4251cb6e9 --- /dev/null +++ b/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), + ] \ No newline at end of file diff --git a/sapl/materia/models.py b/sapl/materia/models.py index b94ea78ff..fe0c45c39 100644 --- a/sapl/materia/models.py +++ b/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) \ No newline at end of file diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 05733599c..4c6c5166b 100644 --- a/sapl/materia/urls.py +++ b/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 + \ diff --git a/sapl/materia/views.py b/sapl/materia/views.py index e51feccc8..dedab0ed0 100644 --- a/sapl/materia/views.py +++ b/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}) diff --git a/sapl/norma/views.py b/sapl/norma/views.py index 98825f4cf..21975f77a 100644 --- a/sapl/norma/views.py +++ b/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 diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index 448535d40..2f2cd49c3 100755 --- a/sapl/parlamentares/forms.py +++ b/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( diff --git a/sapl/relatorios/urls.py b/sapl/relatorios/urls.py index 05ad22671..e60a1e03e 100644 --- a/sapl/relatorios/urls.py +++ b/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\d+)/sessao-plenaria-pdf$', relatorio_sessao_plenaria_pdf, name='relatorio_sessao_plenaria_pdf'), + url(r'^relatorios/(?P\d+)/etiqueta-materia-legislativa$', + etiqueta_materia_legislativa, name='etiqueta_materia_legislativa'), ] diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 200ce04af..beb523bb1 100755 --- a/sapl/relatorios/views.py +++ b/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 \ No newline at end of file diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index e47ebe5dc..316ce8ce3 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -258,7 +258,8 @@ 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__), (norma.TipoNormaJuridica, __base__, __perms_publicas__), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 26da9d23a..019b33dd0 100755 --- a/sapl/sessao/views.py +++ b/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 = """%s
Processo: %s
Autor: %s
Protocolo: %s
Turno: %s
+ Situação: %s
""" % (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}) diff --git a/sapl/templates/materia/config_etiqueta_materia.html b/sapl/templates/materia/config_etiqueta_materia.html new file mode 100644 index 000000000..cea6716c6 --- /dev/null +++ b/sapl/templates/materia/config_etiqueta_materia.html @@ -0,0 +1,19 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} + +{% block base_content %} +

Configuração Etiqueta Materia Legislativa

+
+ {% csrf_token %} + {{ form|crispy }} +
+
+
+ Cancelar + +
+
+
+
+{% endblock base_content %} diff --git a/sapl/templates/materia/layouts.yaml b/sapl/templates/materia/layouts.yaml index a885a418d..142dcdf91 100644 --- a/sapl/templates/materia/layouts.yaml +++ b/sapl/templates/materia/layouts.yaml @@ -157,3 +157,9 @@ MateriaLegislativaDetail: - ementa - indexacao - observacao + +ConfigEtiquetaMateriaLegislativa: + {% trans 'Configurações de Etiqueta' %}: + - largura + - altura + - mostrar_em_arquivo \ No newline at end of file diff --git a/sapl/templates/materia/materialegislativa_detail.html b/sapl/templates/materia/materialegislativa_detail.html index 10749b765..2d46b3312 100644 --- a/sapl/templates/materia/materialegislativa_detail.html +++ b/sapl/templates/materia/materialegislativa_detail.html @@ -10,6 +10,12 @@ {% endif %} {% endblock sub_actions %} +{% block editions %} + {{ block.super }} + {% trans 'Etiqueta' %} +{% endblock editions %} + + {% block detail_content %} {{ block.super }} {% if object.registrovotacao_set.exists %} diff --git a/sapl/templates/materia/materialegislativa_filter.html b/sapl/templates/materia/materialegislativa_filter.html index 5cf56d17d..9e91c29b8 100644 --- a/sapl/templates/materia/materialegislativa_filter.html +++ b/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 @@ {{m.tipo.sigla}} {{m.numero}}/{{m.ano}} - {{m.tipo}} + Etiqueta Individual
Ementa: {{ m.ementa|dont_break_out }}
diff --git a/sapl/templates/materia/materialegislativa_form.html b/sapl/templates/materia/materialegislativa_form.html index 2b7896462..eb0e212ca 100644 --- a/sapl/templates/materia/materialegislativa_form.html +++ b/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 %} + - + {% endblock %} diff --git a/sapl/templates/menu_tabelas_auxiliares.yaml b/sapl/templates/menu_tabelas_auxiliares.yaml index 8a83ac44f..864b8e5a6 100644 --- a/sapl/templates/menu_tabelas_auxiliares.yaml +++ b/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: diff --git a/sapl/templates/norma/normajuridica_form.html b/sapl/templates/norma/normajuridica_form.html index 91531c4d1..0355faee8 100644 --- a/sapl/templates/norma/normajuridica_form.html +++ b/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 = '
' - +'
' - +'

Atenção! Ano de apresentação e ano da norma são diferentes.


' - +'' - +'
'; + 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 = ` +
+
+

Atenção! Ano de apresentação e ano da norma são diferentes.


+ +
+
+ `; + + const confirmacao_mudanca_ementa_indexacao = ` +
+
+

Houve à mudança de Matéria vinculada a norma.

+

Deseja atualizar a Ementa e a Indexação com a nova Matéria?


+ + +
+
+ `; + 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(); }); diff --git a/sapl/templates/relatorios/blocos_sessao_plenaria/materias_expediente.html b/sapl/templates/relatorios/blocos_sessao_plenaria/materias_expediente.html index bb5178b59..265184e58 100644 --- a/sapl/templates/relatorios/blocos_sessao_plenaria/materias_expediente.html +++ b/sapl/templates/relatorios/blocos_sessao_plenaria/materias_expediente.html @@ -16,6 +16,9 @@
{{materia.num_ordem}} - {{materia.id_materia}}
Turno: {{materia.des_turno}}
{{materia.num_autores}}: {{materia.nom_autor}}
+ {% if materia.situacao %} +
Situação: {{materia.situacao}}
+ {% endif %}
{{materia.txt_ementa}}
diff --git a/sapl/templates/relatorios/blocos_sessao_plenaria/materias_ordemdia.html b/sapl/templates/relatorios/blocos_sessao_plenaria/materias_ordemdia.html index a44b4d3ca..ec2356126 100644 --- a/sapl/templates/relatorios/blocos_sessao_plenaria/materias_ordemdia.html +++ b/sapl/templates/relatorios/blocos_sessao_plenaria/materias_ordemdia.html @@ -16,6 +16,9 @@
{{materia.num_ordem}} - {{materia.id_materia}}
Turno: {{materia.des_turno}}
{{materia.num_autores}}: {{materia.nom_autor}}
+ {% if materia.situacao %} +
Situação: {{materia.situacao}}
+ {% endif %} {{materia.txt_ementa}} diff --git a/sapl/templates/relatorios/etiqueta_materia_legislativa.html b/sapl/templates/relatorios/etiqueta_materia_legislativa.html new file mode 100644 index 000000000..365d02bfb --- /dev/null +++ b/sapl/templates/relatorios/etiqueta_materia_legislativa.html @@ -0,0 +1,40 @@ + +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} +{% load static %} + + + + + + + +
+

Materia Legislativa - {{numero}}/{{ano}}

+

Tipo: {{tipo.sigla}} - {{tipo.descricao}}

+

Data: {{data_apresentacao}}

+

Ementa: {{ementa}}

+ +
+ diff --git a/sapl/templates/sessao/blocos_ata/materias_expediente.html b/sapl/templates/sessao/blocos_ata/materias_expediente.html index 4a3964993..5b21e200b 100644 --- a/sapl/templates/sessao/blocos_ata/materias_expediente.html +++ b/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 }}, diff --git a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html b/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html index 6b38be5e4..c25ce9683 100644 --- a/sapl/templates/sessao/blocos_ata/materias_ordem_dia.html +++ b/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 }}, diff --git a/sapl/templates/sessao/blocos_resumo/materias_expediente.html b/sapl/templates/sessao/blocos_resumo/materias_expediente.html index 046c15cee..4a8be7c55 100644 --- a/sapl/templates/sessao/blocos_resumo/materias_expediente.html +++ b/sapl/templates/sessao/blocos_resumo/materias_expediente.html @@ -34,6 +34,11 @@
Processo: {{ m.numero_processo }} {% endif %} + + {% if m.situacao %} +
+ Situação: {{ m.situacao }} + {% endif %} {{m.ementa|dont_break_out}}
diff --git a/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html b/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html index 909adf1b2..a463f7492 100644 --- a/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html +++ b/sapl/templates/sessao/blocos_resumo/materias_ordem_dia.html @@ -35,6 +35,11 @@
Processo: {{ m.numero_processo }} {% endif %} + + {% if m.situacao %} +
+ Situação: {{ m.situacao }} + {% endif %} {{m.ementa|dont_break_out}}
{{m.observacao|dont_break_out}} {{m.resultado}}
{{m.resultado_observacao}} diff --git a/sapl/templates/sessao/oradores_create.html b/sapl/templates/sessao/oradores_create.html new file mode 100644 index 000000000..26e9ee6b1 --- /dev/null +++ b/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 %} + +{% endblock extra_js %}