Browse Source

Add botões de texto em proposições

pull/752/head
LeandroRoberto 9 years ago
parent
commit
de69f00d9e
  1. 18
      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. 9
      sapl/templates/crud/detail.html
  6. 32
      sapl/templates/materia/proposicao_detail.html

18
sapl/materia/forms.py

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

3
sapl/materia/models.py

@ -3,6 +3,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey,\
GenericRelation GenericRelation
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db import models from django.db import models
from django.db.models.deletion import PROTECT
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from model_utils import Choices from model_utils import Choices
@ -452,7 +453,7 @@ class Parecer(models.Model):
class Proposicao(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')) tipo = models.ForeignKey(TipoProposicao, verbose_name=_('Tipo'))
# XXX data_envio was not null, but actual data said otherwise!!! # 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.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView, UpdateView from django.views.generic import CreateView, ListView, TemplateView, UpdateView
from django.views.generic.base import RedirectView from django.views.generic.base import RedirectView
from django.views.generic.edit import FormView
from django_filters.views import FilterView 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.compilacao.views import IntegracaoTaView
from sapl.crispy_layout_mixin import SaplFormLayout, form_actions from sapl.crispy_layout_mixin import SaplFormLayout, form_actions
from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, from sapl.crud.base import (ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL,
ACTION_LIST, ACTION_UPDATE, RP_DETAIL, RP_LIST, ACTION_LIST, ACTION_UPDATE, RP_DETAIL, RP_LIST,
Crud, CrudAux, CrudDetailView, MasterDetailCrud, Crud, CrudAux, CrudDetailView, MasterDetailCrud,
make_pagination) make_pagination, PermissionRequiredForAppCrudMixin)
from sapl.materia import apps from sapl.materia import apps
from sapl.materia.forms import AnexadaForm, LegislacaoCitadaForm,\ from sapl.materia.forms import AnexadaForm, LegislacaoCitadaForm,\
TipoProposicaoForm, ProposicaoForm TipoProposicaoForm, ProposicaoForm
@ -39,9 +40,10 @@ from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label,
permissoes_autor, permissoes_materia, permissoes_autor, permissoes_materia,
permissoes_protocoloadm, permission_required_for_app, permissoes_protocoloadm, permission_required_for_app,
montar_row_autor) montar_row_autor)
import sapl
from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
ConfirmarProposicaoForm, DocumentoAcessorioForm, DocumentoAcessorioForm,
MateriaLegislativaFilterSet, MateriaLegislativaFilterSet,
PrimeiraTramitacaoEmLoteFilterSet, ProposicaoOldForm, PrimeiraTramitacaoEmLoteFilterSet, ProposicaoOldForm,
ReceberProposicaoForm, TramitacaoEmLoteFilterSet, ReceberProposicaoForm, TramitacaoEmLoteFilterSet,
@ -81,7 +83,7 @@ class MateriaTaView(IntegracaoTaView):
este get foi implementado para tratar uma prerrogativa externa este get foi implementado para tratar uma prerrogativa externa
de usuário. 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) return IntegracaoTaView.get(self, request, *args, **kwargs)
else: else:
return self.get_redirect_deactivated() return self.get_redirect_deactivated()
@ -90,6 +92,9 @@ class MateriaTaView(IntegracaoTaView):
class ProposicaoTaView(IntegracaoTaView): class ProposicaoTaView(IntegracaoTaView):
model = Proposicao model = Proposicao
model_type_foreignkey = TipoProposicao model_type_foreignkey = TipoProposicao
# TODO implmentar o mapa de fields e utiliza-lo em IntegracaoTaView
fields = {
}
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
""" """
@ -97,7 +102,7 @@ class ProposicaoTaView(IntegracaoTaView):
este get foi implementado para tratar uma prerrogativa externa este get foi implementado para tratar uma prerrogativa externa
de usuário. 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) return IntegracaoTaView.get(self, request, *args, **kwargs)
else: else:
return self.get_redirect_deactivated() return self.get_redirect_deactivated()
@ -250,17 +255,13 @@ class ProposicaoRecebida(PermissionRequiredMixin, ListView):
return context return context
class ReceberProposicao(PermissionRequiredMixin, CreateView): class ReceberProposicao(PermissionRequiredForAppCrudMixin, FormView):
app_label = sapl.protocoloadm.apps.AppConfig.label
template_name = "materia/receber_proposicao.html" template_name = "materia/receber_proposicao.html"
form_class = ReceberProposicaoForm 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): def post(self, request, *args, **kwargs):
form = ReceberProposicaoForm(request.POST) form = ReceberProposicaoForm(request.POST)
if form.is_valid(): if form.is_valid():
@ -274,19 +275,16 @@ class ReceberProposicao(PermissionRequiredMixin, CreateView):
reverse('sapl.materia:proposicao-confirmar', reverse('sapl.materia:proposicao-confirmar',
kwargs={'pk': proposicao.pk})) kwargs={'pk': proposicao.pk}))
msg = 'Proposição não encontrada!' messages.error(request, _('Proposição não encontrada!'))
return self.render_to_response({'form': form, 'msg': msg}) return self.form_invalid(form)
else:
return self.render_to_response({'form': form})
def get_success_url(self): def get_success_url(self):
return reverse('sapl.materia:receber-proposicao') 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" template_name = "materia/confirmar_proposicao.html"
form_class = ConfirmarProposicaoForm
permission_required = permissoes_protocoloadm()
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(ConfirmarProposicao, self).get_context_data(**kwargs) context = super(ConfirmarProposicao, self).get_context_data(**kwargs)
@ -360,9 +358,14 @@ class ProposicaoCrud(Crud):
kwargs={'pk': kwargs['pk']})) kwargs={'pk': kwargs['pk']}))
return super().post(self, request, *args, **kwargs) return super().post(self, request, *args, **kwargs)
class DetailView(BaseLocalMixin, Crud.DetailView): class DetailView(Crud.DetailView):
layout_key = 'Proposicao' 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): def get(self, request, *args, **kwargs):
action = request.GET.get('action', '') action = request.GET.get('action', '')
@ -378,6 +381,10 @@ class ProposicaoCrud(Crud):
msg_error = _('Proposição já foi enviada e recebida.') msg_error = _('Proposição já foi enviada e recebida.')
elif p.data_envio: elif p.data_envio:
msg_error = _('Proposição já foi enviada.') 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: else:
p.data_envio = datetime.now() p.data_envio = datetime.now()
p.save() p.save()
@ -444,7 +451,25 @@ class ProposicaoCrud(Crud):
return False return False
return True 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): class CreateView(Crud.CreateView):
form_class = ProposicaoForm
layout_key = None
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
@ -456,6 +481,12 @@ class ProposicaoCrud(Crud):
tipo_texto = self.request.POST.get('tipo_texto', '') tipo_texto = self.request.POST.get('tipo_texto', '')
if tipo_texto == 'T': 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', return reverse('sapl.materia:proposicao_ta',
kwargs={'pk': self.object.pk}) kwargs={'pk': self.object.pk})
else: else:

