Browse Source

3138 gerar etiqueta com informações da materia (#3162)

* Fix#3138 - Iniciando etiqueta de materia legislativa

* Gerando pdf com codigo de barra e opção largura/altura

* Anexando etiqueta em Texto Articulado

* Adaptando pra ficar parecido com protocolo Fix #3138

* Colocando classe de configuração de etiqueta da materia no map rules

* Ajustando importações

* Melhorando a disposição dos elementos da etiqueta

* Mudando fontes da etiqueta

* Melhorando formato da etiqueta

* Limitando campo ementa para no maximo 200 caracteres em ementa de materia legislativa

* Aumenta um pouco mais o tam máx

Co-authored-by: eribeiro <edwardr@senado.leg.br>
pull/3367/head
Ulysses Lara 5 years ago
committed by João Rodrigues
parent
commit
48eb0866be
  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. 3
      sapl/materia/urls.py
  7. 23
      sapl/materia/views.py
  8. 4
      sapl/relatorios/urls.py
  9. 55
      sapl/relatorios/views.py
  10. 2
      sapl/rules/map_rules.py
  11. 19
      sapl/templates/materia/config_etiqueta_materia.html
  12. 6
      sapl/templates/materia/layouts.yaml
  13. 6
      sapl/templates/materia/materialegislativa_detail.html
  14. 2
      sapl/templates/materia/materialegislativa_filter.html
  15. 2
      sapl/templates/menu_tabelas_auxiliares.yaml
  16. 40
      sapl/templates/relatorios/etiqueta_materia_legislativa.html

1
requirements/requirements.txt

@ -39,6 +39,7 @@ more-itertools==8.2.0
pysolr==3.6.0 pysolr==3.6.0
PyPDF4==1.27.0 PyPDF4==1.27.0
pyoai==2.5.0 pyoai==2.5.0
Unidecode==1.1.1
daphne==2.2.5 daphne==2.2.5
channels_redis==2.3.2 channels_redis==2.3.2

9
sapl/materia/forms.py

@ -34,7 +34,7 @@ from sapl.materia.models import (AssuntoMateria, Autoria, MateriaAssunto,
MateriaLegislativa, Orgao, MateriaLegislativa, Orgao,
RegimeTramitacao, StatusTramitacao, RegimeTramitacao, StatusTramitacao,
TipoDocumento, TipoProposicao, TipoDocumento, TipoProposicao,
UnidadeTramitacao) UnidadeTramitacao,ConfigEtiquetaMateriaLegislativa)
from sapl.norma.models import (LegislacaoCitada, NormaJuridica, from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica) TipoNormaJuridica)
from sapl.parlamentares.models import Legislatura, Partido, Parlamentar from sapl.parlamentares.models import Legislatura, Partido, Parlamentar
@ -2919,3 +2919,10 @@ class MateriaPesquisaSimplesForm(forms.Form):
_('A Data Final não pode ser menor que a Data Inicial')) _('A Data Final não pode ser menor que a Data Inicial'))
return cleaned_data 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

@ -1129,3 +1129,11 @@ class MateriaEmTramitacao(models.Model):
def __str__(self): def __str__(self):
return '{}/{}'.format(self.materia, self.tramitacao) 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)

3
sapl/materia/urls.py

