Browse Source

Adicionando geração de pdf para texto articulado Fix #2192 (#2607)

* Adicionando geração de pdf para texto articulado Fix #2192

* Padronizando botão de impressão
pull/2614/head
Ulysses Lara 6 years ago
committed by Edward
parent
commit
bd0ba6b35c
  1. 5
      sapl/relatorios/urls.py
  2. 58
      sapl/relatorios/views.py
  3. 46
      sapl/static/sapl/css/header-relatorio.css
  4. 56
      sapl/static/sapl/css/relatorio.css
  5. 2
      sapl/templates/compilacao/textoarticulado_detail.html
  6. 31
      sapl/templates/relatorios/header.html
  7. 52
      sapl/templates/relatorios/relatorio_texto.html

5
sapl/relatorios/urls.py

@ -5,7 +5,8 @@ from .views import (relatorio_capa_processo,
relatorio_documento_administrativo, relatorio_espelho,
relatorio_etiqueta_protocolo, relatorio_materia,
relatorio_ordem_dia, relatorio_pauta_sessao,
relatorio_protocolo, relatorio_sessao_plenaria)
relatorio_protocolo, relatorio_sessao_plenaria,
texto_articulado_pdf)
app_name = AppConfig.name
@ -28,4 +29,6 @@ urlpatterns = [
relatorio_etiqueta_protocolo, name='relatorio_etiqueta_protocolo'),
url(r'^relatorios/pauta-sessao/(?P<pk>\d+)/$',
relatorio_pauta_sessao, name='relatorio_pauta_sessao'),
url(r'^relatorios/texto_articulado/(?P<pk>\d+)/$',
texto_articulado_pdf, name='texto_articulado'),
]

58
sapl/relatorios/views.py

@ -7,7 +7,9 @@ from django.core.exceptions import ObjectDoesNotExist
from django.http import Http404, HttpResponse
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.template.loader import render_to_string
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,
@ -30,6 +32,10 @@ from .templates import (pdf_capa_processo_gerar,
pdf_ordem_dia_gerar, pdf_pauta_sessao_gerar,
pdf_protocolo_gerar, pdf_sessao_plenaria_gerar)
from sapl.compilacao.models import TextoArticulado
from weasyprint import HTML, CSS
def get_kwargs_params(request, fields):
kwargs = {}
@ -1199,3 +1205,55 @@ def get_pauta_sessao(sessao, casa):
return (lst_expediente_materia,
lst_votacao,
inf_basicas_dic)
def make_pdf(base_url,main_template,header_template,main_css='',header_css=''):
html = HTML(base_url=base_url, string=main_template)
main_doc = html.render(stylesheets=[])
def get_page_body(boxes):
for box in boxes:
if box.element_tag == 'body':
return box
return get_page_body(box.all_children())
# Template of header
html = HTML(base_url=base_url,string=header_template)
header = html.render(stylesheets=[CSS(string='@page {size:A4; margin:1cm;}')])
header_page = header.pages[0]
header_body = get_page_body(header_page._page_box.all_children())
header_body = header_body.copy_with_children(header_body.all_children())
for page in main_doc.pages:
page_body = get_page_body(page._page_box.all_children())
page_body.children += header_body.all_children()
pdf_file = main_doc.write_pdf()
return pdf_file
def texto_articulado_pdf(request,pk):
texto_articulado = TextoArticulado.objects.get(pk=pk)
base_url = request.build_absolute_uri()
casa = CasaLegislativa.objects.first()
rodape = ' '.join(get_rodape(casa))
context = {
'object': texto_articulado,
'rodape': rodape,
'data': dt.today().strftime('%d/%m/%Y')
}
html_template = render_to_string('relatorios/relatorio_texto.html',context)
header_context = {"casa":casa, 'logotipo':casa.logotipo, 'MEDIA_URL': MEDIA_URL}
html_header = render_to_string('relatorios/header.html', header_context)
pdf_file = make_pdf(base_url=base_url,main_template=html_template,header_template=html_header)
response = HttpResponse(content_type='application/pdf;')
response['Content-Disposition'] = 'inline; filename=relatorio.pdf'
response['Content-Transfer-Encoding'] = 'binary'
response.write(pdf_file)
return response

46
sapl/static/sapl/css/header-relatorio.css