2
sapl/templates/compilacao/textoarticulado_detail.html

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

9
sapl/templates/crud/detail.html

@ -5,6 +5,9 @@
<div class="context-actions clearfix"> <div class="context-actions clearfix">
{% block actions %} {% block actions %}
{% block sub_actions %}
<div class="actions btn-group btn-group-sm" role="group"> <div class="actions btn-group btn-group-sm" role="group">
{% if view.list_url %} {% if view.list_url %}
<a href="{{ view.list_url }}" class="btn btn-default">{% trans 'Listar' %} {{view.verbose_name_plural}}</a> <a href="{{ view.list_url }}" class="btn btn-default">{% trans 'Listar' %} {{view.verbose_name_plural}}</a>
@ -18,9 +21,12 @@
</a> </a>
{% endif %} {% endif %}
</div> </div>
{% endblock sub_actions %}
<div class="editons pull-right">
{% block editions %} {% block editions %}
{% if view.update_url or view.delete_url %} {% if view.update_url or view.delete_url %}
<div class="actions btn-group pull-right" role="group"> <div class="actions btn-group" role="group">
{% if view.update_url %} {% if view.update_url %}
<a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar' %}</a> <a href="{{ view.update_url }}" class="btn btn-default">{% trans 'Editar' %}</a>
{% endif %} {% endif %}
@ -30,6 +36,7 @@
</div> </div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
</div>
{% endblock actions %} {% endblock actions %}
</div> </div>

32
sapl/templates/materia/proposicao_detail.html

@ -2,29 +2,39 @@
{% load i18n %} {% load i18n %}
{% load common_tags %} {% load common_tags %}
{% block sub_actions %}{{block.super}}
{% endblock sub_actions%}
{% block editions %} {% 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 %} {% 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 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> <a href="{{ view.detail_url }}?action=return" class="btn btn-default btn-excluir">{% trans 'Retornar Proposição Enviada' %}</a>
{% else %} {% 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> <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 %} {% endif %}
</div>
{% else %} {% 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>
<div class="actions btn-group" role="group">
<a href="{{ view.detail_url }}?action=send" class="btn btn-primary">{% trans 'Enviar' %}</a>
</div>
{% endif %} <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> </div>
{% endblock editions %}
{% block extra_msg %}
{% if proposicao.data_envio and not proposicao.data_recebimento %}
<b><p align="center"></p></b>
{% endif %} {% endif %}
{% endblock extra_msg %}
{% endblock editions %}

Loading…
Cancel
Save