Browse Source

FIx #1436 - impressos (#1469)

* Cria página de pesquisa referente a ficha

* Fix #1436

* Corrige choicefield para modelfield

* Fix #1436

-Adiciona teste ao form de materia
-Corrige alguns erros
pull/1478/head
Mariana Mendes 7 years ago
committed by Edward
parent
commit
8bd525606d
  1. 68
      sapl/materia/forms.py
  2. 2
      sapl/materia/tests/test_materia.py
  3. 66
      sapl/materia/tests/test_materia_form.py
  4. 9
      sapl/materia/urls.py
  5. 91
      sapl/materia/views.py
  6. 82
      sapl/templates/materia/impressos/etiqueta_pdf.html
  7. 7
      sapl/templates/materia/impressos/ficha.html
  8. 144
      sapl/templates/materia/impressos/ficha_pdf.html
  9. 6
      sapl/templates/materia/impressos/ficha_seleciona.html
  10. 10
      sapl/templates/materia/impressos/impressos.html

68
sapl/materia/forms.py

@ -1678,3 +1678,71 @@ class EtiquetaPesquisaForm(forms.Form):
'O processo final não pode ser menor que o inicial'))
return cleaned_data
class FichaPesquisaForm(forms.Form):
tipo_materia = forms.ModelChoiceField(
label=TipoMateriaLegislativa._meta.verbose_name,
queryset=TipoMateriaLegislativa.objects.all(),
empty_label='Selecione')
data_inicial = forms.DateField(
label='Data Inicial',
widget=forms.DateInput(format='%d/%m/%Y')
)
data_final = forms.DateField(
label='Data Final',
widget=forms.DateInput(format='%d/%m/%Y')
)
def __init__(self, *args, **kwargs):
super(FichaPesquisaForm, self).__init__(*args, **kwargs)
row1 = to_row(
[('tipo_materia', 6),
('data_inicial', 3),
('data_final', 3)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
('Formulário de Ficha'),
row1,
form_actions(save_label='Pesquisar')
)
)
def clean(self):
cleaned_data = super(FichaPesquisaForm, self).clean()
if not self.is_valid():
return cleaned_data
if cleaned_data['data_final'] < cleaned_data['data_inicial']:
raise ValidationError(_(
'A Data Final não pode ser menor que a Data Inicial'))
return cleaned_data
class FichaSelecionaForm(forms.Form):
materia = forms.ModelChoiceField(
widget=forms.RadioSelect,
queryset=MateriaLegislativa.objects.all(),
label='')
def __init__(self, *args, **kwargs):
super(FichaSelecionaForm, self).__init__(*args, **kwargs)
row1 = to_row(
[('materia', 12)])
self.helper = FormHelper()
self.helper.layout = Layout(
Fieldset(
('Selecione a ficha que deseja imprimir'),
row1,
form_actions(save_label='Gerar Impresso')
)
)

2
sapl/materia/tests/test_materia.py

