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
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):
tipo_readonly = forms.CharField(
@ -1195,9 +1273,6 @@ class ConfirmarProposicaoForm(ProposicaoForm):
required=False, widget=widgets.TextInput(
attrs={'readonly': 'readonly'}))
justificativa_devolucao = forms.CharField(
required=False, widget=widgets.Textarea(attrs={'rows': 5}))
regime_tramitacao = forms.ModelChoiceField(
required=False, queryset=RegimeTramitacao.objects.all())
@ -1216,7 +1291,6 @@ class ConfirmarProposicaoForm(ProposicaoForm):
fields = [
'data_envio',
'descricao',
'justificativa_devolucao',
'gerar_protocolo',
'numero_de_paginas'
]
@ -1306,27 +1380,13 @@ class ConfirmarProposicaoForm(ProposicaoForm):
itens_incorporacao.append(
to_column(
(form_actions(label=_('Incorporar'),
name='incorporar',
disabled=False), 12)
name='incorporar'), 12)
)
)
fields.append(
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.layout = Layout(*fields)
@ -1356,34 +1416,23 @@ class ConfirmarProposicaoForm(ProposicaoForm):
raise ValidationError("A sequência de numeração (por ano ou geral)"
" não foi configurada para a aplicação em "
"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(
) == TipoDocumento and not cd['materia_de_vinculo']:
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(
_('Documentos não podem ser incorporados sem definir '
'para qual Matéria Legislativa ele se destina.'))
_('Regime de Tramitação deve ser informado.'))
elif 'devolver' in self.data:
cd = self.cleaned_data
elif self.instance.tipo.content_type.model_class(
) == 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(
_('Dados de Confirmação invalidos.'))
_('Documentos não podem ser incorporados sem definir '
'para qual Matéria Legislativa ele se destina.'))
return cd
@transaction.atomic
@ -1391,37 +1440,16 @@ class ConfirmarProposicaoForm(ProposicaoForm):
# TODO Implementar workflow entre protocolo e autores
cd = self.cleaned_data
if 'devolver' in self.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
self.instance.justificativa_devolucao = ''
self.instance.data_devolucao = None
self.instance.data_recebimento = timezone.now()
self.instance.materia_de_vinculo = cd['materia_de_vinculo']
elif 'incorporar' in self.data:
self.instance.justificativa_devolucao = ''
self.instance.data_devolucao = None
self.instance.data_recebimento = timezone.now()
self.instance.materia_de_vinculo = cd['materia_de_vinculo']
if self.instance.texto_articulado.exists():
ta = self.instance.texto_articulado.first()
ta.privacidade = STATUS_TA_IMMUTABLE_PUBLIC
ta.editing_locked = True
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()

30
sapl/materia/views.py

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

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 %}
{% block base_content %}
@ -17,8 +17,9 @@
</div>
{% endblock actions%}
</div>
<br>
{{block.super}}
{% for f in form %}
{% crispy f %}
{% endfor %}
{% endblock %}

Loading…
Cancel
Save