From 88c51ff09d6200afe9476126f46475775c6226b2 Mon Sep 17 00:00:00 2001 From: Cesar Augusto de Carvalho Date: Tue, 9 Jul 2019 12:17:01 -0300 Subject: [PATCH] =?UTF-8?q?Fix=20#1598=20-=20Adiciona=20checkbox=20na=20cr?= =?UTF-8?q?ia=C3=A7=C3=A3o=20de=20Despacho=20Inicial=20de=20Mat=C3=A9rias?= =?UTF-8?q?=20(#2876)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Multiplos despachos iniciais * Quase funcionando * Nova tentativa inserindo no Crud * HOT-FIX: autopep8 by IDE * HOT-FIX: autopep8 by IDE * Corrige detalhes do form e view para funcionamento * Remove código não utilizado e adiciona cancel_url --- sapl/materia/forms.py | 125 ++++++++++----- .../migrations/0051_auto_20190703_1414.py | 21 +++ sapl/materia/models.py | 2 +- sapl/materia/urls.py | 22 ++- sapl/materia/views.py | 151 ++++++++++++------ .../despachoinicial_multicreate_form.html | 7 + 6 files changed, 235 insertions(+), 93 deletions(-) create mode 100644 sapl/materia/migrations/0051_auto_20190703_1414.py create mode 100644 sapl/templates/materia/despachoinicial_multicreate_form.html diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 38f3b0182..d90d02d35 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -3,7 +3,7 @@ import logging import os from crispy_forms.bootstrap import Alert, InlineRadios -from crispy_forms.layout import (HTML, Button, Column, Div, Field, Fieldset, +from crispy_forms.layout import (HTML, Button, Field, Fieldset, Layout, Row) from django import forms from django.contrib.contenttypes.models import ContentType @@ -259,7 +259,7 @@ class MateriaLegislativaForm(FileFieldCheckMixin, ModelForm): materia = super(MateriaLegislativaForm, self).save(commit) materia.save() - + if self.cleaned_data['autor']: autoria = Autoria() autoria.primeiro_autor = primeiro_autor @@ -535,7 +535,8 @@ class TramitacaoForm(ModelForm): materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True materia.save() - tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + tramitar_anexadas = sapl.base.models.AppConfig.attr( + 'tramitacao_materia') if tramitar_anexadas: lista_tramitacao = [] anexadas_list = lista_anexados(materia) @@ -545,35 +546,38 @@ class TramitacaoForm(ModelForm): ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True ma.save() lista_tramitacao.append(Tramitacao( - status=tramitacao.status, - materia=ma, - data_tramitacao=tramitacao.data_tramitacao, - unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, - data_encaminhamento=tramitacao.data_encaminhamento, - unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, - urgente=tramitacao.urgente, - turno=tramitacao.turno, - texto=tramitacao.texto, - data_fim_prazo=tramitacao.data_fim_prazo, - user=tramitacao.user, - ip=tramitacao.ip - )) + status=tramitacao.status, + materia=ma, + data_tramitacao=tramitacao.data_tramitacao, + unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, + data_encaminhamento=tramitacao.data_encaminhamento, + unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, + urgente=tramitacao.urgente, + turno=tramitacao.turno, + texto=tramitacao.texto, + data_fim_prazo=tramitacao.data_fim_prazo, + user=tramitacao.user, + ip=tramitacao.ip + )) Tramitacao.objects.bulk_create(lista_tramitacao) return tramitacao -# Compara se os campos de duas tramitações são iguais, +# Compara se os campos de duas tramitações são iguais, # exceto os campos id, documento_id e timestamp def compara_tramitacoes_mat(tramitacao1, tramitacao2): if not tramitacao1 or not tramitacao2: return False lst_items = ['id', 'materia_id', 'timestamp'] - values = [(k,v) for k,v in tramitacao1.__dict__.items() if ((k not in lst_items) and (k[0] != '_'))] - other_values = [(k,v) for k,v in tramitacao2.__dict__.items() if (k not in lst_items and k[0] != '_')] + values = [(k, v) for k, v in tramitacao1.__dict__.items() + if ((k not in lst_items) and (k[0] != '_'))] + other_values = [(k, v) for k, v in tramitacao2.__dict__.items() + if (k not in lst_items and k[0] != '_')] return values == other_values + class TramitacaoUpdateForm(TramitacaoForm): unidade_tramitacao_local = forms.ModelChoiceField( queryset=UnidadeTramitacao.objects.all(), @@ -647,7 +651,8 @@ class TramitacaoUpdateForm(TramitacaoForm): materia.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True materia.save() - tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + tramitar_anexadas = sapl.base.models.AppConfig.attr( + 'tramitacao_materia') if tramitar_anexadas: anexadas_list = lista_anexados(materia) for ma in anexadas_list: @@ -670,6 +675,7 @@ class TramitacaoUpdateForm(TramitacaoForm): ma.save() return nova_tram_principal + class LegislacaoCitadaForm(ModelForm): tipo = forms.ModelChoiceField( @@ -843,8 +849,10 @@ class AnexadaForm(ModelForm): data_desanexacao = cleaned_data['data_desanexacao'] if cleaned_data['data_desanexacao'] else data_anexacao if data_anexacao > data_desanexacao: - self.logger.error("Data de anexação posterior à data de desanexação.") - raise ValidationError(_("Data de anexação posterior à data de desanexação.")) + self.logger.error( + "Data de anexação posterior à data de desanexação.") + raise ValidationError( + _("Data de anexação posterior à data de desanexação.")) try: self.logger.info("Tentando obter objeto MateriaLegislativa (numero={}, ano={}, tipo={})." @@ -873,9 +881,10 @@ class AnexadaForm(ModelForm): if is_anexada: self.logger.error("Matéria já se encontra anexada.") raise ValidationError(_('Matéria já se encontra anexada')) - + ciclico = False - anexadas_anexada = Anexada.objects.filter(materia_principal=materia_anexada) + anexadas_anexada = Anexada.objects.filter( + materia_principal=materia_anexada) while anexadas_anexada and not ciclico: anexadas = [] @@ -884,15 +893,17 @@ class AnexadaForm(ModelForm): if materia_principal == anexa.materia_anexada: ciclico = True - else: + else: for a in Anexada.objects.filter(materia_principal=anexa.materia_anexada): anexadas.append(a) anexadas_anexada = anexadas - + if ciclico: - self.logger.error("A matéria não pode ser anexada por uma de suas anexadas.") - raise ValidationError(_("A matéria não pode ser anexada por uma de suas anexadas.")) + self.logger.error( + "A matéria não pode ser anexada por uma de suas anexadas.") + raise ValidationError( + _("A matéria não pode ser anexada por uma de suas anexadas.")) cleaned_data['materia_anexada'] = materia_anexada @@ -1053,9 +1064,6 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet): HTML(autor_modal), row4, row6, row7, row9, form_actions(label=_('Pesquisar'))) - - - ) @property @@ -1114,9 +1122,50 @@ def filtra_tramitacao_destino_and_status(status, destino): 'materia_id', flat=True) +class DespachoInicialCreateForm(forms.Form): + comissao = forms.ModelMultipleChoiceField( + queryset=Comissao.objects.filter(ativa=True), + widget=forms.CheckboxSelectMultiple(), + label=Comissao._meta.verbose_name_plural) + + def __init__(self, *args, **kwargs): + row1 = to_row( + [('comissao', 12), ]) + + self.helper = SaplFormHelper() + self.helper.form_method = 'POST' + self.helper.layout = SaplFormLayout(row1) + super().__init__(*args, **kwargs) + + def clean(self): + super().clean() + + comissoes = self.cleaned_data.get('comissao') + if not comissoes: + msg = _('Você deve escolher pelo menos uma comissão.') + raise ValidationError(msg) + + if not self.is_valid(): + return self.cleaned_data + + errors = [] + for comissao in comissoes: + if DespachoInicial.objects.filter( + materia=self.initial['materia'], + comissao=comissao, + ).exists(): + msg = _('Já existe um Despacho cadastrado para %s' % + comissao) + errors.append(msg) + if errors: + raise ValidationError(errors) + + return self.cleaned_data + + class DespachoInicialForm(ModelForm): comissao = forms.ModelChoiceField( - queryset=Comissao.objects.filter(ativa=True)) + queryset=Comissao.objects.filter(ativa=True), label=_('Comissão')) class Meta: model = DespachoInicial @@ -1158,7 +1207,8 @@ class AutoriaForm(ModelForm): if 'initial' in kwargs and 'materia' in kwargs['initial']: materia = kwargs['initial']['materia'] - self.fields['primeiro_autor'].initial = Autoria.objects.filter(materia=materia).count() == 0 + self.fields['primeiro_autor'].initial = Autoria.objects.filter( + materia=materia).count() == 0 row1 = to_row([('tipo_autor', 4), ('autor', 4), @@ -1228,8 +1278,9 @@ class AutoriaMultiCreateForm(Form): super().__init__(*args, **kwargs) if 'initial' in kwargs and 'autores' in kwargs['initial']: - self.fields['primeiro_autor'].initial = kwargs['initial']['autores'].count() == 0 - + self.fields['primeiro_autor'].initial = kwargs['initial']['autores'].count( + ) == 0 + row1 = to_row([('tipo_autor', 10), ('primeiro_autor', 2)]) row2 = to_row([('autor', 12), ]) @@ -1938,7 +1989,7 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): ano=timezone.now().year).aggregate(Max('numero_proposicao')) numero__max = numero__max['numero_proposicao__max'] inst.numero_proposicao = ( - numero__max + 1) if numero__max else 1 + numero__max + 1) if numero__max else 1 self.gerar_hash(inst, receber_recibo) @@ -2036,7 +2087,7 @@ class ConfirmarProposicaoForm(ProposicaoForm): attrs={'readonly': 'readonly'})) regime_tramitacao = forms.ModelChoiceField(label="Regime de tramitação", - required=False, queryset=RegimeTramitacao.objects.all()) + required=False, queryset=RegimeTramitacao.objects.all()) gerar_protocolo = forms.ChoiceField( required=False, diff --git a/sapl/materia/migrations/0051_auto_20190703_1414.py b/sapl/materia/migrations/0051_auto_20190703_1414.py new file mode 100644 index 000000000..fad0e1933 --- /dev/null +++ b/sapl/materia/migrations/0051_auto_20190703_1414.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-07-03 17:14 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('materia', '0050_auto_20190521_1148'), + ] + + operations = [ + migrations.AlterField( + model_name='despachoinicial', + name='comissao', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='comissoes.Comissao', verbose_name='Comissão'), + ), + ] diff --git a/sapl/materia/models.py b/sapl/materia/models.py index 096aabc97..d9a5e344a 100644 --- a/sapl/materia/models.py +++ b/sapl/materia/models.py @@ -485,7 +485,7 @@ class AssuntoMateria(models.Model): @reversion.register() class DespachoInicial(models.Model): materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) - comissao = models.ForeignKey(Comissao, on_delete=models.CASCADE) + comissao = models.ForeignKey(Comissao, on_delete=models.CASCADE, verbose_name="Comissão") class Meta: verbose_name = _('Despacho Inicial') diff --git a/sapl/materia/urls.py b/sapl/materia/urls.py index 962dc2cff..2fe9145de 100644 --- a/sapl/materia/urls.py +++ b/sapl/materia/urls.py @@ -26,9 +26,11 @@ from sapl.materia.views import (AcompanhamentoConfirmarView, TramitacaoEmLoteView, UnidadeTramitacaoCrud, proposicao_texto, recuperar_materia, ExcluirTramitacaoEmLoteView, RetornarProposicao, - MateriaPesquisaSimplesView) + MateriaPesquisaSimplesView, + DespachoInicialMultiCreateView) from sapl.norma.views import NormaPesquisaSimplesView -from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView) +from sapl.protocoloadm.views import ( + FichaPesquisaAdmView, FichaSelecionaAdmView) from .apps import AppConfig @@ -55,13 +57,20 @@ urlpatterns_impressos = [ name='impressos_materia_pesquisa'), url(r'^materia/impressos/ficha-pesquisa-adm/$', FichaPesquisaAdmView.as_view(), - name= 'impressos_ficha_pesquisa_adm'), + name='impressos_ficha_pesquisa_adm'), url(r'^materia/impressos/ficha-seleciona-adm/$', FichaSelecionaAdmView.as_view(), - name= 'impressos_ficha_seleciona_adm'), + name='impressos_ficha_seleciona_adm'), ] urlpatterns_materia = [ + + # Esta customização substitui a url do crud desque que ela permaneça antes + # da inclusão das urls de DespachoInicialCrud + url(r'^materia/(?P\d+)/despachoinicial/create', + DespachoInicialMultiCreateView.as_view(), + name='despacho-inicial-multi'), + url(r'^materia/', include(MateriaLegislativaCrud.get_urls() + AnexadaCrud.get_urls() + AutoriaCrud.get_urls() + @@ -76,7 +85,8 @@ urlpatterns_materia = [ url(r'^materia/(?P[0-9]+)/create_simplificado$', CriarProtocoloMateriaView.as_view(), name='materia_create_simplificado'), - url(r'^materia/recuperar-materia', recuperar_materia, name='recuperar_materia'), + url(r'^materia/recuperar-materia', + recuperar_materia, name='recuperar_materia'), url(r'^materia/(?P[0-9]+)/ta$', MateriaTaView.as_view(), name='materia_ta'), @@ -96,6 +106,7 @@ urlpatterns_materia = [ AutoriaMultiCreateView.as_view(), name='autoria_multicreate'), + url(r'^materia/acessorio-em-lote', DocumentoAcessorioEmLoteView.as_view(), name='acessorio_em_lote'), url(r'^materia/(?P\d+)/anexada-em-lote', MateriaAnexadaEmLoteView.as_view(), @@ -136,6 +147,7 @@ urlpatterns_proposicao = [ name='proposicao_texto'), url(r'^proposicao/(?P\d+)/retornar', RetornarProposicao.as_view(), name='retornar-proposicao'), + ] urlpatterns_sistema = [ diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 0736de351..a22268545 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1,13 +1,11 @@ +from datetime import datetime +import itertools import logging import os -import shutil -import tempfile -import weasyprint -import itertools - -from datetime import datetime from random import choice +import shutil from string import ascii_letters, digits +import tempfile from crispy_forms.layout import HTML from django.conf import settings @@ -28,6 +26,7 @@ from django.views.generic.base import RedirectView from django.views.generic.edit import FormView from django_filters.views import FilterView import weasyprint +import weasyprint import sapl from sapl.base.email_utils import do_envia_email_confirmacao @@ -47,7 +46,8 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm, ConfirmarProposicaoForm, DevolverProposicaoForm, LegislacaoCitadaForm, OrgaoForm, ProposicaoForm, TipoProposicaoForm, - TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm) + TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm, + DespachoInicialCreateForm) from sapl.norma.models import LegislacaoCitada from sapl.parlamentares.models import Legislatura from sapl.protocoloadm.models import Protocolo @@ -1141,9 +1141,9 @@ class RelatoriaCrud(MasterDetailCrud): parlamentar = relatoria.parlamentar comissao = relatoria.comissao composicoes = [p.composicao for p in - Participacao.objects.filter( - parlamentar=parlamentar, - composicao__comissao=comissao)] + Participacao.objects.filter( + parlamentar=parlamentar, + composicao__comissao=comissao)] data_designacao = relatoria.data_designacao_relator composicao = '' for c in composicoes: @@ -1204,7 +1204,8 @@ class TramitacaoCrud(MasterDetailCrud): '-timestamp', '-id').first() - #TODO: Esta checagem foi inserida na issue #2027, mas é mesmo necessária? + # TODO: Esta checagem foi inserida na issue #2027, mas é mesmo + # necessária? if ultima_tramitacao: if ultima_tramitacao.unidade_tramitacao_destino: context['form'].fields[ @@ -1258,7 +1259,8 @@ class TramitacaoCrud(MasterDetailCrud): layout_key = 'TramitacaoUpdate' def form_valid(self, form): - dict_objeto_antigo = Tramitacao.objects.get(pk=self.kwargs['pk']).__dict__ + dict_objeto_antigo = Tramitacao.objects.get( + pk=self.kwargs['pk']).__dict__ self.object = form.save() dict_objeto_novo = self.object.__dict__ @@ -1270,7 +1272,8 @@ class TramitacaoCrud(MasterDetailCrud): 'data_encaminhamento', 'data_fim_prazo', 'urgente', 'turno' ] - # Se não houve qualquer alteração em um dos dados, mantém o usuário e ip + # Se não houve qualquer alteração em um dos dados, mantém o usuário + # e ip for atributo in atributos: if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]: self.object.user = user @@ -1313,7 +1316,7 @@ class TramitacaoCrud(MasterDetailCrud): materia = tramitacao.materia url = reverse('sapl.materia:tramitacao_list', kwargs={'pk': materia.id}) - + ultima_tramitacao = materia.tramitacao_set.order_by( '-data_tramitacao', '-timestamp', @@ -1332,7 +1335,8 @@ class TramitacaoCrud(MasterDetailCrud): if materia.tramitacao_set.count() == 0: materia.em_tramitacao = False materia.save() - tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') + tramitar_anexadas = sapl.base.models.AppConfig.attr( + 'tramitacao_materia') if tramitar_anexadas: mat_anexadas = lista_anexados(materia) for ma in mat_anexadas: @@ -1354,7 +1358,7 @@ class TramitacaoCrud(MasterDetailCrud): context = super().get_context_data(**kwargs) context['user'] = self.request.user return context - + def montar_helper_documento_acessorio(self): autor_row = montar_row_autor('autor') @@ -1485,10 +1489,51 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): autores_selecionados = form.cleaned_data['autor'] primeiro_autor = form.cleaned_data['primeiro_autor'] for autor in autores_selecionados: - Autoria.objects.create(materia=self.materia, autor=autor, primeiro_autor=primeiro_autor) + Autoria.objects.create(materia=self.materia, + autor=autor, primeiro_autor=primeiro_autor) + + return FormView.form_valid(self, form) + + +class DespachoInicialMultiCreateView(PermissionRequiredForAppCrudMixin, FormView): + app_label = sapl.materia.apps.AppConfig.label + form_class = DespachoInicialCreateForm + template_name = 'materia/despachoinicial_multicreate_form.html' + + def get_initial(self): + initial = super().get_initial() + self.materia = MateriaLegislativa.objects.get(id=self.kwargs['pk']) + initial['materia'] = self.materia + return initial + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['title'] = '%s (%s)' % ( + _('Adicionar Vários Despachos'), self.materia) + context['root_pk'] = self.kwargs['pk'] + context['subnav_template_name'] = 'materia/subnav.yaml' + return context + + def get_success_url(self): + messages.add_message( + self.request, messages.SUCCESS, + _('Despachos adicionados com sucesso.')) + return reverse( + 'sapl.materia:despachoinicial_list', kwargs={'pk': self.materia.pk}) + + def form_valid(self, form): + comissoes_selecionadas = form.cleaned_data['comissao'] + for comissao in comissoes_selecionadas: + DespachoInicial.objects.create( + materia=self.materia, comissao=comissao) return FormView.form_valid(self, form) + @property + def cancel_url(self): + return reverse( + 'sapl.materia:despachoinicial_list', kwargs={'pk': self.materia.pk}) + class DespachoInicialCrud(MasterDetailCrud): model = DespachoInicial @@ -1496,9 +1541,6 @@ class DespachoInicialCrud(MasterDetailCrud): help_topic = 'despacho_autoria' public = [RP_LIST, RP_DETAIL] - class CreateView(MasterDetailCrud.CreateView): - form_class = DespachoInicialForm - class UpdateView(MasterDetailCrud.UpdateView): form_class = DespachoInicialForm @@ -1640,7 +1682,7 @@ class MateriaLegislativaCrud(Crud): dict_objeto_antigo = MateriaLegislativa.objects.get( pk=self.kwargs['pk'] ).__dict__ - + self.object = form.save() dict_objeto_novo = self.object.__dict__ @@ -1648,7 +1690,7 @@ class MateriaLegislativaCrud(Crud): 'tipo_id', 'ano', 'numero', 'data_apresentacao', 'numero_protocolo', 'tipo_apresentacao', 'texto_original', 'apelido', 'dias_prazo', 'polemica', 'objeto', 'regime_tramitacao_id', 'em_tramitacao', 'data_fim_prazo', - 'data_publicacao', 'complementar', 'tipo_origem_externa_id', + 'data_publicacao', 'complementar', 'tipo_origem_externa_id', 'numero_origem_externa', 'ano_origem_externa', 'local_origem_externa_id', 'data_origem_externa', 'ementa', 'indexacao', 'observacao' ] @@ -1665,7 +1707,7 @@ class MateriaLegislativaCrud(Crud): anexadas = lista_anexados(materia) for anexada in anexadas: - anexada.em_tramitacao = True if form.instance.em_tramitacao else False + anexada.em_tramitacao = True if form.instance.em_tramitacao else False anexada.save() return super().form_valid(form) @@ -1687,7 +1729,8 @@ class MateriaLegislativaCrud(Crud): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['user'] = self.request.user - context['materia'] = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) + context['materia'] = MateriaLegislativa.objects.get( + pk=self.kwargs['pk']) return context class ListView(Crud.ListView, RedirectView): @@ -2074,20 +2117,22 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): msg = _('Autor tem que ter menos do que 50 caracteres.') messages.add_message(request, messages.ERROR, msg) return self.get(request, self.kwargs) - + tmp_name = os.path.join(MEDIA_ROOT, request.FILES['arquivo'].name) with open(tmp_name, 'wb') as destination: for chunk in request.FILES['arquivo'].chunks(): destination.write(chunk) try: doc_data = tz.localize(datetime.strptime( - request.POST['data'], "%d/%m/%Y")) + request.POST['data'], "%d/%m/%Y")) except Exception as e: - msg = _('Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.') - messages.add_message(request, messages.ERROR, msg) - self.logger.error("User={}. {}. Data inserida: {}".format(username, str(msg), request.POST['data'])) - os.remove(tmp_name) - return self.get(request, self.kwargs) + msg = _( + 'Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.') + messages.add_message(request, messages.ERROR, msg) + self.logger.error("User={}. {}. Data inserida: {}".format( + username, str(msg), request.POST['data'])) + os.remove(tmp_name) + return self.get(request, self.kwargs) for materia_id in marcadas: doc = DocumentoAcessorio() @@ -2101,25 +2146,27 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): try: doc.clean_fields() except ValidationError as e: - for m in [ '%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, '
'.join(v)) - for k,v in e.message_dict.items() ]: + for m in ['%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, '
'.join(v)) + for k, v in e.message_dict.items()]: # Insere as mensagens de erro no formato: # 'verbose_name do nome do campo': 'mensagem de erro' messages.add_message(request, messages.ERROR, m) - self.logger.error("User={}. {}. Nome do arquivo: {}.".format(username, str(msg), request.FILES['arquivo'].name)) + self.logger.error("User={}. {}. Nome do arquivo: {}.".format( + username, str(msg), request.FILES['arquivo'].name)) os.remove(tmp_name) return self.get(request, self.kwargs) doc.save() - diretorio = os.path.join(MEDIA_ROOT, - 'sapl/public/documentoacessorio', - str(doc_data.year), - str(doc.id)) + diretorio = os.path.join(MEDIA_ROOT, + 'sapl/public/documentoacessorio', + str(doc_data.year), + str(doc.id)) if not os.path.exists(diretorio): os.makedirs(diretorio) - file_path = os.path.join(diretorio, + file_path = os.path.join(diretorio, request.FILES['arquivo'].name) shutil.copy2(tmp_name, file_path) - doc.arquivo.name = file_path.split(MEDIA_ROOT + "/")[1] # Retira MEDIA_ROOT do nome + doc.arquivo.name = file_path.split( + MEDIA_ROOT + "/")[1] # Retira MEDIA_ROOT do nome doc.save() os.remove(tmp_name) @@ -2145,17 +2192,17 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): # Verifica se os campos foram preenchidos if not self.request.GET.get('tipo', " "): - msg =_('Por favor, selecione um tipo de matéria.') + msg = _('Por favor, selecione um tipo de matéria.') messages.add_message(self.request, messages.ERROR, msg) if not self.request.GET.get('data_apresentacao_0', " ") or not self.request.GET.get('data_apresentacao_1', " "): - msg =_('Por favor, preencha as datas.') + msg = _('Por favor, preencha as datas.') messages.add_message(self.request, messages.ERROR, msg) return context if not self.request.GET.get('data_apresentacao_0', " ") or not self.request.GET.get('data_apresentacao_1', " "): - msg =_('Por favor, preencha as datas.') + msg = _('Por favor, preencha as datas.') messages.add_message(self.request, messages.ERROR, msg) return context @@ -2164,8 +2211,10 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): 'numero', '-ano') principal = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) not_list = [self.kwargs['pk']] + \ - [m for m in principal.materia_principal_set.all().values_list('materia_anexada_id', flat=True)] - context['object_list'] = context['object_list'].exclude(pk__in=not_list) + [m for m in principal.materia_principal_set.all( + ).values_list('materia_anexada_id', flat=True)] + context['object_list'] = context['object_list'].exclude( + pk__in=not_list) context['temp_object_list'] = context['object_list'] context['object_list'] = [] @@ -2173,12 +2222,12 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): materia_anexada = obj ciclico = False anexadas_anexada = Anexada.objects.filter( - materia_principal = materia_anexada + materia_principal=materia_anexada ) while anexadas_anexada and not ciclico: anexadas = [] - + for anexa in anexadas_anexada: if principal == anexa.materia_anexada: @@ -2186,7 +2235,7 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): else: for a in Anexada.objects.filter(materia_principal=anexa.materia_anexada): anexadas.append(a) - + anexadas_anexada = anexadas if not ciclico: @@ -2217,7 +2266,7 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): if len(marcadas) == 0: msg = _('Nenhuma máteria foi selecionada.') messages.add_message(request, messages.ERROR, msg) - + if data_anexacao > v_data_desanexacao: msg = _('Data de anexação posterior à data de desanexação.') messages.add_message(request, messages.ERROR, msg) @@ -2242,7 +2291,8 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView): msg = _('Matéria(s) anexada(s).') messages.add_message(request, messages.SUCCESS, msg) - success_url = reverse('sapl.materia:anexada_list', kwargs={'pk': kwargs['pk']}) + success_url = reverse('sapl.materia:anexada_list', + kwargs={'pk': kwargs['pk']}) return HttpResponseRedirect(success_url) @@ -2328,6 +2378,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView): return self.get(self.request, kwargs, {'form':form}) + class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): filterset_class = TramitacaoEmLoteFilterSet diff --git a/sapl/templates/materia/despachoinicial_multicreate_form.html b/sapl/templates/materia/despachoinicial_multicreate_form.html new file mode 100644 index 000000000..2d1045d09 --- /dev/null +++ b/sapl/templates/materia/despachoinicial_multicreate_form.html @@ -0,0 +1,7 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block extra_js %} +{% endblock %}