@ -29,7 +29,7 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
MateriaPesquisaSimplesView, MateriaPesquisaSimplesView,
DespachoInicialMultiCreateView, DespachoInicialMultiCreateView,
TipoTurnoTramitacaoCrud, TipoTurnoTramitacaoCrud,
get_zip_docacessorios, get_pdf_docacessorios) get_zip_docacessorios, get_pdf_docacessorios, configEtiquetaMateriaLegislativaCrud)
from sapl.norma.views import NormaPesquisaSimplesView from sapl.norma.views import NormaPesquisaSimplesView
from sapl.protocoloadm.views import ( from sapl.protocoloadm.views import (
FichaPesquisaAdmView, FichaSelecionaAdmView) FichaPesquisaAdmView, FichaSelecionaAdmView)
@ -178,6 +178,7 @@ urlpatterns_sistema = [
url(r'^sistema/materia/status-tramitacao/', url(r'^sistema/materia/status-tramitacao/',
include(StatusTramitacaoCrud.get_urls())), include(StatusTramitacaoCrud.get_urls())),
url(r'^sistema/materia/orgao/', include(OrgaoCrud.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 + \ urlpatterns = urlpatterns_impressos + urlpatterns_materia + \

23
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 import CreateView, ListView, TemplateView, UpdateView
from django.views.generic.base import RedirectView from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django.shortcuts import render
from django_filters.views import FilterView from django_filters.views import FilterView
@ -48,7 +50,7 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, AutoriaMultiCreateForm
ConfirmarProposicaoForm, DevolverProposicaoForm, ConfirmarProposicaoForm, DevolverProposicaoForm,
DespachoInicialCreateForm, LegislacaoCitadaForm, DespachoInicialCreateForm, LegislacaoCitadaForm,
MateriaPesquisaSimplesForm, OrgaoForm, ProposicaoForm, MateriaPesquisaSimplesForm, OrgaoForm, ProposicaoForm,
TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm) TipoProposicaoForm, TramitacaoForm, TramitacaoUpdateForm,ConfigEtiquetaMateriaLegislativaForms)
from sapl.norma.models import LegislacaoCitada from sapl.norma.models import LegislacaoCitada
from sapl.parlamentares.models import Legislatura from sapl.parlamentares.models import Legislatura
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
@ -66,17 +68,14 @@ from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
filtra_tramitacao_destino_and_status, filtra_tramitacao_status, filtra_tramitacao_destino_and_status, filtra_tramitacao_status,
MateriaAssuntoForm, MateriaLegislativaFilterSet, MateriaLegislativaForm, MateriaAssuntoForm, MateriaLegislativaFilterSet, MateriaLegislativaForm,
MateriaSimplificadaForm, PrimeiraTramitacaoEmLoteFilterSet, MateriaSimplificadaForm, PrimeiraTramitacaoEmLoteFilterSet,
ReceberProposicaoForm, RelatoriaForm, ReceberProposicaoForm, RelatoriaForm, TramitacaoEmLoteFilterSet,
TramitacaoEmLoteFilterSet, UnidadeTramitacaoForm, TramitacaoEmLoteForm, UnidadeTramitacaoForm)
ExcluirTramitacaoEmLote, compara_tramitacoes_mat, from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, DespachoInicial,
TramitacaoEmLoteForm) DocumentoAcessorio, MateriaAssunto, MateriaLegislativa, Numeracao, Orgao,
from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, Origem, Proposicao, RegimeTramitacao, Relatoria, StatusTramitacao,
DespachoInicial, DocumentoAcessorio, MateriaAssunto, TipoDocumento, TipoFimRelatoria, TipoMateriaLegislativa, TipoProposicao,
MateriaLegislativa, Numeracao, Orgao, Origem, Proposicao, Tramitacao, UnidadeTramitacao, TipoTurnoTramitacao, ConfigEtiquetaMateriaLegislativa)
RegimeTramitacao, Relatoria, StatusTramitacao,
TipoDocumento, TipoFimRelatoria, TipoMateriaLegislativa,
TipoProposicao, Tramitacao, UnidadeTramitacao,
TipoTurnoTramitacao)
AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia') AssuntoMateriaCrud = CrudAux.build(AssuntoMateria, 'assunto_materia')

4
sapl/relatorios/urls.py

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

55
sapl/relatorios/views.py

