diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 678264194..950dac3c1 100644 --- a/sapl/materia/forms.py +++ b/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') + ) + ) diff --git a/sapl/materia/tests/test_materia.py b/sapl/materia/tests/test_materia.py index 071d51d4c..39c17020b 100644 --- a/sapl/materia/tests/test_materia.py +++ b/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) diff --git a/sapl/materia/tests/test_materia_form.py b/sapl/materia/tests/test_materia_form.py new file mode 100644 index 000000000..a700ee45a --- /dev/null +++ b/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() diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index e0a056011..a59dc8592 100644 --- a/sapl/materia/urls.py +++ b/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 = [ diff --git a/sapl/materia/views.py b/sapl/materia/views.py index aa5aff472..f3aafb662 100644 --- a/sapl/materia/views.py +++ b/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') diff --git a/sapl/templates/materia/impressos/etiqueta_pdf.html b/sapl/templates/materia/impressos/etiqueta_pdf.html new file mode 100644 index 000000000..2f4ea2270 --- /dev/null +++ b/sapl/templates/materia/impressos/etiqueta_pdf.html @@ -0,0 +1,82 @@ + + + + + Impressos + + + + + + + +{% if quantidade > 30 %} +

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

+


+{% endif %} + +{% for m in materias %} +
+ + + {% if m.numeracao_set.first %} + PROCESSO: {{ m.numeracao_set.first.numero_materia }} +   + {% else %} + PROCESSO: {{ m.numero }} +   + {% endif %} + + + {{m.tipo.sigla}}: {{m.numero}}/{{m.ano}}   + + + Pref: + {% if m.numeracao_set.first %} + {{ m.numeracao_set.first.numero_materia }} + {% endif %}
+ DATA DE ENTRADA: {{m.data_apresentacao}}
+ + + {% if m.autoria_set.all %} + Autores: + {% for a in m.autoria_set.all %} + {% if not forloop.first %} + ,    {{a.autor}} + {% else %} +  {{a.autor}} + {% endif %} + {% endfor %} +
+ {% endif %} + + + EMENTA: {{m.ementa}} + +
+ +
+
+
+
+
+ +{% endfor %} + + diff --git a/sapl/templates/materia/impressos/ficha.html b/sapl/templates/materia/impressos/ficha.html new file mode 100644 index 000000000..03d1c8580 --- /dev/null +++ b/sapl/templates/materia/impressos/ficha.html @@ -0,0 +1,7 @@ +{% extends "crud/form.html" %} +{% load i18n crispy_forms_tags %} + +{% block base_content %} +

Impressos

+ {% crispy form %} +{% endblock base_content %} diff --git a/sapl/templates/materia/impressos/ficha_pdf.html b/sapl/templates/materia/impressos/ficha_pdf.html new file mode 100644 index 000000000..405d9a2f5 --- /dev/null +++ b/sapl/templates/materia/impressos/ficha_pdf.html @@ -0,0 +1,144 @@ + + + + + + + + + + +
+ +
+ + {% if materia.numeracao_set.first %} + PROCESSO Nº: {{ materia.numeracao_set.first.numero_materia }}

+   + {% else %} + PROCESSO Nº: {{ materia.numero }}

+   + {% endif %} +
+ + + {{materia.tipo}}: {{materia.numero}}/{{materia.ano}}
+ + + Data de entrada: {{materia.data_apresentacao}}
+ + + +
+
+ + {% if materia.autoria_set.all %} + Autor: + {% for a in materia.autoria_set.all %} + {% if not forloop.first %} + {{a.autor}}
+ {% else %} + {{a.autor}}
+ {% endif %} + {% endfor %} +
+ {% endif %} +
+
+ + +


+ + + +
+
+ Ementa: {{materia.ementa}} +
+
+ +


+ + +
+
+ Despacho Inicial: + {% for despacho in despachos %} +
{{despacho}} + {% endfor %} +
+
+
+
+ ________________NORMA JURIDICA_________________

+ _________________________________________________ + +
+ + + diff --git a/sapl/templates/materia/impressos/ficha_seleciona.html b/sapl/templates/materia/impressos/ficha_seleciona.html new file mode 100644 index 000000000..818b7c3a3 --- /dev/null +++ b/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 %} diff --git a/sapl/templates/materia/impressos/impressos.html b/sapl/templates/materia/impressos/impressos.html index 6f48dfddd..beb92862c 100644 --- a/sapl/templates/materia/impressos/impressos.html +++ b/sapl/templates/materia/impressos/impressos.html @@ -15,11 +15,11 @@
  • Pesquisar
  • -{#

    Ficha

    #} -{# #} -{##} +

    Ficha

    + + {#

    Guia de Remessa

    #} {#