@ -0,0 +1,46 @@
html body p {
border-top: 1px solid black;
text-align: center;
font-size: 11pt;
padding: 5px;
margin-top: -15px;
}
html body section {
box-sizing: border-box;
}
html body section dl {
display: flex;
flex-wrap: wrap;
rows: 2;
columns: 2;
}
html body section dt{
width: 50px;
}
html body section dd {
max-width:550px;
text-align: center;
}
html body section dd ul li {
list-style-type: none;
margin-left: 90px;
margin-bottom: -15px;
}
h2 {
font-size: 14pt;
}
h3 {
font-size: 10pt;
color: #6e6e6e;
}
ul {
padding: 0;
list-style: none;
margin-top:10px;
}
html body section dt img {
max-width:80px;
margin-left: 20px;
}

56
sapl/static/sapl/css/relatorio.css

@ -0,0 +1,56 @@
@page{
margin-top: 4.5cm;
size: A4 portrait;
}
h2.gray-title{
color: gray;
font-size: 14pt;
break-after: avoid-page;
page-break-after: avoid;
}
h3 {
font-size: 10pt;
break-after: avoid-page;
page-break-after: avoid;
}
p {
font-size: 10pt;
text-align: justify;
text-justify: inter-word;
}
fieldset {
border: 0;
}
html body section {
box-sizing: border-box;
}
html body section dl {
display: flex;
flex-wrap: wrap;
columns: 5;
}
html body section dt{
width: 50px;
}
html body section dd {
text-align: center;
}
html body section dd ul li {
list-style-type: none;
margin-left: 50px;
}
fieldset {
page-break-after: avoid;
margin:5px;
padding:0px;
}

2
sapl/templates/compilacao/textoarticulado_detail.html

@ -21,7 +21,7 @@
{% if perms.compilacao.lock_unlock_textoarticulado and not object.editable_only_by_owners%}
<a href="{% url 'sapl.compilacao:ta_text_edit' object.pk %}?{% if object.editing_locked %}unlock{%else%}lock{% endif %}" class="btn {% if object.editing_locked %}btn-outline-danger{%else%}btn-outline-primary{% endif %}">{% if object.editing_locked %}{% trans 'Desbloquear Edição' %}{%else%}{% trans 'Publicar Texto' %}{% endif %}</a>
{% endif %}
<a href="{% url 'sapl.relatorios:texto_articulado' object.pk %}" class="btn btn-outline-primary">Imprimir Texto</a>
</div>
</div>
{% endblock actions %}

31
sapl/templates/relatorios/header.html

@ -0,0 +1,31 @@
{% load common_tags %}
{% load render_bundle from webpack_loader %}
{% load webpack_static from webpack_loader %}
{% load static %}
<!DOCTYPE html>
<meta charset="utf-8">
</meta>
<html lang="pt-br">
<head>
<link rel="stylesheet" href="{% static 'sapl/css/header-relatorio.css'%}">
</head>
<body>
<section id="informations">
<dl>
<dt class="image-header">
<img src="{% if logotipo %}{{ MEDIA_URL }}{{ logotipo }}{% else %}{% webpack_static 'img/logo.png' %}{% endif %}">
</dt>
<dd class="title">
<ul>
<li style="margin-top:10px"><h2>{{casa}}</h2></li>
<li><h3>Sistema de Apoio ao Processo Legislativo</h3></li>
</ul>
</dd>
</dl>
</section>
<p></p>
</body>
</html>

52
sapl/templates/relatorios/relatorio_texto.html

@ -0,0 +1,52 @@
{% load common_tags %}
{% load static %}
<head>
<style>
@page{
@bottom-right {
content: "Página" counter(page);
height: 3cm;
font-size: 8pt;
}
@bottom-center {
border-top: 1px solid black;
font-size: 8pt;
height: 1cm;
content: "{{rodape|safe}}";
font-style:italic;
}
@bottom-left {
content: "{{data}}";
height: 3cm;
font-size: 8pt;
}
@top-center {
content: string(title);
}
header {
width: 0;
height: 0;
visibility: hidden;
string-set: title content();
}
}
</style>
<link rel="stylesheet" href="{% static '/sapl/css/relatorio.css'%}">
</head>
<body>
<h3 style="text-align:center;">Texto Articulado: {{object}}</h3>
<h3 style="color:gray;">Identificação Básica</h3>
<p style="font-size: 8pt"><b>Tipo de Texto Articulado:</b> {{object.tipo_ta}}</p>
<p style="font-size: 8pt"><b>Tipo da Norma Jurídica:</b> {{object.content_object.tipo}}</p>
<p style="font-size: 8pt"><b>Número:</b> {{object.numero}}</p>
<p style="font-size: 8pt"><b>Ano:</b> {{object.ano}}</p>
<p style="font-size: 8pt"><b>Data:</b> {{object.data}}</p>
<h3 style="color:gray;margin-top:50px;">Ementa</h3>
<p>{{object.ementa}}</p>
</body>
Loading…
Cancel
Save