@ -3,6 +3,7 @@ import html
import logging import logging
import re import re
import tempfile import tempfile
import unidecode
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404, HttpResponse 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.base.models import Autor, CasaLegislativa
from sapl.comissoes.models import Comissao from sapl.comissoes.models import Comissao
from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao, from sapl.materia.models import (Autoria, MateriaLegislativa, Numeracao,
Tramitacao, UnidadeTramitacao) Tramitacao, UnidadeTramitacao, ConfigEtiquetaMateriaLegislativa)
from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar from sapl.parlamentares.models import CargoMesa, Filiacao, Parlamentar
from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo, from sapl.protocoloadm.models import (DocumentoAdministrativo, Protocolo,
TramitacaoAdministrativo) TramitacaoAdministrativo)
@ -26,7 +27,7 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao,
SessaoPlenariaPresenca, OcorrenciaSessao, SessaoPlenariaPresenca, OcorrenciaSessao,
RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao) RegistroVotacao, VotoParlamentar, OradorOrdemDia, TipoExpediente, ResumoOrdenacao)
from sapl.settings import STATIC_ROOT 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, from sapl.sessao.views import (get_identificacao_basica, get_mesa_diretora,
get_presenca_sessao, get_expedientes, get_presenca_sessao, get_expedientes,
@ -1007,6 +1008,8 @@ def relatorio_etiqueta_protocolo(request, nro, ano):
protocolo = Protocolo.objects.filter(numero=nro, ano=ano) protocolo = Protocolo.objects.filter(numero=nro, ano=ano)
m = MateriaLegislativa.objects.filter(numero_protocolo=nro,ano=ano)
protocolo_data = get_etiqueta_protocolos(protocolo) protocolo_data = get_etiqueta_protocolos(protocolo)
pdf = pdf_etiqueta_protocolo_gerar.principal(imagem, pdf = pdf_etiqueta_protocolo_gerar.principal(imagem,
@ -1503,3 +1506,51 @@ def relatorio_sessao_plenaria_pdf(request, pk):
response.write(pdf_file) response.write(pdf_file)
return response 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

2
sapl/rules/map_rules.py

@ -267,6 +267,8 @@ rules_group_geral = {
(materia.UnidadeTramitacao, __base__, __perms_publicas__), (materia.UnidadeTramitacao, __base__, __perms_publicas__),
(materia.TipoTurnoTramitacao, __base__, __perms_publicas__), (materia.TipoTurnoTramitacao, __base__, __perms_publicas__),
(materia.ConfigEtiquetaMateriaLegislativa, __base__, set()),
(norma.AssuntoNorma, __base__, __perms_publicas__), (norma.AssuntoNorma, __base__, __perms_publicas__),
(norma.TipoNormaJuridica, __base__, __perms_publicas__), (norma.TipoNormaJuridica, __base__, __perms_publicas__),

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

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

6
sapl/templates/materia/materialegislativa_detail.html

@ -10,6 +10,12 @@
{% endif %} {% endif %}
{% endblock sub_actions %} {% 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 detail_content %}
{{ block.super }} {{ block.super }}
{% if object.registrovotacao_set.exists %} {% if object.registrovotacao_set.exists %}

2
sapl/templates/materia/materialegislativa_filter.html

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

2
sapl/templates/menu_tabelas_auxiliares.yaml

@ -124,6 +124,8 @@
css_class: btn btn-link css_class: btn btn-link
- title: {% trans 'Tipo de Turnos de Tramitação' %} - title: {% trans 'Tipo de Turnos de Tramitação' %}
url: sapl.materia:tipoturnotramitacao_list url: sapl.materia:tipoturnotramitacao_list
- title: {% trans 'Configuração Etiqueta Materia Legislativa' %}
url: sapl.materia:configEtiquetaMateriaLegislativaCrud
css_class: btn btn-link css_class: btn btn-link
- title: {% trans 'Módulo Normas Jurídicas' %} - title: {% trans 'Módulo Normas Jurídicas' %}
css_class: head_title css_class: head_title

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>
Loading…
Cancel
Save