Browse Source

Add botões de texto em proposições

pull/752/head
LeandroRoberto 8 years ago
parent
commit
de69f00d9e
  1. 22
      sapl/materia/forms.py
  2. 3
      sapl/materia/models.py
  3. 71
      sapl/materia/views.py
  4. 2
      sapl/templates/compilacao/textoarticulado_detail.html
  5. 55
      sapl/templates/crud/detail.html
  6. 36
      sapl/templates/materia/proposicao_detail.html

22
sapl/materia/forms.py

@ -11,6 +11,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models, transaction
from django.db.models import Max
from django.forms import ModelForm, widgets
from django.forms.forms import Form
from django.utils.translation import ugettext_lazy as _
import django_filters
@ -44,20 +45,9 @@ def em_tramitacao():
(False, 'Não')]
class ConfirmarProposicaoForm(ModelForm):
class Meta:
model = Proposicao
exclude = ['texto_original', 'descricao', 'tipo']
class ReceberProposicaoForm(ModelForm):
class ReceberProposicaoForm(Form):
cod_hash = forms.CharField(label='Código do Documento', required=True)
class Meta:
model = Proposicao
exclude = ['texto_original', 'descricao', 'tipo']
def __init__(self, *args, **kwargs):
row1 = to_row([('cod_hash', 12)])
self.helper = FormHelper()
@ -933,11 +923,11 @@ class ProposicaoForm(forms.ModelForm):
super(ProposicaoForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['tipo_texto'].initial = []
if self.instance.texto_original:
self.fields['tipo_texto'].initial.append('D')
if self.texto_articulado_proposicao:
self.fields['tipo_texto'].initial = []
if self.instance.texto_original:
self.fields['tipo_texto'].initial.append('D')
if self.instance.texto_articulado:
if self.instance.texto_articulado.exists():
self.fields['tipo_texto'].initial.append('T')
def clean_texto_original(self):

3
sapl/materia/models.py

@ -3,6 +3,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey,\
GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.deletion import PROTECT
from django.utils.translation import ugettext_lazy as _
from model_utils import Choices
@ -452,7 +453,7 @@ class Parecer(models.Model):
class Proposicao(models.Model):
autor = models.ForeignKey(Autor, null=True, blank=True)
autor = models.ForeignKey(Autor, null=True, blank=True, on_delete=PROTECT)
tipo = models.ForeignKey(TipoProposicao, verbose_name=_('Tipo'))
# XXX data_envio was not null, but actual data said otherwise!!!

71
sapl/materia/views.py

@ -21,15 +21,16 @@ from django.utils.http import urlsafe_base64_decode
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView
from sapl.base.models import AppConfig, Autor, CasaLegislativa, TipoAutor
from sapl.base.models import Autor, CasaLegislativa, TipoAutor
from sapl.compilacao.views import IntegracaoTaView
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions
from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL,
ACTION_LIST, ACTION_UPDATE, RP_DETAIL, RP_LIST,
Crud, CrudAux, CrudDetailView, MasterDetailCrud,
make_pagination)
make_pagination, PermissionRequiredForAppCrudMixin)
from sapl.materia import apps
from sapl.materia.forms import AnexadaForm, LegislacaoCitadaForm,\
TipoProposicaoForm, ProposicaoForm
@ -39,9 +40,10 @@ from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label,
permissoes_autor, permissoes_materia,
permissoes_protocoloadm, permission_required_for_app,
montar_row_autor)
import sapl
from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
ConfirmarProposicaoForm, DocumentoAcessorioForm,
DocumentoAcessorioForm,
MateriaLegislativaFilterSet,
PrimeiraTramitacaoEmLoteFilterSet, ProposicaoOldForm,
ReceberProposicaoForm, TramitacaoEmLoteFilterSet,
@ -81,7 +83,7 @@ class MateriaTaView(IntegracaoTaView):
este get foi implementado para tratar uma prerrogativa externa
de usuário.
"""
if AppConfig.attr('texto_articulado_materia'):
if sapl.base.models.AppConfig.attr('texto_articulado_materia'):
return IntegracaoTaView.get(self, request, *args, **kwargs)
else:
return self.get_redirect_deactivated()
@ -90,6 +92,9 @@ class MateriaTaView(IntegracaoTaView):
class ProposicaoTaView(IntegracaoTaView):
model = Proposicao
model_type_foreignkey = TipoProposicao
# TODO implmentar o mapa de fields e utiliza-lo em IntegracaoTaView
fields = {
}
def get(self, request, *args, **kwargs):
"""
@ -97,7 +102,7 @@ class ProposicaoTaView(IntegracaoTaView):
este get foi implementado para tratar uma prerrogativa externa
de usuário.
"""
if AppConfig.attr('texto_articulado_proposicao'):
if sapl.base.models.AppConfig.attr('texto_articulado_proposicao'):
return IntegracaoTaView.get(self, request, *args, **kwargs)
else:
return self.get_redirect_deactivated()
@ -250,17 +255,13 @@ class ProposicaoRecebida(PermissionRequiredMixin, ListView):
return context
class ReceberProposicao(PermissionRequiredMixin, CreateView):
class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView):
app_label = sapl.protocoloadm.apps.AppConfig.label
template_name = "materia/receber_proposicao.html"
form_class = ReceberProposicaoForm
permission_required = permissoes_protocoloadm()
def get_context_data(self, **kwargs):
context = super(ReceberProposicao, self).get_context_data(**kwargs)
context.update({'form': self.get_form()})
return context
def post(self, request, *args, **kwargs):
form = ReceberProposicaoForm(request.POST)
if form.is_valid():
@ -274,19 +275,16 @@ class ReceberProposicao(PermissionRequiredMixin, CreateView):
reverse('sapl.materia:proposicao-confirmar',
kwargs={'pk': proposicao.pk}))
msg = 'Proposição não encontrada!'
return self.render_to_response({'form': form, 'msg': msg})
else:
return self.render_to_response({'form': form})
messages.error(request, _('Proposição não encontrada!'))
return self.form_invalid(form)
def get_success_url(self):
return reverse('sapl.materia:receber-proposicao')
class ConfirmarProposicao(PermissionRequiredMixin, CreateView):
class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, TemplateView):
app_label = sapl.protocoloadm.apps.AppConfig.label
template_name = "materia/confirmar_proposicao.html"
form_class = ConfirmarProposicaoForm
permission_required = permissoes_protocoloadm()
def get_context_data(self, **kwargs):
context = super(ConfirmarProposicao, self).get_context_data(**kwargs)
@ -360,9 +358,14 @@ class ProposicaoCrud(Crud):
kwargs={'pk': kwargs['pk']}))
return super().post(self, request, *args, **kwargs)
class DetailView(BaseLocalMixin, Crud.DetailView):
class DetailView(Crud.DetailView):
layout_key = 'Proposicao'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['subnav_template_name'] = ''
return context
def get(self, request, *args, **kwargs):
action = request.GET.get('action', '')
@ -378,6 +381,10 @@ class ProposicaoCrud(Crud):
msg_error = _('Proposição já foi enviada e recebida.')
elif p.data_envio:
msg_error = _('Proposição já foi enviada.')
elif not p.texto_original and\
not p.texto_articulado.exists():
msg_error = _('Proposição não possui nenhum tipo de '
'Texto associado.')
else:
p.data_envio = datetime.now()
p.save()
@ -444,7 +451,25 @@ class ProposicaoCrud(Crud):
return False
return True
def get_success_url(self):
tipo_texto = self.request.POST.get('tipo_texto', '')
if tipo_texto == 'T':
messages.info(self.request,
_('Sempre que uma Proposição é inclusa ou '
'alterada e a opção "Texto Articulado " for '
'marcada, você será redirecionado para o '
'Texto Eletrônico. Use a opção "Editar Texto" '
'para construir seu texto.'))
return reverse('sapl.materia:proposicao_ta',
kwargs={'pk': self.object.pk})
else:
return Crud.UpdateView.get_success_url(self)
class CreateView(Crud.CreateView):
form_class = ProposicaoForm
layout_key = None
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@ -456,6 +481,12 @@ class ProposicaoCrud(Crud):
tipo_texto = self.request.POST.get('tipo_texto', '')
if tipo_texto == 'T':
messages.info(self.request,
_('Sempre que uma Proposição é inclusa ou '
'alterada e a opção "Texto Articulado " for '
'marcada, você será redirecionado para o '
'Texto Eletrônico. Use a opção "Editar Texto" '
'para construir seu texto.'))
return reverse('sapl.materia:proposicao_ta',
kwargs={'pk': self.object.pk})
else:

2
sapl/templates/compilacao/textoarticulado_detail.html

@ -74,7 +74,6 @@
</div>
</div>
</div>
{% comment %}
<div class="row">
<div class="col-md-12">
<div id="div_id_ementa" class="holder">
@ -83,7 +82,6 @@
</div>
</div>
</div>
{% endcomment %}
</fieldset>
{% endblock detail_content %}
{% endblock base_content %}

55
sapl/templates/crud/detail.html

@ -5,31 +5,38 @@
<div class="context-actions clearfix">
{% block actions %}
<div class="actions btn-group btn-group-sm" role="group">
{% if view.list_url %}
<a href="{{ view.list_url }}" class="btn btn-default">{% trans 'Listar' %} {{view.verbose_name_plural}}</a>
{% endif %}
{% if view.search_url %}
<a href="{{ view.search_url }}" class="btn btn-default">{% trans 'Fazer Nova Pesquisa' %}</a>
{% endif %}
{% if view.create_url %}
<a href="{{ view.create_url }}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Adicionar {{ verbose_name }} {% endblocktrans %}
</a>
{% endif %}
{% block sub_actions %}
<div class="actions btn-group btn-group-sm" role="group">
{% if view.list_url %}
<a href="{{ view.list_url }}" class="btn btn-default">{% trans 'Listar' %} {{view.verbose_name_plural}}</a>
{% endif %}
{% if view.search_url %}
<a href="{{ view.search_url }}" class="btn btn-default">{% trans 'Fazer Nova Pesquisa' %}</a>
{% endif %}
{% if view.create_url %}
<a href="{{ view.create_url }}" class="btn btn-default">
{% blocktrans with verbose_name=view.verbose_name %} Adicionar {{ verbose_name }} {% endblocktrans %}
</a>
{% endif %}
</div>
{% endblock sub_actions %}
<div class="editons pull-right">
{% block editions %}
{% if view.update_url or view.delete_url %}
<div class="actions btn-group" role="group">
{% if view.update_url %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar' %}</a>
{% endif %}
{% if view.delete_url %}
<a href="{{ view.delete_url }}" class="btn btn-default btn-excluir">{% trans 'Excluir' %}</a>
{% endif %}
</div>
{% endif %}
{% endblock %}
</div>
{% block editions %}
{% if view.update_url or view.delete_url %}
<div class="actions btn-group pull-right" role="group">
{% if view.update_url %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar' %}</a>
{% endif %}
{% if view.delete_url %}
<a href="{{ view.delete_url }}" class="btn btn-default btn-excluir">{% trans 'Excluir' %}</a>
{% endif %}
</div>
{% endif %}
{% endblock %}
{% endblock actions %}
</div>

36
sapl/templates/materia/proposicao_detail.html

@ -2,29 +2,39 @@
{% load i18n %}
{% load common_tags %}
{% block sub_actions %}{{block.super}}
{% endblock sub_actions%}
{% block editions %}
<div class="actions btn-group pull-right" role="group">
{% if proposicao.data_envio %}
{% if proposicao.data_envio %}
<div class="actions btn-group btn-group-sm" role="group">
{% if proposicao.texto_articulado.exists %}
<a class="btn btn-success" href="{% url 'sapl.materia:proposicao_ta' proposicao.pk%}">{% trans "Texto Eletrônico" %}</a>
{% endif %}
{% if proposicao.texto_original %}
<a class="btn btn-success" href="{{ proposicao.texto_original.url }}">{% trans "Texto Original" %}</a>
{% endif %}
</div>
<div class="actions btn-group" role="group">
{% if not object.data_recebimento %}
<a class="btn btn-default" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes')">{% trans "Recibo de Envio" %}</a>
<a href="{{ view.detail_url }}?action=return" class="btn btn-default btn-excluir">{% trans 'Retornar Proposição Enviada' %}</a>
{% else %}
<a class="btn btn-default" onclick="window.open('{% url 'sapl.materia:recibo-proposicao' object.pk %}','Recibo','width=1100, height=600, scrollbars=yes')">{% trans "Homologação do Protocolo" %}</a>
{% endif %}
</div>
{% else %}
<a href="{{ view.detail_url }}?action=send" class="btn btn-default">{% trans 'Enviar' %}</a>
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar' %}</a>
<a href="{{ view.delete_url }}" class="btn btn-default btn-excluir">{% trans 'Excluir' %}</a>
{% else %}
<div class="actions btn-group" role="group">
<a href="{{ view.detail_url }}?action=send" class="btn btn-primary">{% trans 'Enviar' %}</a>
</div>
<div class="actions btn-group" role="group">
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar' %}</a>
<a href="{{ view.delete_url }}" class="btn btn-default btn-excluir">{% trans 'Excluir' %}</a>
</div>
{% endif %}
{% endif %}
</div>
{% endblock editions %}
{% block extra_msg %}
{% if proposicao.data_envio and not proposicao.data_recebimento %}
<b><p align="center"></p></b>
{% endif %}
{% endblock extra_msg %}

Loading…
Cancel
Save