Browse Source

Fix #1598 - Adiciona checkbox na criação de Despacho Inicial de Matérias (#2876)

* 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
pull/2888/head
Cesar Augusto de Carvalho 6 years ago
committed by Edward
parent
commit
cd929a5340
  1. 113
      sapl/materia/forms.py
  2. 21
      sapl/materia/migrations/0051_auto_20190703_1414.py
  3. 2
      sapl/materia/models.py
  4. 22
      sapl/materia/urls.py
  5. 131
      sapl/materia/views.py
  6. 7
      sapl/templates/materia/despachoinicial_multicreate_form.html

113
sapl/materia/forms.py

@ -3,7 +3,7 @@ import logging
import os import os
from crispy_forms.bootstrap import Alert, InlineRadios 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) Layout, Row)
from django import forms from django import forms
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
@ -535,7 +535,8 @@ class TramitacaoForm(ModelForm):
materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True materia.em_tramitacao = False if tramitacao.status.indicador == "F" else True
materia.save() materia.save()
tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') tramitar_anexadas = sapl.base.models.AppConfig.attr(
'tramitacao_materia')
if tramitar_anexadas: if tramitar_anexadas:
lista_tramitacao = [] lista_tramitacao = []
anexadas_list = lista_anexados(materia) anexadas_list = lista_anexados(materia)
@ -545,19 +546,19 @@ class TramitacaoForm(ModelForm):
ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True ma.em_tramitacao = False if tramitacao.status.indicador == "F" else True
ma.save() ma.save()
lista_tramitacao.append(Tramitacao( lista_tramitacao.append(Tramitacao(
status=tramitacao.status, status=tramitacao.status,
materia=ma, materia=ma,
data_tramitacao=tramitacao.data_tramitacao, data_tramitacao=tramitacao.data_tramitacao,
unidade_tramitacao_local=tramitacao.unidade_tramitacao_local, unidade_tramitacao_local=tramitacao.unidade_tramitacao_local,
data_encaminhamento=tramitacao.data_encaminhamento, data_encaminhamento=tramitacao.data_encaminhamento,
unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino, unidade_tramitacao_destino=tramitacao.unidade_tramitacao_destino,
urgente=tramitacao.urgente, urgente=tramitacao.urgente,
turno=tramitacao.turno, turno=tramitacao.turno,
texto=tramitacao.texto, texto=tramitacao.texto,
data_fim_prazo=tramitacao.data_fim_prazo, data_fim_prazo=tramitacao.data_fim_prazo,
user=tramitacao.user, user=tramitacao.user,
ip=tramitacao.ip ip=tramitacao.ip
)) ))
Tramitacao.objects.bulk_create(lista_tramitacao) Tramitacao.objects.bulk_create(lista_tramitacao)
return tramitacao return tramitacao
@ -570,10 +571,13 @@ def compara_tramitacoes_mat(tramitacao1, tramitacao2):
return False return False
lst_items = ['id', 'materia_id', 'timestamp'] 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] != '_'))] values = [(k, v) for k, v in tramitacao1.__dict__.items()
other_values = [(k,v) for k,v in tramitacao2.__dict__.items() if (k not in lst_items and k[0] != '_')] 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 return values == other_values
class TramitacaoUpdateForm(TramitacaoForm): class TramitacaoUpdateForm(TramitacaoForm):
unidade_tramitacao_local = forms.ModelChoiceField( unidade_tramitacao_local = forms.ModelChoiceField(
queryset=UnidadeTramitacao.objects.all(), 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.em_tramitacao = False if nova_tram_principal.status.indicador == "F" else True
materia.save() materia.save()
tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') tramitar_anexadas = sapl.base.models.AppConfig.attr(
'tramitacao_materia')
if tramitar_anexadas: if tramitar_anexadas:
anexadas_list = lista_anexados(materia) anexadas_list = lista_anexados(materia)
for ma in anexadas_list: for ma in anexadas_list:
@ -670,6 +675,7 @@ class TramitacaoUpdateForm(TramitacaoForm):
ma.save() ma.save()
return nova_tram_principal return nova_tram_principal
class LegislacaoCitadaForm(ModelForm): class LegislacaoCitadaForm(ModelForm):
tipo = forms.ModelChoiceField( tipo = forms.ModelChoiceField(
@ -843,8 +849,10 @@ class AnexadaForm(ModelForm):
data_desanexacao = cleaned_data['data_desanexacao'] if cleaned_data['data_desanexacao'] else data_anexacao data_desanexacao = cleaned_data['data_desanexacao'] if cleaned_data['data_desanexacao'] else data_anexacao
if data_anexacao > data_desanexacao: if data_anexacao > data_desanexacao:
self.logger.error("Data de anexação posterior à data de desanexação.") self.logger.error(
raise ValidationError(_("Data de anexação posterior à data de desanexação.")) "Data de anexação posterior à data de desanexação.")
raise ValidationError(
_("Data de anexação posterior à data de desanexação."))
try: try:
self.logger.info("Tentando obter objeto MateriaLegislativa (numero={}, ano={}, tipo={})." self.logger.info("Tentando obter objeto MateriaLegislativa (numero={}, ano={}, tipo={})."
@ -875,7 +883,8 @@ class AnexadaForm(ModelForm):
raise ValidationError(_('Matéria já se encontra anexada')) raise ValidationError(_('Matéria já se encontra anexada'))
ciclico = False 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: while anexadas_anexada and not ciclico:
anexadas = [] anexadas = []
@ -891,8 +900,10 @@ class AnexadaForm(ModelForm):
anexadas_anexada = anexadas anexadas_anexada = anexadas
if ciclico: if ciclico:
self.logger.error("A matéria não pode ser anexada por uma de suas anexadas.") self.logger.error(
raise ValidationError(_("A matéria não pode ser anexada por uma de suas anexadas.")) "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 cleaned_data['materia_anexada'] = materia_anexada
@ -1053,9 +1064,6 @@ class MateriaLegislativaFilterSet(django_filters.FilterSet):
HTML(autor_modal), HTML(autor_modal),
row4, row6, row7, row9, row4, row6, row7, row9,
form_actions(label=_('Pesquisar'))) form_actions(label=_('Pesquisar')))
) )
@property @property
@ -1114,9 +1122,50 @@ def filtra_tramitacao_destino_and_status(status, destino):
'materia_id', flat=True) '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): class DespachoInicialForm(ModelForm):
comissao = forms.ModelChoiceField( comissao = forms.ModelChoiceField(
queryset=Comissao.objects.filter(ativa=True)) queryset=Comissao.objects.filter(ativa=True), label=_('Comissão'))
class Meta: class Meta:
model = DespachoInicial model = DespachoInicial
@ -1158,7 +1207,8 @@ class AutoriaForm(ModelForm):
if 'initial' in kwargs and 'materia' in kwargs['initial']: if 'initial' in kwargs and 'materia' in kwargs['initial']:
materia = kwargs['initial']['materia'] 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), row1 = to_row([('tipo_autor', 4),
('autor', 4), ('autor', 4),
@ -1228,7 +1278,8 @@ class AutoriaMultiCreateForm(Form):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if 'initial' in kwargs and 'autores' in kwargs['initial']: 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)]) row1 = to_row([('tipo_autor', 10), ('primeiro_autor', 2)])
@ -1938,7 +1989,7 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm):
ano=timezone.now().year).aggregate(Max('numero_proposicao')) ano=timezone.now().year).aggregate(Max('numero_proposicao'))
numero__max = numero__max['numero_proposicao__max'] numero__max = numero__max['numero_proposicao__max']
inst.numero_proposicao = ( 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) self.gerar_hash(inst, receber_recibo)
@ -2036,7 +2087,7 @@ class ConfirmarProposicaoForm(ProposicaoForm):
attrs={'readonly': 'readonly'})) attrs={'readonly': 'readonly'}))
regime_tramitacao = forms.ModelChoiceField(label="Regime de tramitação", 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( gerar_protocolo = forms.ChoiceField(
required=False, required=False,

21
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'),
),
]

2
sapl/materia/models.py

@ -485,7 +485,7 @@ class AssuntoMateria(models.Model):
@reversion.register() @reversion.register()
class DespachoInicial(models.Model): class DespachoInicial(models.Model):
materia = models.ForeignKey(MateriaLegislativa, on_delete=models.CASCADE) 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: class Meta:
verbose_name = _('Despacho Inicial') verbose_name = _('Despacho Inicial')

22
sapl/materia/urls.py

@ -26,9 +26,11 @@ from sapl.materia.views import (AcompanhamentoConfirmarView,
TramitacaoEmLoteView, UnidadeTramitacaoCrud, TramitacaoEmLoteView, UnidadeTramitacaoCrud,
proposicao_texto, recuperar_materia, proposicao_texto, recuperar_materia,
ExcluirTramitacaoEmLoteView, RetornarProposicao, ExcluirTramitacaoEmLoteView, RetornarProposicao,
MateriaPesquisaSimplesView) MateriaPesquisaSimplesView,
DespachoInicialMultiCreateView)
from sapl.norma.views import NormaPesquisaSimplesView from sapl.norma.views import NormaPesquisaSimplesView
from sapl.protocoloadm.views import (FichaPesquisaAdmView, FichaSelecionaAdmView) from sapl.protocoloadm.views import (
FichaPesquisaAdmView, FichaSelecionaAdmView)
from .apps import AppConfig from .apps import AppConfig
@ -55,13 +57,20 @@ urlpatterns_impressos = [
name='impressos_materia_pesquisa'), name='impressos_materia_pesquisa'),
url(r'^materia/impressos/ficha-pesquisa-adm/$', url(r'^materia/impressos/ficha-pesquisa-adm/$',
FichaPesquisaAdmView.as_view(), FichaPesquisaAdmView.as_view(),
name= 'impressos_ficha_pesquisa_adm'), name='impressos_ficha_pesquisa_adm'),
url(r'^materia/impressos/ficha-seleciona-adm/$', url(r'^materia/impressos/ficha-seleciona-adm/$',
FichaSelecionaAdmView.as_view(), FichaSelecionaAdmView.as_view(),
name= 'impressos_ficha_seleciona_adm'), name='impressos_ficha_seleciona_adm'),
] ]
urlpatterns_materia = [ 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<pk>\d+)/despachoinicial/create',
DespachoInicialMultiCreateView.as_view(),
name='despacho-inicial-multi'),
url(r'^materia/', include(MateriaLegislativaCrud.get_urls() + url(r'^materia/', include(MateriaLegislativaCrud.get_urls() +
AnexadaCrud.get_urls() + AnexadaCrud.get_urls() +
AutoriaCrud.get_urls() + AutoriaCrud.get_urls() +
@ -76,7 +85,8 @@ urlpatterns_materia = [
url(r'^materia/(?P<pk>[0-9]+)/create_simplificado$', url(r'^materia/(?P<pk>[0-9]+)/create_simplificado$',
CriarProtocoloMateriaView.as_view(), CriarProtocoloMateriaView.as_view(),
name='materia_create_simplificado'), 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<pk>[0-9]+)/ta$', url(r'^materia/(?P<pk>[0-9]+)/ta$',
MateriaTaView.as_view(), name='materia_ta'), MateriaTaView.as_view(), name='materia_ta'),
@ -96,6 +106,7 @@ urlpatterns_materia = [
AutoriaMultiCreateView.as_view(), AutoriaMultiCreateView.as_view(),
name='autoria_multicreate'), name='autoria_multicreate'),
url(r'^materia/acessorio-em-lote', DocumentoAcessorioEmLoteView.as_view(), url(r'^materia/acessorio-em-lote', DocumentoAcessorioEmLoteView.as_view(),
name='acessorio_em_lote'), name='acessorio_em_lote'),
url(r'^materia/(?P<pk>\d+)/anexada-em-lote', MateriaAnexadaEmLoteView.as_view(), url(r'^materia/(?P<pk>\d+)/anexada-em-lote', MateriaAnexadaEmLoteView.as_view(),
@ -136,6 +147,7 @@ urlpatterns_proposicao = [
name='proposicao_texto'), name='proposicao_texto'),
url(r'^proposicao/(?P<pk>\d+)/retornar', RetornarProposicao.as_view(), url(r'^proposicao/(?P<pk>\d+)/retornar', RetornarProposicao.as_view(),
name='retornar-proposicao'), name='retornar-proposicao'),
] ]
urlpatterns_sistema = [ urlpatterns_sistema = [

131
sapl/materia/views.py

@ -1,13 +1,11 @@
from datetime import datetime
import itertools
import logging import logging
import os import os
import shutil
import tempfile
import weasyprint
import itertools
from datetime import datetime
from random import choice from random import choice
import shutil
from string import ascii_letters, digits from string import ascii_letters, digits
import tempfile
from crispy_forms.layout import HTML from crispy_forms.layout import HTML
from django.conf import settings 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.views.generic.edit import FormView
from django_filters.views import FilterView from django_filters.views import FilterView
import weasyprint import weasyprint
import weasyprint
import sapl import sapl
from sapl.base.email_utils import do_envia_email_confirmacao from sapl.base.email_utils import do_envia_email_confirmacao
@ -47,7 +46,8 @@ from sapl.materia.forms import (AnexadaForm, AutoriaForm,
ConfirmarProposicaoForm, ConfirmarProposicaoForm,
DevolverProposicaoForm, LegislacaoCitadaForm, DevolverProposicaoForm, LegislacaoCitadaForm,
OrgaoForm, ProposicaoForm, TipoProposicaoForm, OrgaoForm, ProposicaoForm, TipoProposicaoForm,
TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm) TramitacaoForm, TramitacaoUpdateForm, MateriaPesquisaSimplesForm,
DespachoInicialCreateForm)
from sapl.norma.models import LegislacaoCitada from sapl.norma.models import LegislacaoCitada
from sapl.parlamentares.models import Legislatura from sapl.parlamentares.models import Legislatura
from sapl.protocoloadm.models import Protocolo from sapl.protocoloadm.models import Protocolo
@ -1141,9 +1141,9 @@ class RelatoriaCrud(MasterDetailCrud):
parlamentar = relatoria.parlamentar parlamentar = relatoria.parlamentar
comissao = relatoria.comissao comissao = relatoria.comissao
composicoes = [p.composicao for p in composicoes = [p.composicao for p in
Participacao.objects.filter( Participacao.objects.filter(
parlamentar=parlamentar, parlamentar=parlamentar,
composicao__comissao=comissao)] composicao__comissao=comissao)]
data_designacao = relatoria.data_designacao_relator data_designacao = relatoria.data_designacao_relator
composicao = '' composicao = ''
for c in composicoes: for c in composicoes:
@ -1204,7 +1204,8 @@ class TramitacaoCrud(MasterDetailCrud):
'-timestamp', '-timestamp',
'-id').first() '-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:
if ultima_tramitacao.unidade_tramitacao_destino: if ultima_tramitacao.unidade_tramitacao_destino:
context['form'].fields[ context['form'].fields[
@ -1258,7 +1259,8 @@ class TramitacaoCrud(MasterDetailCrud):
layout_key = 'TramitacaoUpdate' layout_key = 'TramitacaoUpdate'
def form_valid(self, form): 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() self.object = form.save()
dict_objeto_novo = self.object.__dict__ dict_objeto_novo = self.object.__dict__
@ -1270,7 +1272,8 @@ class TramitacaoCrud(MasterDetailCrud):
'data_encaminhamento', 'data_fim_prazo', 'urgente', 'turno' '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: for atributo in atributos:
if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]: if dict_objeto_antigo[atributo] != dict_objeto_novo[atributo]:
self.object.user = user self.object.user = user
@ -1332,7 +1335,8 @@ class TramitacaoCrud(MasterDetailCrud):
if materia.tramitacao_set.count() == 0: if materia.tramitacao_set.count() == 0:
materia.em_tramitacao = False materia.em_tramitacao = False
materia.save() materia.save()
tramitar_anexadas = sapl.base.models.AppConfig.attr('tramitacao_materia') tramitar_anexadas = sapl.base.models.AppConfig.attr(
'tramitacao_materia')
if tramitar_anexadas: if tramitar_anexadas:
mat_anexadas = lista_anexados(materia) mat_anexadas = lista_anexados(materia)
for ma in mat_anexadas: for ma in mat_anexadas:
@ -1485,20 +1489,58 @@ class AutoriaMultiCreateView(PermissionRequiredForAppCrudMixin, FormView):
autores_selecionados = form.cleaned_data['autor'] autores_selecionados = form.cleaned_data['autor']
primeiro_autor = form.cleaned_data['primeiro_autor'] primeiro_autor = form.cleaned_data['primeiro_autor']
for autor in autores_selecionados: 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) 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 <small>(%s)</small>' % (
_('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): class DespachoInicialCrud(MasterDetailCrud):
model = DespachoInicial model = DespachoInicial
parent_field = 'materia' parent_field = 'materia'
help_topic = 'despacho_autoria' help_topic = 'despacho_autoria'
public = [RP_LIST, RP_DETAIL] public = [RP_LIST, RP_DETAIL]
class CreateView(MasterDetailCrud.CreateView):
form_class = DespachoInicialForm
class UpdateView(MasterDetailCrud.UpdateView): class UpdateView(MasterDetailCrud.UpdateView):
form_class = DespachoInicialForm form_class = DespachoInicialForm
@ -1687,7 +1729,8 @@ class MateriaLegislativaCrud(Crud):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['user'] = self.request.user 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 return context
class ListView(Crud.ListView, RedirectView): class ListView(Crud.ListView, RedirectView):
@ -2081,13 +2124,15 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
destination.write(chunk) destination.write(chunk)
try: try:
doc_data = tz.localize(datetime.strptime( doc_data = tz.localize(datetime.strptime(
request.POST['data'], "%d/%m/%Y")) request.POST['data'], "%d/%m/%Y"))
except Exception as e: except Exception as e:
msg = _('Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.') msg = _(
messages.add_message(request, messages.ERROR, msg) 'Formato da data incorreto. O formato deve ser da forma dd/mm/aaaa.')
self.logger.error("User={}. {}. Data inserida: {}".format(username, str(msg), request.POST['data'])) messages.add_message(request, messages.ERROR, msg)
os.remove(tmp_name) self.logger.error("User={}. {}. Data inserida: {}".format(
return self.get(request, self.kwargs) username, str(msg), request.POST['data']))
os.remove(tmp_name)
return self.get(request, self.kwargs)
for materia_id in marcadas: for materia_id in marcadas:
doc = DocumentoAcessorio() doc = DocumentoAcessorio()
@ -2101,25 +2146,27 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView):
try: try:
doc.clean_fields() doc.clean_fields()
except ValidationError as e: except ValidationError as e:
for m in [ '%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, '</br>'.join(v)) for m in ['%s: %s' % (DocumentoAcessorio()._meta.get_field(k).verbose_name, '</br>'.join(v))
for k,v in e.message_dict.items() ]: for k, v in e.message_dict.items()]:
# Insere as mensagens de erro no formato: # Insere as mensagens de erro no formato:
# 'verbose_name do nome do campo': 'mensagem de erro' # 'verbose_name do nome do campo': 'mensagem de erro'
messages.add_message(request, messages.ERROR, m) 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) os.remove(tmp_name)
return self.get(request, self.kwargs) return self.get(request, self.kwargs)
doc.save() doc.save()
diretorio = os.path.join(MEDIA_ROOT, diretorio = os.path.join(MEDIA_ROOT,
'sapl/public/documentoacessorio', 'sapl/public/documentoacessorio',
str(doc_data.year), str(doc_data.year),
str(doc.id)) str(doc.id))
if not os.path.exists(diretorio): if not os.path.exists(diretorio):
os.makedirs(diretorio) os.makedirs(diretorio)
file_path = os.path.join(diretorio, file_path = os.path.join(diretorio,
request.FILES['arquivo'].name) request.FILES['arquivo'].name)
shutil.copy2(tmp_name, file_path) 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() doc.save()
os.remove(tmp_name) os.remove(tmp_name)
@ -2145,17 +2192,17 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
# Verifica se os campos foram preenchidos # Verifica se os campos foram preenchidos
if not self.request.GET.get('tipo', " "): 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) 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', " "): 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) messages.add_message(self.request, messages.ERROR, msg)
return context return context
if not self.request.GET.get('data_apresentacao_0', " ") or not self.request.GET.get('data_apresentacao_1', " "): 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) messages.add_message(self.request, messages.ERROR, msg)
return context return context
@ -2164,8 +2211,10 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
'numero', '-ano') 'numero', '-ano')
principal = MateriaLegislativa.objects.get(pk=self.kwargs['pk']) principal = MateriaLegislativa.objects.get(pk=self.kwargs['pk'])
not_list = [self.kwargs['pk']] + \ not_list = [self.kwargs['pk']] + \
[m for m in principal.materia_principal_set.all().values_list('materia_anexada_id', flat=True)] [m for m in principal.materia_principal_set.all(
context['object_list'] = context['object_list'].exclude(pk__in=not_list) ).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['temp_object_list'] = context['object_list']
context['object_list'] = [] context['object_list'] = []
@ -2173,7 +2222,7 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
materia_anexada = obj materia_anexada = obj
ciclico = False ciclico = False
anexadas_anexada = Anexada.objects.filter( anexadas_anexada = Anexada.objects.filter(
materia_principal = materia_anexada materia_principal=materia_anexada
) )
while anexadas_anexada and not ciclico: while anexadas_anexada and not ciclico:
@ -2242,7 +2291,8 @@ class MateriaAnexadaEmLoteView(PermissionRequiredMixin, FilterView):
msg = _('Matéria(s) anexada(s).') msg = _('Matéria(s) anexada(s).')
messages.add_message(request, messages.SUCCESS, msg) 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) return HttpResponseRedirect(success_url)
@ -2328,6 +2378,7 @@ class PrimeiraTramitacaoEmLoteView(PermissionRequiredMixin, FilterView):
return self.get(self.request, kwargs, {'form':form}) return self.get(self.request, kwargs, {'form':form})
class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView): class TramitacaoEmLoteView(PrimeiraTramitacaoEmLoteView):
filterset_class = TramitacaoEmLoteFilterSet filterset_class = TramitacaoEmLoteFilterSet

7
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 %}
Loading…
Cancel
Save