Browse Source

separa o form de incorp e devol de proposições

pull/1642/head
LeandroRoberto 7 years ago
parent
commit
53b9b932e2
  1. 170
      sapl/materia/forms.py
  2. 30
      sapl/materia/views.py
  3. 9
      sapl/templates/materia/confirmar_proposicao.html

170
sapl/materia/forms.py

@ -1183,6 +1183,84 @@ class ProposicaoForm(forms.ModelForm):
return inst return inst
class DevolverProposicaoForm(ProposicaoForm):
justificativa_devolucao = forms.CharField(
required=False, widget=widgets.Textarea(attrs={'rows': 5}))
class Meta:
model = Proposicao
fields = [
'justificativa_devolucao',
]
def __init__(self, *args, **kwargs):
# esta chamada isola o __init__ de ProposicaoForm
super(ProposicaoForm, self).__init__(*args, **kwargs)
fields = []
fields.append(
Fieldset(
_('Registro de Devolução'),
to_column(('justificativa_devolucao', 12)),
to_column(
(form_actions(label=_('Devolver'),
name='devolver',
css_class='btn-danger pull-right'), 12)
)
)
)
self.helper = FormHelper()
self.helper.layout = Layout(*fields)
def clean(self):
super(DevolverProposicaoForm, self).clean()
numeracao = sapl.base.models.AppConfig.attr('sequencia_numeracao')
if not numeracao:
raise ValidationError("A sequência de numeração (por ano ou geral)"
" não foi configurada para a aplicação em "
"tabelas auxiliares")
cd = ProposicaoForm.clean(self)
cd = self.cleaned_data
if 'justificativa_devolucao' not in cd or\
not cd['justificativa_devolucao']:
# TODO Implementar notificação ao autor por email
raise ValidationError(
_('Adicione uma Justificativa para devolução.'))
return cd
@transaction.atomic
def save(self, commit=False):
# TODO Implementar workflow entre protocolo e autores
cd = self.cleaned_data
self.instance.data_devolucao = timezone.now()
self.instance.data_recebimento = None
self.instance.data_envio = None
self.instance.save()
if self.instance.texto_articulado.exists():
ta = self.instance.texto_articulado.first()
ta.privacidade = STATUS_TA_PRIVATE
ta.editing_locked = False
ta.save()
self.instance.results = {
'messages': {
'success': [_('Devolução efetuada com sucesso.'), ]
},
'url': reverse('sapl.materia:receber-proposicao')
}
return self.instance
class ConfirmarProposicaoForm(ProposicaoForm): class ConfirmarProposicaoForm(ProposicaoForm):
tipo_readonly = forms.CharField( tipo_readonly = forms.CharField(
@ -1195,9 +1273,6 @@ class ConfirmarProposicaoForm(ProposicaoForm):
required=False, widget=widgets.TextInput( required=False, widget=widgets.TextInput(
attrs={'readonly': 'readonly'})) attrs={'readonly': 'readonly'}))
justificativa_devolucao = forms.CharField(
required=False, widget=widgets.Textarea(attrs={'rows': 5}))
regime_tramitacao = forms.ModelChoiceField( regime_tramitacao = forms.ModelChoiceField(
required=False, queryset=RegimeTramitacao.objects.all()) required=False, queryset=RegimeTramitacao.objects.all())
@ -1216,7 +1291,6 @@ class ConfirmarProposicaoForm(ProposicaoForm):
fields = [ fields = [
'data_envio', 'data_envio',
'descricao', 'descricao',
'justificativa_devolucao',
'gerar_protocolo', 'gerar_protocolo',
'numero_de_paginas' 'numero_de_paginas'
] ]
@ -1306,27 +1380,13 @@ class ConfirmarProposicaoForm(ProposicaoForm):
itens_incorporacao.append( itens_incorporacao.append(
to_column( to_column(
(form_actions(label=_('Incorporar'), (form_actions(label=_('Incorporar'),
name='incorporar', name='incorporar'), 12)
disabled=False), 12)
) )
) )
fields.append( fields.append(
Fieldset(_('Registro de Incorporação'), *itens_incorporacao)) Fieldset(_('Registro de Incorporação'), *itens_incorporacao))
fields.append(
Fieldset(
_('Registro de Devolução'),
to_column(('justificativa_devolucao', 12)),
to_column(
(form_actions(label=_('Devolver'),
name='devolver',
disabled=False,
css_class='btn-danger pull-right'), 12)
)
)
)
self.helper = FormHelper() self.helper = FormHelper()
self.helper.layout = Layout(*fields) self.helper.layout = Layout(*fields)
@ -1356,34 +1416,23 @@ class ConfirmarProposicaoForm(ProposicaoForm):
raise ValidationError("A sequência de numeração (por ano ou geral)" raise ValidationError("A sequência de numeração (por ano ou geral)"
" não foi configurada para a aplicação em " " não foi configurada para a aplicação em "
"tabelas auxiliares") "tabelas auxiliares")
if 'incorporar' in self.data:
cd = ProposicaoForm.clean(self)
if self.instance.tipo.content_type.model_class() ==\
TipoMateriaLegislativa:
if 'regime_tramitacao' not in cd or\
not cd['regime_tramitacao']:
raise ValidationError(
_('Regime de Tramitação deve ser informado.'))
elif self.instance.tipo.content_type.model_class( cd = ProposicaoForm.clean(self)
) == TipoDocumento and not cd['materia_de_vinculo']:
if self.instance.tipo.content_type.model_class() ==\
TipoMateriaLegislativa:
if 'regime_tramitacao' not in cd or\
not cd['regime_tramitacao']:
raise ValidationError( raise ValidationError(
_('Documentos não podem ser incorporados sem definir ' _('Regime de Tramitação deve ser informado.'))
'para qual Matéria Legislativa ele se destina.'))
elif 'devolver' in self.data: elif self.instance.tipo.content_type.model_class(
cd = self.cleaned_data ) == TipoDocumento and not cd['materia_de_vinculo']:
if 'justificativa_devolucao' not in cd or\
not cd['justificativa_devolucao']:
# TODO Implementar notificação ao autor por email
raise ValidationError(
_('Adicione uma Justificativa para devolução.'))
else:
raise ValidationError( raise ValidationError(
_('Dados de Confirmação invalidos.')) _('Documentos não podem ser incorporados sem definir '
'para qual Matéria Legislativa ele se destina.'))
return cd return cd
@transaction.atomic @transaction.atomic
@ -1391,37 +1440,16 @@ class ConfirmarProposicaoForm(ProposicaoForm):
# TODO Implementar workflow entre protocolo e autores # TODO Implementar workflow entre protocolo e autores
cd = self.cleaned_data cd = self.cleaned_data
if 'devolver' in self.data: self.instance.justificativa_devolucao = ''
self.instance.data_devolucao = timezone.now() self.instance.data_devolucao = None
self.instance.data_recebimento = None self.instance.data_recebimento = timezone.now()
self.instance.data_envio = None self.instance.materia_de_vinculo = cd['materia_de_vinculo']
self.instance.save()
if self.instance.texto_articulado.exists():
ta = self.instance.texto_articulado.first()
ta.privacidade = STATUS_TA_PRIVATE
ta.editing_locked = False
ta.save()
self.instance.results = {
'messages': {
'success': [_('Devolução efetuada com sucesso.'), ]
},
'url': reverse('sapl.materia:receber-proposicao')
}
return self.instance
elif 'incorporar' in self.data: if self.instance.texto_articulado.exists():
self.instance.justificativa_devolucao = '' ta = self.instance.texto_articulado.first()
self.instance.data_devolucao = None ta.privacidade = STATUS_TA_IMMUTABLE_PUBLIC
self.instance.data_recebimento = timezone.now() ta.editing_locked = True
self.instance.materia_de_vinculo = cd['materia_de_vinculo'] ta.save()
if self.instance.texto_articulado.exists():
ta = self.instance.texto_articulado.first()
ta.privacidade = STATUS_TA_IMMUTABLE_PUBLIC
ta.editing_locked = True
ta.save()
self.instance.save() self.instance.save()

