diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index e9467d9fd..bcda7725f 100644 --- a/sapl/materia/forms.py +++ b/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): diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 68d0da596..80342941b 100644 --- a/sapl/materia/models.py +++ b/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!!! diff --git a/sapl/materia/views.py b/sapl/materia/views.py index d7354123e..0c884465f 100644 --- a/sapl/materia/views.py +++ b/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: diff --git a/sapl/templates/compilacao/textoarticulado_detail.html b/sapl/templates/compilacao/textoarticulado_detail.html index 9c10aaf57..7acb4a0b1 100644 --- a/sapl/templates/compilacao/textoarticulado_detail.html +++ b/sapl/templates/compilacao/textoarticulado_detail.html @@ -74,7 +74,6 @@ - {% comment %}