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')) 'O processo final não pode ser menor que o inicial'))
return cleaned_data 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) TipoNormaJuridica)
from sapl.utils import models_with_gr_for_model from sapl.utils import models_with_gr_for_model
@pytest.mark.django_db(transaction=False)
def make_unidade_tramitacao(descricao): def make_unidade_tramitacao(descricao):
# Cria uma comissão para ser a unidade de tramitação # Cria uma comissão para ser a unidade de tramitação
tipo_comissao = mommy.make(TipoComissao) 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, CriarProtocoloMateriaView, DespachoInicialCrud,
DocumentoAcessorioCrud, DocumentoAcessorioCrud,
DocumentoAcessorioEmLoteView, DocumentoAcessorioEmLoteView,
EtiquetaPesquisaView, ImpressosView, ImpressosView, EtiquetaPesquisaView,
FichaPesquisaView, FichaSelecionaView,
LegislacaoCitadaCrud, MateriaAssuntoCrud, LegislacaoCitadaCrud, MateriaAssuntoCrud,
MateriaLegislativaCrud, MateriaLegislativaCrud,
MateriaLegislativaPesquisaView, MateriaTaView, MateriaLegislativaPesquisaView, MateriaTaView,
@ -35,6 +36,12 @@ urlpatterns_impressos = [
url(r'^materia/impressos/etiqueta-pesquisa/$', url(r'^materia/impressos/etiqueta-pesquisa/$',
EtiquetaPesquisaView.as_view(), EtiquetaPesquisaView.as_view(),
name='impressos_etiqueta'), 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 = [ urlpatterns_materia = [

91
sapl/materia/views.py

@ -1,3 +1,4 @@
import datetime as dt_generator
from datetime import datetime from datetime import datetime
from random import choice from random import choice
from string import ascii_letters, digits 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 import HttpResponse, JsonResponse
from django.http.response import Http404, HttpResponseRedirect from django.http.response import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect 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 import formats
from django.utils.translation import ugettext_lazy as _ 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
@ -47,10 +48,11 @@ from .email_utils import do_envia_email_confirmacao
from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
AdicionarVariasAutoriasFilterSet, DespachoInicialForm, AdicionarVariasAutoriasFilterSet, DespachoInicialForm,
DocumentoAcessorioForm, EtiquetaPesquisaForm, DocumentoAcessorioForm, EtiquetaPesquisaForm,
MateriaAssuntoForm, MateriaLegislativaFilterSet, FichaPesquisaForm, FichaSelecionaForm, MateriaAssuntoForm,
MateriaSimplificadaForm, PrimeiraTramitacaoEmLoteFilterSet, MateriaLegislativaFilterSet, MateriaSimplificadaForm,
ReceberProposicaoForm, RelatoriaForm, PrimeiraTramitacaoEmLoteFilterSet, ReceberProposicaoForm,
TramitacaoEmLoteFilterSet, filtra_tramitacao_destino, RelatoriaForm, TramitacaoEmLoteFilterSet,
filtra_tramitacao_destino,
filtra_tramitacao_destino_and_status, filtra_tramitacao_destino_and_status,
filtra_tramitacao_status) filtra_tramitacao_status)
from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria, from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria,
@ -1750,8 +1752,8 @@ class ImpressosView(PermissionRequiredMixin, TemplateView):
permission_required = ('materia.can_access_impressos', ) permission_required = ('materia.can_access_impressos', )
def gerar_pdf_impressos(request, context): def gerar_pdf_impressos(request, context, template_name):
template = loader.get_template('materia/impressos/pdf.html') template = loader.get_template(template_name)
html = template.render(RequestContext(request, context)) html = template.render(RequestContext(request, context))
response = HttpResponse(content_type="application/pdf") response = HttpResponse(content_type="application/pdf")
weasyprint.HTML( weasyprint.HTML(
@ -1795,4 +1797,77 @@ class EtiquetaPesquisaView(PermissionRequiredMixin, FormView):
context['materias'] = materias 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> <li><a href="{% url 'sapl.materia:impressos_etiqueta' %}">Pesquisar</a></li>
</ul> </ul>
{#<h2 class="legend">Ficha</h2>#} <h2 class="legend">Ficha</h2>
{# <ul>#} <ul>
{# <li><a href="{% url 'sapl.materia:impressos_ficha' %}">Pesquisar</a></li>#} <li><a href="{% url 'sapl.materia:impressos_ficha_pesquisa' %}">Pesquisar</a></li>
{# </ul>#} </ul>
{##}
{#<h2 class="legend">Guia de Remessa</h2>#} {#<h2 class="legend">Guia de Remessa</h2>#}
{# <ul>#} {# <ul>#}
{# <li><a href="{% url 'sapl.materia:impressos_guiaremessa' %}">Pesquisar</a></li>#} {# <li><a href="{% url 'sapl.materia:impressos_guiaremessa' %}">Pesquisar</a></li>#}

Loading…
Cancel
Save