30
sapl/materia/views.py

@ -2,7 +2,6 @@ from datetime import datetime
from random import choice from random import choice
from string import ascii_letters, digits from string import ascii_letters, digits
import weasyprint
from crispy_forms.helper import FormHelper from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML from crispy_forms.layout import HTML
from django.contrib import messages from django.contrib import messages
@ -20,8 +19,8 @@ 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.views.generic.edit import FormView
from django_filters.views import FilterView from django_filters.views import FilterView
import weasyprint
import sapl
from sapl.base.models import Autor, CasaLegislativa from sapl.base.models import Autor, CasaLegislativa
from sapl.comissoes.models import Comissao, Participacao from sapl.comissoes.models import Comissao, Participacao
from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT, from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_RESTRICT,
@ -36,12 +35,15 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm,
AutoriaMultiCreateForm, AutoriaMultiCreateForm,
ConfirmarProposicaoForm, LegislacaoCitadaForm, ConfirmarProposicaoForm, LegislacaoCitadaForm,
ProposicaoForm, TipoProposicaoForm, ProposicaoForm, TipoProposicaoForm,
TramitacaoForm, TramitacaoUpdateForm) TramitacaoForm, TramitacaoUpdateForm,
DevolverProposicaoForm)
from sapl.norma.models import LegislacaoCitada from sapl.norma.models import LegislacaoCitada
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label, from sapl.utils import (TURNO_TRAMITACAO_CHOICES, YES_NO_CHOICES, autor_label,
autor_modal, gerar_hash_arquivo, get_base_url, autor_modal, gerar_hash_arquivo, get_base_url,
montar_row_autor, show_results_filter_set, get_mime_type_from_file_extension) montar_row_autor, show_results_filter_set, get_mime_type_from_file_extension)
import sapl
from .email_utils import do_envia_email_confirmacao from .email_utils import do_envia_email_confirmacao
from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm, from .forms import (AcessorioEmLoteFilterSet, AcompanhamentoMateriaForm,
AdicionarVariasAutoriasFilterSet, DespachoInicialForm, AdicionarVariasAutoriasFilterSet, DespachoInicialForm,
@ -61,6 +63,7 @@ from .models import (AcompanhamentoMateria, Anexada, AssuntoMateria, Autoria,
TipoProposicao, Tramitacao, UnidadeTramitacao) TipoProposicao, Tramitacao, UnidadeTramitacao)
from .signals import tramitacao_signal from .signals import tramitacao_signal
AssuntoMateriaCrud = Crud.build(AssuntoMateria, 'assunto_materia') AssuntoMateriaCrud = Crud.build(AssuntoMateria, 'assunto_materia')
OrigemCrud = Crud.build(Origem, '') OrigemCrud = Crud.build(Origem, '')
@ -469,7 +472,7 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView):
app_label = sapl.protocoloadm.apps.AppConfig.label app_label = sapl.protocoloadm.apps.AppConfig.label
template_name = "materia/confirmar_proposicao.html" template_name = "materia/confirmar_proposicao.html"
model = Proposicao model = Proposicao
form_class = ConfirmarProposicaoForm form_class = ConfirmarProposicaoForm, DevolverProposicaoForm
def get_success_url(self): def get_success_url(self):
msgs = self.object.results['messages'] msgs = self.object.results['messages']
@ -491,11 +494,9 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView):
data_envio__isnull=False, data_envio__isnull=False,
data_recebimento__isnull=True) data_recebimento__isnull=True)
self.object = None self.object = None
# FIXME implementar hash para texto eletrônico
if proposicao.texto_articulado.exists(): if proposicao.texto_articulado.exists():
ta = proposicao.texto_articulado.first() ta = proposicao.texto_articulado.first()
# FIXME hash para textos articulados
hasher = 'P' + ta.hash() + '/' + str(proposicao.id) hasher = 'P' + ta.hash() + '/' + str(proposicao.id)
else: else:
hasher = gerar_hash_arquivo( hasher = gerar_hash_arquivo(
@ -517,6 +518,21 @@ class ConfirmarProposicao(PermissionRequiredForAppCrudMixin, UpdateView):
context['subnav_template_name'] = '' context['subnav_template_name'] = ''
return context return context
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
if self.request.POST:
if 'justificativa_devolucao' in self.request.POST:
return form_class[1](**self.get_form_kwargs())
else:
return form_class[0](**self.get_form_kwargs())
else:
forms = []
for form in form_class:
forms.append(form(**self.get_form_kwargs()))
return forms
class UnidadeTramitacaoCrud(CrudAux): class UnidadeTramitacaoCrud(CrudAux):
model = UnidadeTramitacao model = UnidadeTramitacao
@ -896,7 +912,7 @@ class RelatoriaCrud(MasterDetailCrud):
composicao=composicao) composicao=composicao)
parlamentares = [[p.parlamentar.id, p.parlamentar.nome_parlamentar] for parlamentares = [[p.parlamentar.id, p.parlamentar.nome_parlamentar] for
p in participacao if p.titular] p in participacao if p.titular]
context['form'].fields['parlamentar'].choices = parlamentares context['form'].fields['parlamentar'].choices = parlamentares

9
sapl/templates/materia/confirmar_proposicao.html

@ -1,4 +1,4 @@
{% extends "materia/proposicao_form.html" %} {% extends "base.html" %}
{% load i18n crispy_forms_tags common_tags %} {% load i18n crispy_forms_tags common_tags %}
{% block base_content %} {% block base_content %}
@ -17,8 +17,9 @@
</div> </div>
{% endblock actions%} {% endblock actions%}
</div> </div>
<br>
{{block.super}}
{% for f in form %}
{% crispy f %}
{% endfor %}
{% endblock %} {% endblock %}

Loading…
Cancel
Save