@ -17,7 +17,7 @@ from sapl.norma.models import (LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
from sapl.utils import models_with_gr_for_model
@pytest.mark.django_db(transaction=False)
def make_unidade_tramitacao(descricao):
# Cria uma comissão para ser a unidade de tramitação
tipo_comissao = mommy.make(TipoComissao)

66
sapl/materia/tests/test_materia_form.py

@ -0,0 +1,66 @@
import pytest
from django.utils.translation import ugettext as _
from model_mommy import mommy
from sapl.materia import forms
from sapl.materia.models import (MateriaLegislativa, TipoMateriaLegislativa)
@pytest.mark.django_db(transaction=False)
def test_valida_campos_obrigatorios_ficha_pesquisa_form():
form = forms.FichaPesquisaForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['tipo_materia'] == [_('Este campo é obrigatório.')]
assert errors['data_inicial'] == [_('Este campo é obrigatório.')]
assert errors['data_final'] == [_('Este campo é obrigatório.')]
assert len(errors) == 3
@pytest.mark.django_db(transaction=False)
def test_ficha_pesquisa_form_datas_invalidas():
tipo = mommy.make(TipoMateriaLegislativa)
form = forms.FichaPesquisaForm(data={'tipo_materia': str(tipo.pk),
'data_inicial': '10/11/2017',
'data_final': '09/11/2017'
})
assert not form.is_valid()
assert form.errors['__all__'] == [_('A Data Final não pode ser menor que '
'a Data Inicial')]
@pytest.mark.django_db(transaction=False)
def test_ficha_pesquisa_form_invalido():
tipo = mommy.make(TipoMateriaLegislativa)
form = forms.FichaPesquisaForm(data={'tipo_materia': str(tipo.pk),
'data_inicial': '10/11/2017',
'data_final': '09/11/2017'
})
assert not form.is_valid()
@pytest.mark.django_db(transaction=False)
def test_valida_campos_obrigatorios_ficha_seleciona_form():
form = forms.FichaSelecionaForm(data={})
assert not form.is_valid()
errors = form.errors
assert errors['materia'] == [_('Este campo é obrigatório.')]
assert len(errors) == 1
@pytest.mark.django_db(transaction=False)
def test_ficha_seleciona_form_valido():
materia = mommy.make(MateriaLegislativa)
form = forms.FichaSelecionaForm(data={'materia': str(materia.pk)})
assert form.is_valid()

9
sapl/materia/urls.py

@ -8,7 +8,8 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
CriarProtocoloMateriaView, DespachoInicialCrud,
DocumentoAcessorioCrud,
DocumentoAcessorioEmLoteView,
EtiquetaPesquisaView, ImpressosView,
ImpressosView, EtiquetaPesquisaView,
FichaPesquisaView, FichaSelecionaView,
LegislacaoCitadaCrud, MateriaAssuntoCrud,
MateriaLegislativaCrud,
MateriaLegislativaPesquisaView, MateriaTaView,
@ -35,6 +36,12 @@ urlpatterns_impressos = [
url(r'^materia/impressos/etiqueta-pesquisa/$',
EtiquetaPesquisaView.as_view(),
name='impressos_etiqueta'),
url(r'^materia/impressos/ficha-pesquisa/$',
FichaPesquisaView.as_view(),
name='impressos_ficha_pesquisa'),
url(r'^materia/impressos/ficha-seleciona/$',
FichaSelecionaView.as_view(),
name='impressos_ficha_seleciona'),
]
urlpatterns_materia = [

91
sapl/materia/views.py

@ -1,3 +1,4 @@
import datetime as dt_generator
from datetime import datetime
from random import choice
from string import ascii_letters, digits
@ -13,7 +14,7 @@ from django.core.urlresolvers import reverse
from django.http import HttpResponse, JsonResponse
from django.http.response import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect
from django.template import RequestContext, loader
from django.template import loader, RequestContext
from django.utils import formats
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
@ -47,10 +48,11 @@ from .email_utils import do_envia_email_confirmacao
from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
AdicionarVariasAutoriasFilterSet, DespachoInicialForm,
DocumentoAcessorioForm, EtiquetaPesquisaForm,
MateriaAssuntoForm, MateriaLegislativaFilterSet,
MateriaSimplificadaForm, PrimeiraTramitacaoEmLoteFilterSet,
ReceberProposicaoForm, RelatoriaForm,
TramitacaoEmLoteFilterSet, filtra_tramitacao_destino,
FichaPesquisaForm, FichaSelecionaForm, MateriaAssuntoForm,
MateriaLegislativaFilterSet, MateriaSimplificadaForm,
PrimeiraTramitacaoEmLoteFilterSet, ReceberProposicaoForm,
RelatoriaForm, TramitacaoEmLoteFilterSet,
filtra_tramitacao_destino,
filtra_tramitacao_destino_and_status,
filtra_tramitacao_status)
from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria,
@ -1750,8 +1752,8 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
permission_required = ('materia.can_access_impressos', )
def gerar_pdf_impressos(request, context):
template = loader.get_template('materia/impressos/pdf.html')
def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template(template_name)
html = template.render(RequestContext(request, context))
response = HttpResponse(content_type="application/pdf")
weasyprint.HTML(
@ -1795,4 +1797,77 @@ class EtiquetaPesquisaView(PermissionRequiredMixin, FormView):
context['materias'] = materias
return gerar_pdf_impressos(self.request, context)
return gerar_pdf_impressos(self.request, context,
'materia/impressos/etiqueta_pdf.html')
class FichaPesquisaView(PermissionRequiredMixin, FormView):
form_class = FichaPesquisaForm
template_name = 'materia/impressos/ficha.html'
permission_required = ('materia.can_access_impressos', )
def form_valid(self, form):
tipo_materia = form.data['tipo_materia']
data_inicial = form.data['data_inicial']
data_final = form.data['data_final']
url = reverse('sapl.materia:impressos_ficha_seleciona')
url = url + '?tipo=%s&data_inicial=%s&data_final=%s' % (
tipo_materia, data_inicial, data_final)
return HttpResponseRedirect(url)
class FichaSelecionaView(PermissionRequiredMixin, FormView):
form_class = FichaSelecionaForm
template_name = 'materia/impressos/ficha_seleciona.html'
permission_required = ('materia.can_access_impressos', )
def get_context_data(self, **kwargs):
if ('tipo' not in self.request.GET or
'data_inicial' not in self.request.GET or
'data_final' not in self.request.GET):
return HttpResponseRedirect(reverse(
'sapl.materia:impressos_ficha_pesquisa'))
context = super(FichaSelecionaView, self).get_context_data(
**kwargs)
tipo = self.request.GET['tipo']
data_inicial = datetime.strptime(
self.request.GET['data_inicial'], "%d/%m/%Y").date()
data_final = datetime.strptime(
self.request.GET['data_final'], "%d/%m/%Y").date()
materia_list = MateriaLegislativa.objects.filter(
tipo=tipo,
data_apresentacao__range=(data_inicial, data_final))
context['quantidade'] = len(materia_list)
materia_list = materia_list[:20]
context['form'].fields['materia'].choices = [(m.id, str(m)) for m in materia_list]
if context['quantidade'] > 20:
messages.info(self.request, _('Sua pesquisa retornou mais do que '
'20 impressos. Por questões de performance, foram retornados '
'apenas os 20 primeiros. Caso queira outros, tente fazer uma '
'pesquisa mais específica'))
return context
def form_valid(self, form):
context = {}
try:
materia = MateriaLegislativa.objects.get(
id=form.data['materia'])
except ObjectDoesNotExist:
mensagem = _('Esta Máteria não existe!')
self.messages.add_message(request, messages.INFO, mensagem)
return self.render_to_response(context)
context['materia'] = materia
context['despachos'] = materia.despachoinicial_set.all().values_list(
'comissao__nome', flat=True)
return gerar_pdf_impressos(self.request, context, 'materia/impressos/ficha_pdf.html')

82
sapl/templates/materia/impressos/etiqueta_pdf.html

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html>
<head>
<title>Impressos</title>
<meta charset="utf-8">
</head>
<style type="text/css">
.text_pdf{
font-family: verdana;
font-size: 77%;
}
.alert_message{
font-family: verdana;
font-size: 77%;
color: red;
@media print {
p {page-break-inside: avoid;}
}
}
</style>
<body style="margin-left:80px;margin-right:80px; margin-top: -50px">
{% if quantidade > 30 %}
<b><p class="alert_message">Sua pesquisa retornou mais do que 20 impressos.</p><p class="alert_message">Por questões de performance, foram retornados apenas os 20 primeiros. Caso queira outros, tente fazer uma pesquisa mais específica</p></b>
</br></br></br>
{% endif %}
{% for m in materias %}
<div style="page-break-inside: avoid;">
<justify>
<!-- Informa o processo -->
{% if m.numeracao_set.first %}
<strong class="text_pdf">PROCESSO: {{ m.numeracao_set.first.numero_materia }}</strong>
&nbsp;
{% else %}
<strong class="text_pdf">PROCESSO: {{ m.numero }}</strong>
&nbsp;
{% endif %}
<!-- Informa o tipo da matéria -->
<strong class="text_pdf">{{m.tipo.sigla}}:</strong> <span class="text_pdf"> {{m.numero}}/{{m.ano}} </span> &nbsp;
<!-- Informa o campo Pref ??? #TODO -->
<strong class="text_pdf">Pref:</strong>
{% if m.numeracao_set.first %}
<span class="text_pdf">{{ m.numeracao_set.first.numero_materia }}</span>
{% endif %} </br
<!-- Informa a Data de Entrada -->
<strong class="text_pdf">DATA DE ENTRADA:</strong> <span class="text_pdf"> {{m.data_apresentacao}}</span></br>
<!-- Lista os autores -->
{% if m.autoria_set.all %}
<strong class="text_pdf">Autores:</strong>
{% for a in m.autoria_set.all %}
{% if not forloop.first %}
, &nbsp;&nbsp; <span class="text_pdf">{{a.autor}}</span>
{% else %}
&nbsp;<span class="text_pdf">{{a.autor}}</span>
{% endif %}
{% endfor %}
</br>
{% endif %}
<!-- Ementa -->
<strong class="text_pdf">EMENTA:</strong> <span class="text_pdf">{{m.ementa}}</span>
</div>
</justify>
</br>
</br>
</br>
</br>
</br>
{% endfor %}
</body>

7
sapl/templates/materia/impressos/ficha.html

@ -0,0 +1,7 @@
{% extends "crud/form.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
<h1 class="page-header">Impressos</h1>
{% crispy form %}
{% endblock base_content %}

144
sapl/templates/materia/impressos/ficha_pdf.html

@ -0,0 +1,144 @@
<!DOCTYPE html>
<html><head>
<link rel="stylesheet" href="basicsstyles.css" type="text/css" media="screen">
<link rel="stylesheet" href="printstyles.css" type="text/css" media="print">
<style type="text/css" media="all">
body
{
font-size: small;
font-family: Arial;
line-height: 175%;
background-color: transparent;
margin: 5pt 5pt 0pt 0pt;
}
#voltar
{
position: absolute;
top: 50pt;
left: 500pt;
}
#ementa_texto
{
font-family: Arial;
line-height: 175%;
border-style: none;
text-align: justify;
padding: 0pt 5pt 0pt 0pt;
line-height: 140%;
font-size: small;
}
#ficha_menor
{
background-color: transparent;
margin: -2pt 20pt 0pt 0pt;
position: relative;
width: 285pt;
height: 370pt;
}
#titulo
{
font-size: medium;
text-align: center;
}
#ficha_maior
{
background-color: #9eddee;
margin:0pt;
position: relative;
width: 285pt;
height: 370pt;
}
#despacho_inicial
{
font-family: Arial;
border-style: none;
text-align: justify;
font-size: small;
}
@media print {
#voltar { display: none; }
}
</style>
<body style="margin-left:80px;margin-right:80px; margin-top: -50px">
<div style="page-break-inside: avoid;">
<justify>
<div id="titulo">
<!-- Informa o processo -->
{% if materia.numeracao_set.first %}
<strong class="text_pdf">PROCESSO Nº: {{ materia.numeracao_set.first.numero_materia }}</strong><br><br>
&nbsp;
{% else %}
<strong class="text_pdf">PROCESSO Nº: {{ materia.numero }}</strong><br><br>
&nbsp;
{% endif %}
</div>
<!-- Informa o tipo da matéria -->
<strong class="text_pdf">{{materia.tipo}}:</strong> <span class="text_pdf"> {{materia.numero}}/{{materia.ano}} </span><br>
<!-- Informa a Data de Entrada -->
<strong class="text_pdf">Data de entrada:</strong> <span class="text_pdf"> {{materia.data_apresentacao}}</span></br>
<table border=0>
<td height="60pt" valign=top>
<div id="ementa_texto">
<!-- Lista os autores -->
{% if materia.autoria_set.all %}
<strong class="text_pdf">Autor:</strong>
{% for a in materia.autoria_set.all %}
{% if not forloop.first %}
<span class="text_pdf">{{a.autor}}</span><br>
{% else %}
<span class="text_pdf">{{a.autor}}</span><br>
{% endif %}
{% endfor %}
</br>
{% endif %}
</div>
</td>
</table>
<br><br><br>
<!-- Ementa -->
<table border=0>
<td height="160pt">
<div id="ementa_texto">
<strong class="text_pdf">Ementa:</strong> <span class="text_pdf">{{materia.ementa}}</span>
</div>
</td>
</table>
<br><br><br>
<table border=0>
<td height="100pt">
<div id="despacho_inicial">
<strong class="text_pdf">Despacho Inicial:</strong>
{% for despacho in despachos %}
<br> <span class="text_pdf">{{despacho}}</span>
{% endfor %}
</div>
</td>
</table>
<br>
<strong></strong><br>
<strong>________________NORMA JURIDICA_________________</strong><br><br>
<strong>_________________________________________________</strong>
</div>
</justify>
</body>

6
sapl/templates/materia/impressos/ficha_seleciona.html

@ -0,0 +1,6 @@
{% extends "crud/form.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
{% crispy form %}
{% endblock base_content %}

10
sapl/templates/materia/impressos/impressos.html

@ -15,11 +15,11 @@
<li><a href="{% url 'sapl.materia:impressos_etiqueta' %}">Pesquisar</a></li>
</ul>
{#<h2 class="legend">Ficha</h2>#}
{# <ul>#}
{# <li><a href="{% url 'sapl.materia:impressos_ficha' %}">Pesquisar</a></li>#}
{# </ul>#}
{##}
<h2 class="legend">Ficha</h2>
<ul>
<li><a href="{% url 'sapl.materia:impressos_ficha_pesquisa' %}">Pesquisar</a></li>
</ul>
{#<h2 class="legend">Guia de Remessa</h2>#}
{# <ul>#}
{# <li><a href="{% url 'sapl.materia:impressos_guiaremessa' %}">Pesquisar</a></li>#}

Loading…
Cancel
Save