From aa210b1c0771b00e65913a4a8fc64b901e2affae Mon Sep 17 00:00:00 2001 From: Eduardo Edson Batista Cordeiro Alves Date: Tue, 9 Aug 2016 10:33:04 -0300 Subject: [PATCH] =?UTF-8?q?Gera=20recibo=20do=20envio=20da=20proposi=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 2 +- sapl/materia/models.py | 6 +- sapl/materia/urls.py | 13 ++-- sapl/materia/views.py | 25 ++++++- sapl/templates/crud/confirm_delete.html | 8 ++- sapl/templates/crud/detail.html | 2 +- .../materia/proposicao_confirm_delete.html | 10 +++ sapl/templates/materia/proposicao_detail.html | 6 +- sapl/templates/materia/recibo_proposicao.html | 70 +++++++++++++++++++ sapl/utils.py | 8 +++ 10 files changed, 134 insertions(+), 16 deletions(-) create mode 100644 sapl/templates/materia/proposicao_confirm_delete.html create mode 100644 sapl/templates/materia/recibo_proposicao.html diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index de0ebf143..bf8771654 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -81,7 +81,7 @@ class ProposicaoForm(ModelForm): def clean(self): cleaned_data = self.cleaned_data if 'tipo' in cleaned_data: - if cleaned_data['tipo'].descricao == 'Parecer': + if cleaned_data['tipo'].descricao == 'Emenda': try: materia = MateriaLegislativa.objects.get( tipo_id=cleaned_data['tipo_materia'], diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 0b74e7b9f..f6c0ec39f 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -443,14 +443,16 @@ class TipoProposicao(models.Model): class Proposicao(models.Model): autor = models.ForeignKey(Autor, null=True, blank=True) tipo = models.ForeignKey(TipoProposicao, verbose_name=_('Tipo')) + # XXX data_envio was not null, but actual data said otherwise!!! data_envio = models.DateTimeField( - null=True, blank=True, verbose_name=_('Data de Envio')) + blank=True, null=True, verbose_name=_('Data de Envio')) data_recebimento = models.DateTimeField( blank=True, null=True, verbose_name=_('Data de Recebimento')) - descricao = models.TextField(max_length=100, verbose_name=_('Descrição')) data_incorporação = models.DateTimeField( blank=True, null=True, verbose_name=_('Data de Incorporação')) + + descricao = models.TextField(max_length=100, verbose_name=_('Descrição')) justificativa_devolucao = models.CharField( max_length=200, blank=True, diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index dbc6499fc..38286a6ab 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -9,11 +9,12 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, MateriaLegislativaPesquisaView, MateriaTaView, NumeracaoCrud, OrgaoCrud, OrigemCrud, ProposicaoCrud, ProposicaoTaView, - RegimeTramitacaoCrud, RelatoriaCrud, - StatusTramitacaoCrud, TipoAutorCrud, - TipoDocumentoCrud, TipoFimRelatoriaCrud, - TipoMateriaCrud, TipoProposicaoCrud, - TramitacaoCrud, UnidadeTramitacaoCrud) + ReciboProposicaoView, RegimeTramitacaoCrud, + RelatoriaCrud, StatusTramitacaoCrud, + TipoAutorCrud, TipoDocumentoCrud, + TipoFimRelatoriaCrud, TipoMateriaCrud, + TipoProposicaoCrud, TramitacaoCrud, + UnidadeTramitacaoCrud) from .apps import AppConfig @@ -31,6 +32,8 @@ urlpatterns = [ DocumentoAcessorioCrud.get_urls())), url(r'^proposicao/', include(ProposicaoCrud.get_urls())), + url(r'^proposicao/recibo/(?P\d+)', ReciboProposicaoView.as_view(), + name='recibo-proposicao'), # Integração com Compilação url(r'^materia/(?P[0-9]+)/ta$', diff --git a/sapl/materia/views.py b/sapl/materia/views.py index b63efc737..205ae004e 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -21,7 +21,8 @@ from sapl.crud.base import (Crud, CrudBaseMixin, CrudCreateView, CrudListView, CrudUpdateView, make_pagination) from sapl.crud.masterdetail import MasterDetailCrud from sapl.norma.models import LegislacaoCitada -from sapl.utils import autor_label, autor_modal, get_base_url +from sapl.utils import (autor_label, autor_modal, gerar_hash_arquivo, + get_base_url) from .forms import (AcompanhamentoMateriaForm, AnexadaForm, AutoriaForm, DespachoInicialForm, DocumentoAcessorioForm, @@ -68,7 +69,8 @@ class ProposicaoCrud(Crud): help_path = '' class BaseMixin(CrudBaseMixin): - list_field_names = ['data_envio', 'descricao', 'tipo'] + list_field_names = ['data_envio', 'descricao', + 'tipo', 'data_recebimento'] class CreateView(CrudCreateView): form_class = ProposicaoForm @@ -85,13 +87,15 @@ class ProposicaoCrud(Crud): return 'ProposicaoCreate' class ListView(CrudListView): - ordering = ['-data_envio', 'descricao'] + ordering = ['-data_envio', '-descricao'] def get_rows(self, object_list): for obj in object_list: if obj.data_envio is None: obj.data_envio = 'Em elaboração...' + if obj.data_recebimento is None: + obj.data_recebimento = 'Não recebida' return [self._as_row(obj) for obj in object_list] @@ -112,6 +116,21 @@ class ProposicaoCrud(Crud): kwargs={'pk': proposicao.pk})) +class ReciboProposicaoView(TemplateView): + + template_name = "materia/recibo_proposicao.html" + + def get_context_data(self, **kwargs): + context = super(ReciboProposicaoView, self).get_context_data( + **kwargs) + proposicao = Proposicao.objects.get(pk=self.kwargs['pk']) + context.update({'proposicao': proposicao, + 'hash': gerar_hash_arquivo( + proposicao.texto_original.path, + self.kwargs['pk'])}) + return context + + class RelatoriaCrud(MasterDetailCrud): model = Relatoria parent_field = 'materia' diff --git a/sapl/templates/crud/confirm_delete.html b/sapl/templates/crud/confirm_delete.html index 685c0d4ac..0bf9795dd 100644 --- a/sapl/templates/crud/confirm_delete.html +++ b/sapl/templates/crud/confirm_delete.html @@ -5,9 +5,11 @@
{% csrf_token %}
- {% blocktrans %} - Confirma exclusão de "{{ object }}"? - {% endblocktrans %} + {% block msg %} + {% blocktrans %} + Confirma exclusão de "{{ object }}"? + {% endblocktrans %} + {% endblock msg %}
{% trans 'Cancelar' %} diff --git a/sapl/templates/crud/detail.html b/sapl/templates/crud/detail.html index 5eb502d19..c8c983367 100644 --- a/sapl/templates/crud/detail.html +++ b/sapl/templates/crud/detail.html @@ -11,7 +11,7 @@
{% endblock actions %}
- + {% block extra_msg %}{% endblock extra_msg %} {% block detail_content %} {% for fieldset in view.layout_display %}

{{ fieldset.legend }}

diff --git a/sapl/templates/materia/proposicao_confirm_delete.html b/sapl/templates/materia/proposicao_confirm_delete.html new file mode 100644 index 000000000..be402a125 --- /dev/null +++ b/sapl/templates/materia/proposicao_confirm_delete.html @@ -0,0 +1,10 @@ +{% extends "crud/confirm_delete.html" %} +{% load i18n %} + +{% block msg %} + {% if proposicao.data_envio %} + Confirma o retorno de "{{ object }}"? + {% else %} + Confirma exclusão de "{{ object }}"? + {% endif %} +{% endblock msg %} diff --git a/sapl/templates/materia/proposicao_detail.html b/sapl/templates/materia/proposicao_detail.html index 25834b48d..d440dba35 100644 --- a/sapl/templates/materia/proposicao_detail.html +++ b/sapl/templates/materia/proposicao_detail.html @@ -4,7 +4,6 @@ {% block actions %}
{% if proposicao.data_envio %} - {% trans 'Editar Proposição' %} {% trans 'Retornar Proposição Enviada' %} {% else %} {% trans 'Enviar/Editar Proposição' %} @@ -12,3 +11,8 @@ {% endif %}
{% endblock actions %} +{% block extra_msg %} + {% if proposicao.data_envio and not propos.data_recebimento %} +

[Imprimir Recibo]

+ {% endif %} +{% endblock extra_msg %} diff --git a/sapl/templates/materia/recibo_proposicao.html b/sapl/templates/materia/recibo_proposicao.html new file mode 100644 index 000000000..a8b15d2b7 --- /dev/null +++ b/sapl/templates/materia/recibo_proposicao.html @@ -0,0 +1,70 @@ +{% load i18n %} +{% load crispy_forms_tags %} +{% load static %} + +{% block detail_content %} + + +
+ +
+ +
+ + + + + + + +
+ Logotipo +
+
+ {% if nome %} + {{ nome }} {% trans 'de' %} {{ municipio }} - {{ uf }} + {% else %} + {% trans 'Sem Nome Cadastrado' %} + {% endif %} +
+ {% trans 'Sistema de Apoio ao Processo Legislativo' %} +
RECIBO DE ENVIO DE PROPOSIÇÃO
+ +

+ + + + + + + + + + + + + +
Código do Documento: {{hash}}Tipo de Proposição: {{proposicao.tipo.descricao}}
Autor: {{proposicao.autor}}Data de Envio: {{proposicao.data_envio|date:"d/m/Y H:i:s"}}
Descrição: {{proposicao.descricao}}
+ +

+ + + + + + + +
+ Declaro que o conteúdo do texto impresso em anexo é idêntico ao conteúdo enviado eletronicamente por meio do sistema SAPL para esta proposição. +



________________________________________________________________
{{proposicao.autor}}
+{% endblock detail_content %} diff --git a/sapl/utils.py b/sapl/utils.py index c4a6f8a70..08b0dbeaf 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -1,3 +1,4 @@ +import hashlib from datetime import date from functools import wraps @@ -218,3 +219,10 @@ def intervalos_tem_intersecao(a_inicio, a_fim, b_inicio, b_fim): maior_inicio = max(a_inicio, b_inicio) menor_fim = min(a_fim, b_fim) return maior_inicio <= menor_fim + + +def gerar_hash_arquivo(arquivo, pk, hasher=hashlib.md5(), blocksize=65536): + with open(arquivo, 'rb') as arq: + for chunk in iter(lambda: arq.read(blocksize), b''): + hasher.update(chunk) + return 'P' + hasher.hexdigest() + '/' + pk