From 53b9b932e296973121e960d49eacfda137031383 Mon Sep 17 00:00:00 2001 From: LeandroRoberto Date: Mon, 11 Dec 2017 17:18:00 -0200 Subject: [PATCH] =?UTF-8?q?separa=20o=20form=20de=20incorp=20e=20devol=20d?= =?UTF-8?q?e=20proposi=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sapl/materia/forms.py | 170 ++++++++++-------- sapl/materia/views.py | 30 +++- .../materia/confirmar_proposicao.html | 9 +- 3 files changed, 127 insertions(+), 82 deletions(-) diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 3f5ad4869..bb4b64706 100644 --- a/sapl/materia/forms.py +++ b/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() diff --git a/sapl/materia/views.py b/sapl/materia/views.py index f123a57c3..df26a31ca 100644 --- a/sapl/materia/views.py +++ b/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 diff --git a/sapl/templates/materia/confirmar_proposicao.html b/sapl/templates/materia/confirmar_proposicao.html index 0c66c1f0a..f3193aeec 100644 --- a/sapl/templates/materia/confirmar_proposicao.html +++ b/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 @@ {% endblock actions%} -
- -{{block.super}} + {% for f in form %} + {% crispy f %} + {% endfor %} + {% endblock %}