Browse Source

Gera recibo do envio da proposição

pull/527/head
Eduardo Edson Batista Cordeiro Alves 9 years ago
committed by Edward Ribeiro
parent
commit
aa210b1c07
  1. 2
      sapl/materia/forms.py
  2. 6
      sapl/materia/models.py
  3. 13
      sapl/materia/urls.py
  4. 25
      sapl/materia/views.py
  5. 8
      sapl/templates/crud/confirm_delete.html
  6. 2
      sapl/templates/crud/detail.html
  7. 10
      sapl/templates/materia/proposicao_confirm_delete.html
  8. 6
      sapl/templates/materia/proposicao_detail.html
  9. 70
      sapl/templates/materia/recibo_proposicao.html
  10. 8
      sapl/utils.py

2
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'],

6
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,

13
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<pk>\d+)', ReciboProposicaoView.as_view(),
name='recibo-proposicao'),
# Integração com Compilação
url(r'^materia/(?P<pk>[0-9]+)/ta$',

25
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'

8
sapl/templates/crud/confirm_delete.html

@ -5,9 +5,11 @@
<form action="" method="post">{% csrf_token %}
<div class="panel panel-danger">
<div class="panel-heading text-center">
{% blocktrans %}
Confirma exclusão de "{{ object }}"?
{% endblocktrans %}
{% block msg %}
{% blocktrans %}
Confirma exclusão de "{{ object }}"?
{% endblocktrans %}
{% endblock msg %}
</div>
<div class="panel-body text-center">
<a href="{{ view.cancel_url }}" class="btn btn-inverse">{% trans 'Cancelar' %}</a>

2
sapl/templates/crud/detail.html

@ -11,7 +11,7 @@
</div>
{% endblock actions %}
</div>
{% block extra_msg %}{% endblock extra_msg %}
{% block detail_content %}
{% for fieldset in view.layout_display %}
<h2 class="legend">{{ fieldset.legend }}</h2>

10
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 %}

6
sapl/templates/materia/proposicao_detail.html

@ -4,7 +4,6 @@
{% block actions %}
<div class="actions btn-group pull-right" role="group">
{% if proposicao.data_envio %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar Proposição' %}</a>
<a href="{{ view.delete_url }}" class="btn btn-default">{% trans 'Retornar Proposição Enviada' %}</a>
{% else %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Enviar/Editar Proposição' %}</a>
@ -12,3 +11,8 @@
{% endif %}
</div>
{% endblock actions %}
{% block extra_msg %}
{% if proposicao.data_envio and not propos.data_recebimento %}
<b><p align="center"><a href="" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes')">[Imprimir Recibo]</a></p></b>
{% endif %}
{% endblock extra_msg %}

70
sapl/templates/materia/recibo_proposicao.html

@ -0,0 +1,70 @@
{% load i18n %}
{% load crispy_forms_tags %}
{% load static %}
{% block detail_content %}
<style>
table {
width: 100%;
}
th, td {
padding: 5px;
}
</style>
<div align="center">
<input type="submit" value="Imprimir" onclick="window.print();" class="btn btn-success"/>
</div>
<br />
<table>
<tr>
<td>
<img height="100" width="100"
src="{% if logotipo %}{{ MEDIA_URL }}{{ logotipo }}{% else %}{% static 'img/logo.png' %}{% endif %}"
alt="Logotipo"
class="img-responsive visible-lg-inline-block vcenter">
<div>
</td>
<td>
{% if nome %}
<b>{{ nome }} {% trans 'de' %} {{ municipio }} - {{ uf }}</b>
{% else %}
<b>{% trans 'Sem Nome Cadastrado' %}</b>
{% endif %}
<br />
{% trans 'Sistema de Apoio ao Processo Legislativo' %}
</td>
</tr>
<tr> <td colspan="2" align="center"><b>RECIBO DE ENVIO DE PROPOSIÇÃO</b></td> </tr>
</table>
<br /><br />
<table frame="box">
<tr>
<td>Código do Documento: <b>{{hash}}</b></td>
<td>Tipo de Proposição: <b>{{proposicao.tipo.descricao}}</b></td>
</tr>
<tr>
<td>Autor: <b>{{proposicao.autor}}</b></td>
<td>Data de Envio: <b>{{proposicao.data_envio|date:"d/m/Y H:i:s"}}</b></td>
</tr>
<tr>
<td>Descrição: <b>{{proposicao.descricao}}</b></td>
</tr>
</table>
<br /><br />
<table>
<tr>
<td align="center">
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.
</td>
</tr>
<tr> <td align="center"><br /><br /><br /><b>________________________________________________________________</b></td> </tr>
<tr> <td align="center">{{proposicao.autor}}</td> </tr>
</table>
{% endblock detail_content %}

8
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

Loading…
Cancel
Save