From a8a41ea78cabfe7c1d87789bf0b6fd1dd6ab3696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rodrigues?= Date: Wed, 3 Apr 2019 11:44:00 -0300 Subject: [PATCH 1/6] Fix #2403 Adiciona Oradores da Ordem do Dia (#2662) * Adicionar oradores da ordem do dia * Atualizar sessao/forms.py --- .../templates/pdf_sessao_plenaria_gerar.py | 24 +++++- sapl/relatorios/views.py | 44 +++++++++-- sapl/rules/map_rules.py | 1 + sapl/sessao/forms.py | 55 +++++++++++++- sapl/sessao/migrations/0034_oradorordemdia.py | 34 +++++++++ .../0035_resumoordenacao_decimo_quarto.py | 20 +++++ sapl/sessao/models.py | 9 +++ sapl/sessao/urls.py | 7 +- sapl/sessao/views.py | 76 +++++++++++++++++-- sapl/templates/relatorios/relatorio_ata.html | 1 + .../sessao/blocos_ata/oradores_ordemdia.html | 13 ++++ .../blocos_resumo/oradores_ordemdia.html | 15 ++++ sapl/templates/sessao/layouts.yaml | 6 ++ sapl/templates/sessao/resumo.html | 3 + sapl/templates/sessao/resumo_ata.html | 1 + sapl/templates/sessao/subnav.yaml | 2 + 16 files changed, 292 insertions(+), 19 deletions(-) create mode 100644 sapl/sessao/migrations/0034_oradorordemdia.py create mode 100644 sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py create mode 100644 sapl/templates/sessao/blocos_ata/oradores_ordemdia.html create mode 100644 sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 6a39fa1c1..4c388e59a 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -340,6 +340,24 @@ def votacao_vot_nom(lst_votacao_vot_nom): return tmp +def oradores_ordemdia(lst_oradores_ordemdia): + """ + + """ + tmp = '' + tmp += '\t\tOradores da Ordem do Dia\n' + tmp += '\t\t\n' + tmp += '\t\t\t
\n' + tmp += '\t\t
\n' + for orador_ordemdia in lst_oradores_ordemdia: + tmp += '\t\t' + \ + str(orador_ordemdia['num_ordem']) + ' - ' + \ + orador_ordemdia['nome_parlamentar'] + '/' + \ + str(orador_ordemdia['sigla']) + ' - ' + \ + str(orador_ordemdia['observacao']) + '\n' + return tmp + + def oradores(lst_oradores): """ @@ -374,7 +392,7 @@ def ocorrencias(lst_ocorrencias): return tmp -def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, lst_oradores, lst_ocorrencias): +def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, lst_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf" @@ -409,6 +427,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao 'v_n_mat_o_d': votacao_vot_nom(lst_votacao_vot_nom), 'mesa_d': mesa(lst_mesa), 'oradores_exped': oradores_expediente(lst_oradores_expediente), + 'oradores_o_d': oradores_ordemdia(lst_oradores_ordemdia), 'oradores_expli': oradores(lst_oradores), 'ocorr_sessao': ocorrencias(lst_ocorrencias) } @@ -428,6 +447,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao tmp += dict_ord_template[ordenacao.decimo_primeiro] tmp += dict_ord_template[ordenacao.decimo_segundo] tmp += dict_ord_template[ordenacao.decimo_terceiro] + tmp += dict_ord_template[ordenacao.decimo_quarto] except KeyError as e: logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " "configuração de ordenação. Utilizando ordenação padrão.") @@ -441,6 +461,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao tmp += presenca_ordem_dia(lst_presenca_ordem_dia) tmp += votacao(lst_votacao) tmp += votacao_vot_nom(lst_votacao_vot_nom) + tmp += oradores_ordemdia(lst_oradores_ordemdia) tmp += oradores(lst_oradores) tmp += ocorrencias(lst_ocorrencias) @@ -455,6 +476,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao tmp += presenca_ordem_dia(lst_presenca_ordem_dia) tmp += votacao(lst_votacao) tmp += votacao_vot_nom(lst_votacao_vot_nom) + tmp += oradores_ordemdia(lst_oradores_ordemdia) tmp += oradores(lst_oradores) tmp += ocorrencias(lst_ocorrencias) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index deb1e885f..72ef64e45 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -23,15 +23,16 @@ from sapl.sessao.models import (ExpedienteMateria, ExpedienteSessao, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, OcorrenciaSessao, - RegistroVotacao, VotoParlamentar) + RegistroVotacao, VotoParlamentar, OradorOrdemDia) from sapl.settings import STATIC_ROOT from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data from sapl.sessao.views import (get_identificação_basica, get_mesa_diretora, - get_presenca_sessao, get_expedientes, - get_materias_expediente, get_oradores_expediente, + get_presenca_sessao,get_expedientes, + get_materias_expediente,get_oradores_expediente, get_presenca_ordem_do_dia, get_materias_ordem_do_dia, - get_oradores_explicações_pessoais, get_ocorrencias_da_sessão, get_assinaturas) + get_oradores_ordemdia, + get_oradores_explicações_pessoais, get_ocorrencias_da_sessão) from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, @@ -780,6 +781,35 @@ def get_sessao_plenaria(sessao, casa): } lst_votacao_vot_nom.append(dic_votacao_vot_nom) + # Lista dos oradores da Ordem do Dia + lst_oradores_ordemdia = [] + + oradores_ordem_dia = OradorOrdemDia.objects.filter( + sessao_plenaria=sessao + ).order_by('numero_ordem') + + for orador_ordemdia in oradores_ordem_dia: + parlamentar_orador = Parlamentar.objects.get( + id=orador_ordemdia.parlamentar.id + ) + + sigla_partido = Filiacao.objects.filter( + parlamentar=parlamentar_orador + ).first() + + if not sigla_partido: + sigla_p = "" + else: + sigla_p = sigla_partido.partido.sigla + + dic_oradores_ordemdia = { + 'num_ordem': orador_ordemdia.numero_ordem, + 'nome_parlamentar': parlamentar_orador.nome_parlamentar, + 'observacao': orador_ordemdia.observacao, + 'sigla': sigla_p + } + lst_oradores_ordemdia.append(dic_oradores_ordemdia) + # Lista dos oradores nas Explicações Pessoais lst_oradores = [] for orador in Orador.objects.filter( @@ -830,6 +860,7 @@ def get_sessao_plenaria(sessao, casa): lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, + lst_oradores_ordemdia, lst_oradores, lst_ocorrencias) @@ -886,7 +917,8 @@ def relatorio_sessao_plenaria(request, pk): lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, - lst_votacao_vot_nom, + lst_votacao_vot_nom, + lst_oradores_ordemdia, lst_oradores, lst_ocorrencias) = get_sessao_plenaria(sessao, casa) @@ -910,6 +942,7 @@ def relatorio_sessao_plenaria(request, pk): lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, + lst_oradores_ordemdia, lst_oradores, lst_ocorrencias) @@ -1256,6 +1289,7 @@ def resumo_ata_pdf(request,pk): context.update(get_oradores_expediente(sessao_plenaria)) context.update(get_presenca_ordem_do_dia(sessao_plenaria)) context.update(get_materias_ordem_do_dia(sessao_plenaria)) + context.update(get_oradores_ordemdia(sessao_plenaria)) context.update(get_oradores_explicações_pessoais(sessao_plenaria)) context.update(get_ocorrencias_da_sessão(sessao_plenaria)) context.update(get_assinaturas(sessao_plenaria)) diff --git a/sapl/rules/map_rules.py b/sapl/rules/map_rules.py index 13c89a547..d09e65961 100644 --- a/sapl/rules/map_rules.py +++ b/sapl/rules/map_rules.py @@ -175,6 +175,7 @@ rules_group_sessao = { (sessao.ExpedienteSessao, __base__, __perms_publicas__), (sessao.Orador, __base__, __perms_publicas__), (sessao.OradorExpediente, __base__, __perms_publicas__), + (sessao.OradorOrdemDia, __base__, __perms_publicas__), (sessao.OrdemDia, __base__, __perms_publicas__), (sessao.PresencaOrdemDia, __base__, __perms_publicas__), (sessao.RegistroVotacao, __base__, __perms_publicas__), diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index 172b37be5..373b1e951 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -26,7 +26,7 @@ from sapl.utils import (RANGE_DIAS_MES, RANGE_MESES, from .models import (Bancada, Bloco, ExpedienteMateria, JustificativaAusencia, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, SessaoPlenaria, SessaoPlenariaPresenca, TipoResultadoVotacao, - OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta) + OcorrenciaSessao, RetiradaPauta, TipoRetiradaPauta, OradorOrdemDia) MES_CHOICES = RANGE_MESES @@ -45,7 +45,8 @@ ORDENACAO_RESUMO = [('cont_mult', 'Conteúdo Multimídia'), ('oradores_expli', 'Oradores das Explicações Pessoais'), ('ocorr_sessao', 'Ocorrências da Sessão'), ('v_n_mat_exp', 'Votações Nominais - Matérias do Expediente'), - ('v_n_mat_o_d', 'Votações Nominais - Matérias da Ordem do Dia')] + ('v_n_mat_o_d', 'Votações Nominais - Matérias da Ordem do Dia'), + ('oradores_o_d', 'Oradores da Ordem do Dia')] class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): @@ -758,6 +759,49 @@ class OradorExpedienteForm(ModelForm): exclude = ['sessao_plenaria'] +class OradorOrdemDiaForm(ModelForm): + + def __init__(self, *args, **kwargs): + super(OradorOrdemDiaForm, self).__init__(*args, **kwargs) + + id_sessao = int(self.initial['id_sessao']) + + ids = [p.parlamentar.id for p in PresencaOrdemDia.objects.filter( + sessao_plenaria_id=id_sessao + )] + + self.fields['parlamentar'].queryset = Parlamentar.objects.filter( + id__in=ids + ).order_by('nome_parlamentar') + + + def clean(self): + super(OradorOrdemDiaForm, self).clean() + cleaned_data = self.cleaned_data + + if not self.is_valid(): + return self.cleaned_data + + sessao_id = self.initial['id_sessao'] + numero = self.initial.get('numero') + numero_ordem = cleaned_data['numero_ordem'] + ordem = OradorOrdemDia.objects.filter( + sessao_plenaria_id=sessao_id, + numero_ordem=numero_ordem + ).exists() + + if ordem and numero_ordem != numero: + raise ValidationError(_( + "Já existe orador nesta posição de ordem de pronunciamento" + )) + + return self.cleaned_data + + class Meta: + model = OradorOrdemDia + exclude = ['sessao_plenaria'] + + class PautaSessaoFilterSet(SessaoPlenariaFilterSet): titulo = _('Pesquisa de Pauta de Sessão') @@ -789,6 +833,8 @@ class ResumoOrdenacaoForm(forms.Form): choices=ORDENACAO_RESUMO) decimo_terceiro = forms.ChoiceField(label='13°', choices=ORDENACAO_RESUMO) + decimo_quarto = forms.ChoiceField(label='14°', + choices=ORDENACAO_RESUMO) def __init__(self, *args, **kwargs): super(ResumoOrdenacaoForm, self).__init__(*args, **kwargs) @@ -819,13 +865,16 @@ class ResumoOrdenacaoForm(forms.Form): [('decimo_segundo', 12)]) row13 = to_row( [('decimo_terceiro', 12)]) + row14 = to_row( + [('decimo_quarto', 12)] + ) self.helper = SaplFormHelper() self.helper.layout = Layout( Fieldset(_(''), row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, - row11, row12, row13, + row11, row12, row13, row14, form_actions(label='Atualizar')) ) diff --git a/sapl/sessao/migrations/0034_oradorordemdia.py b/sapl/sessao/migrations/0034_oradorordemdia.py new file mode 100644 index 000000000..b0e5976fb --- /dev/null +++ b/sapl/sessao/migrations/0034_oradorordemdia.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-03-26 16:14 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import sapl.sessao.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parlamentares', '0025_auto_20180924_1724'), + ('sessao', '0033_auto_20190228_1803'), + ] + + operations = [ + migrations.CreateModel( + name='OradorOrdemDia', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('numero_ordem', models.PositiveIntegerField(verbose_name='Ordem de pronunciamento')), + ('url_discurso', models.URLField(blank=True, max_length=150, verbose_name='URL Vídeo')), + ('observacao', models.CharField(blank=True, max_length=150, verbose_name='Observação')), + ('upload_anexo', models.FileField(blank=True, null=True, upload_to=sapl.sessao.models.anexo_upload_path, verbose_name='Anexo do Orador')), + ('parlamentar', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='parlamentares.Parlamentar', verbose_name='Parlamentar')), + ('sessao_plenaria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sessao.SessaoPlenaria')), + ], + options={ + 'verbose_name_plural': 'Oradores da Ordem do Dia', + 'verbose_name': 'Orador da Ordem do Dia', + }, + ), + ] diff --git a/sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py b/sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py new file mode 100644 index 000000000..f8e00489e --- /dev/null +++ b/sapl/sessao/migrations/0035_resumoordenacao_decimo_quarto.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-03-26 18:14 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sessao', '0034_oradorordemdia'), + ] + + operations = [ + migrations.AddField( + model_name='resumoordenacao', + name='decimo_quarto', + field=models.CharField(default='Oradores da Ordem do Dia', max_length=30), + ), + ] diff --git a/sapl/sessao/models.py b/sapl/sessao/models.py index 34ed20cca..7267e78fc 100644 --- a/sapl/sessao/models.py +++ b/sapl/sessao/models.py @@ -378,6 +378,14 @@ class OradorExpediente(AbstractOrador): # OradoresExpediente verbose_name_plural = _('Oradores do Expediente') +@reversion.register() +class OradorOrdemDia(AbstractOrador): # OradoresOrdemDia + + class Meta: + verbose_name = _('Orador da Ordem do Dia') + verbose_name_plural = _('Oradores da Ordem do Dia') + + @reversion.register() class OrdemDia(AbstractOrdemDia): @@ -579,6 +587,7 @@ class ResumoOrdenacao(models.Model): decimo_primeiro = models.CharField(max_length=30,default="Ocorrências da Sessão") decimo_segundo = models.CharField(max_length=30, default="Votos Nominais Mat Expediente") decimo_terceiro = models.CharField(max_length=30, default="Votos Nominais Mat Ordem Dia") + decimo_quarto = models.CharField(max_length=30, default="Oradores da Ordem do Dia") class Meta: verbose_name = _('Ordenação do Resumo de uma Sessão') diff --git a/sapl/sessao/urls.py b/sapl/sessao/urls.py index ba0735ec6..00add810a 100644 --- a/sapl/sessao/urls.py +++ b/sapl/sessao/urls.py @@ -4,7 +4,8 @@ from sapl.sessao.views import (AdicionarVariasMateriasExpediente, AdicionarVariasMateriasOrdemDia, BancadaCrud, BlocoCrud, CargoBancadaCrud, ExpedienteMateriaCrud, ExpedienteView, JustificativaAusenciaCrud, - OcorrenciaSessaoView, MateriaOrdemDiaCrud, MesaView, OradorCrud, + OcorrenciaSessaoView, MateriaOrdemDiaCrud, OradorOrdemDiaCrud, + MesaView, OradorCrud, OradorExpedienteCrud, PainelView, PautaSessaoDetailView, PautaSessaoView, PesquisarPautaSessaoView, @@ -44,7 +45,9 @@ urlpatterns = [ OradorExpedienteCrud.get_urls() + ExpedienteMateriaCrud.get_urls() + JustificativaAusenciaCrud.get_urls() + - MateriaOrdemDiaCrud.get_urls() + RetiradaPautaCrud.get_urls())), + MateriaOrdemDiaCrud.get_urls() + + OradorOrdemDiaCrud.get_urls() + + RetiradaPautaCrud.get_urls())), url(r'^sessao/(?P\d+)/mesa$', MesaView.as_view(), name='mesa'), diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index 550b231be..08adf1fa0 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -42,14 +42,14 @@ from .forms import (AdicionarVariasMateriasFilterSet, BancadaForm, BlocoForm, MesaForm, OradorExpedienteForm, OradorForm, PautaSessaoFilterSet, PresencaForm, ResumoOrdenacaoForm, SessaoPlenariaFilterSet, SessaoPlenariaForm, VotacaoEditForm, VotacaoForm, - VotacaoNominalForm, RetiradaPautaForm) + VotacaoNominalForm, RetiradaPautaForm, OradorOrdemDiaForm) from .models import (Bancada, Bloco, CargoBancada, CargoMesa, ExpedienteMateria, ExpedienteSessao, OcorrenciaSessao, IntegranteMesa, MateriaLegislativa, Orador, OradorExpediente, OrdemDia, PresencaOrdemDia, RegistroVotacao, ResumoOrdenacao, SessaoPlenaria, SessaoPlenariaPresenca, TipoExpediente, TipoResultadoVotacao, TipoSessaoPlenaria, VotoParlamentar, TipoRetiradaPauta, - RetiradaPauta, TipoJustificativa, JustificativaAusencia) + RetiradaPauta, TipoJustificativa, JustificativaAusencia, OradorOrdemDia) TipoSessaoCrud = CrudAux.build(TipoSessaoPlenaria, 'tipo_sessao_plenaria') @@ -618,6 +618,31 @@ class OradorExpedienteCrud(OradorCrud): 'numero': self.object.numero_ordem} +class OradorOrdemDiaCrud(OradorCrud): + model = OradorOrdemDia + + class CreateView(MasterDetailCrud.CreateView): + form_class = OradorOrdemDiaForm + + def get_initial(self): + return {'id_sessao': self.kwargs['pk']} + + def get_success_url(self): + return reverse('sapl.sessao:oradorordemdia_list', + kwargs={'pk': self.kwargs['pk']}) + + class UpdateView(MasterDetailCrud.UpdateView): + form_class = OradorOrdemDiaForm + + def get_initial(self): + initial = super(UpdateView, self).get_initial() + + initial.update({'id_sessao': self.object.sessao_plenaria.id}) + initial.update({'numero': self.object.numero_ordem}) + + return initial + + class OradorCrud(OradorCrud): model = Orador @@ -1290,7 +1315,8 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): 'decimo': ordenacao.decimo, 'decimo_primeiro': ordenacao.decimo_primeiro, 'decimo_segundo': ordenacao.decimo_segundo, - 'decimo_terceiro': ordenacao.decimo_terceiro}) + 'decimo_terceiro': ordenacao.decimo_terceiro, + 'decimo_quarto': ordenacao.decimo_quarto}) return initial def form_valid(self, form): @@ -1309,6 +1335,7 @@ class ResumoOrdenacaoView(PermissionRequiredMixin, FormView): ordenacao.decimo_primeiro = form.cleaned_data['decimo_primeiro'] ordenacao.decimo_segundo = form.cleaned_data['decimo_segundo'] ordenacao.decimo_terceiro = form.cleaned_data['decimo_terceiro'] + ordenacao.decimo_quarto = form.cleaned_data['decimo_quarto'] ordenacao.save() @@ -1584,6 +1611,32 @@ def get_materias_ordem_do_dia(sessao_plenaria): return context +def get_oradores_ordemdia(sessao_plenaria): + oradores = [] + + oradores_ordem_dia = OradorOrdemDia.objects.filter( + sessao_plenaria_id=sessao_plenaria.id + ).order_by('numero_ordem') + + for orador in oradores_ordem_dia: + numero_ordem = orador.numero_ordem + url_discurso = orador.url_discurso + observacao = orador.observacao + parlamentar = Parlamentar.objects.get( + id=orador.parlamentar_id + ) + o = { + 'numero_ordem': numero_ordem, + 'url_discurso': url_discurso, + 'parlamentar': parlamentar, + 'observacao': observacao + } + oradores.append(o) + + context = {'oradores_ordemdia': oradores} + return context + + def get_oradores_explicações_pessoais(sessao_plenaria): oradores_explicacoes = [] for orador in Orador.objects.filter( @@ -1698,6 +1751,9 @@ class ResumoView(DetailView): context.update(get_materias_ordem_do_dia(self.object)) # ===================================================================== + # Oradores Ordem do Dia + context.update(get_oradores_ordemdia(self.object)) + # ===================================================================== # Oradores nas Explicações Pessoais context.update(get_oradores_explicações_pessoais(self.object)) # ===================================================================== @@ -1718,6 +1774,7 @@ class ResumoView(DetailView): 'v_n_mat_o_d': 'votos_nominais_materias_ordem_dia.html', 'mesa_d': 'mesa_diretora.html', 'oradores_exped': 'oradores_expediente.html', + 'oradores_o_d': 'oradores_ordemdia.html', 'oradores_expli': 'oradores_explicacoes.html', 'ocorr_sessao': 'ocorrencias_da_sessao.html' } @@ -1737,7 +1794,8 @@ class ResumoView(DetailView): 'decimo_ordenacao': dict_ord_template[ordenacao.decimo], 'decimo_primeiro_ordenacao': dict_ord_template[ordenacao.decimo_primeiro], 'decimo_segundo_ordenacao': dict_ord_template[ordenacao.decimo_segundo], - 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro]}) + 'decimo_terceiro_ordenacao': dict_ord_template[ordenacao.decimo_terceiro], + 'decimo_quarto_ordenacao': dict_ord_template[ordenacao.decimo_quarto]}) except KeyError as e: self.logger.error('user=' + self.request.user.username + '. ' + "KeyError: " + str(e) + ". Erro " "ao tentar utilizar configuração de ordenação. Utilizando ordenação padrão.") @@ -1753,8 +1811,9 @@ class ResumoView(DetailView): 'nono_ordenacao': dict_ord_template['lista_p_o_d'], 'decimo_ordenacao': dict_ord_template['mat_o_d'], 'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'], - 'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'], - 'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao'] + 'decimo_segundo_ordenacao': dict_ord_template['oradores_o_d'], + 'decimo_terceiro_ordenacao': dict_ord_template['oradores_expli'], + 'decimo_quarto_ordenacao': dict_ord_template['ocorr_sessao'] }) else: context.update( @@ -1769,8 +1828,9 @@ class ResumoView(DetailView): 'nono_ordenacao': dict_ord_template['lista_p_o_d'], 'decimo_ordenacao': dict_ord_template['mat_o_d'], 'decimo_primeiro_ordenacao': dict_ord_template['v_n_mat_o_d'], - 'decimo_segundo_ordenacao': dict_ord_template['oradores_expli'], - 'decimo_terceiro_ordenacao': dict_ord_template['ocorr_sessao'] + 'decimo_segundo_ordenacao': dict_ord_template['oradores_o_d'], + 'decimo_terceiro_ordenacao': dict_ord_template['oradores_expli'], + 'decimo_quarto_ordenacao': dict_ord_template['ocorr_sessao'] }) return context diff --git a/sapl/templates/relatorios/relatorio_ata.html b/sapl/templates/relatorios/relatorio_ata.html index 7d6c45d7b..05c5355c4 100644 --- a/sapl/templates/relatorios/relatorio_ata.html +++ b/sapl/templates/relatorios/relatorio_ata.html @@ -46,6 +46,7 @@ {% include 'sessao/blocos_ata/oradores_expediente.html' %} {% include 'sessao/blocos_ata/lista_presenca_ordem_dia.html' %} {% include 'sessao/blocos_ata/materias_ordem_dia.html' %} + {% include 'sessao/blocos_ata/oradores_ordemdia.html' %} {% include 'sessao/blocos_ata/oradores_explicacoes.html' %} {% include 'sessao/blocos_ata/ocorrencias_da_sessao.html' %} diff --git a/sapl/templates/sessao/blocos_ata/oradores_ordemdia.html b/sapl/templates/sessao/blocos_ata/oradores_ordemdia.html new file mode 100644 index 000000000..62ec92e81 --- /dev/null +++ b/sapl/templates/sessao/blocos_ata/oradores_ordemdia.html @@ -0,0 +1,13 @@ +
+

+ {% if oradores_ordemdia %} + Oradores da Ordem do Dia: + {% for orador in oradores_ordemdia %} +

{{ orador.numero_ordem }} - {{ orador.parlamentar.nome_completo }}
+
{{ orador.url_discurso }}
+
{{ orador.observacao }}
+
+ {% endfor %} + {% endif %} +

+
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html b/sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html new file mode 100644 index 000000000..a1898cce0 --- /dev/null +++ b/sapl/templates/sessao/blocos_resumo/oradores_ordemdia.html @@ -0,0 +1,15 @@ +
+ Oradores da Ordem do Dia +
+
Parlamentar
+
Discurso
+
Observação
+
+
+ {% for orador in oradores_ordemdia %} +
{{ orador.numero_ordem }} - {{ orador.parlamentar }}
+
{{ orador.url_discurso }}
+
{{ orador.observacao }}
+ {% endfor %} +
+
\ No newline at end of file diff --git a/sapl/templates/sessao/layouts.yaml b/sapl/templates/sessao/layouts.yaml index 55e0db570..98307d74d 100644 --- a/sapl/templates/sessao/layouts.yaml +++ b/sapl/templates/sessao/layouts.yaml @@ -39,6 +39,12 @@ OradorExpediente: - url_discurso observacao - upload_anexo +OradorOrdemDia: + {% trans 'Orador da Ordem do Dia' %}: + - numero_ordem parlamentar + - url_discurso observacao + - upload_anexo + ExpedienteMateria: {% trans 'Matéria do Expediente' %}: - data_ordem numero_ordem diff --git a/sapl/templates/sessao/resumo.html b/sapl/templates/sessao/resumo.html index bcedeedb8..0be605eb8 100644 --- a/sapl/templates/sessao/resumo.html +++ b/sapl/templates/sessao/resumo.html @@ -58,5 +58,8 @@ {% include 'sessao/blocos_resumo/'|add:decimo_terceiro_ordenacao %}


+ + {% include 'sessao/blocos_resumo/'|add:decimo_quarto_ordenacao %} +


{% endblock detail_content %} diff --git a/sapl/templates/sessao/resumo_ata.html b/sapl/templates/sessao/resumo_ata.html index 12507b79a..2f450b97e 100644 --- a/sapl/templates/sessao/resumo_ata.html +++ b/sapl/templates/sessao/resumo_ata.html @@ -32,5 +32,6 @@ {% include 'sessao/blocos_ata/'|add:decimo_primeiro_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_segundo_ordenacao %} {% include 'sessao/blocos_ata/'|add:decimo_terceiro_ordenacao %} + {% include 'sessao/blocos_ata/'|add:decimo_quarto_ordenacao %} {% include 'sessao/blocos_ata/assinaturas.html' %} {% endblock detail_content %} diff --git a/sapl/templates/sessao/subnav.yaml b/sapl/templates/sessao/subnav.yaml index 1decc0ded..28717e4ab 100644 --- a/sapl/templates/sessao/subnav.yaml +++ b/sapl/templates/sessao/subnav.yaml @@ -35,6 +35,8 @@ url: ordemdia_list - title: {% trans 'Presença Ordem do Dia' %} url: presencaordemdia + - title: {% trans 'Oradores da Ordem do Dia' %} + url: oradorordemdia_list - title: {% trans 'Votação em Bloco' %} url: votacao_bloco_ordemdia check_permission: sessao.add_sessaoplenaria From 9405129d1874b01ac3e4874341d261f57ae62fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Cantu=C3=A1ria?= Date: Wed, 3 Apr 2019 11:39:09 -0300 Subject: [PATCH 2/6] =?UTF-8?q?Separa=20cria=C3=A7=C3=A3o=20de=20mandato?= =?UTF-8?q?=20e=20parlamentar=20(#2579)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix #2536 Adiciona cadastro de parlamentar na tabelas auxiliares Remoção de mandato na criação do parlamentar Corrige testes Corrige título no CRUD de parlamentar Corrige identação Adiciona botão de criação de parlamentar após pesquisa Corrige botões em parlamentares Altera nomes Remove intermediário para vinculação de parlamentar Arruma bug Altera redirecionamento para detales de parlamentar Início da criação do form e view de vincular parlamentar Corrige VincularParlamentarForm Corrige VincularParlamentarView Adiciona html de vincular parlamentar Mostrar somente parlamentares ativos Cria variável data_expedicao_diploma Compara mandato por legislatura invés de data Corrige verificação de existencia de chave no dicionário Adiciona data fim do mandato na criação do mandato Adiciona restrição para usuário não logado Co-authored-by: UlyssesBML Co-authored-by: Ricardo Lima Canela --- sapl/parlamentares/forms.py | 62 +++++++++++++++++++ sapl/parlamentares/urls.py | 5 +- sapl/parlamentares/views.py | 30 ++++++++- sapl/templates/parlamentares/layouts.yaml | 8 +-- .../parlamentares/parlamentar_filter.html | 44 ++++++------- .../parlamentares/parlamentares_list.html | 9 +++ .../parlamentares/vincular_parlamentar.html | 8 +++ 7 files changed, 137 insertions(+), 29 deletions(-) create mode 100644 sapl/templates/parlamentares/vincular_parlamentar.html diff --git a/sapl/parlamentares/forms.py b/sapl/parlamentares/forms.py index c9d5d828d..e1e773d9b 100755 --- a/sapl/parlamentares/forms.py +++ b/sapl/parlamentares/forms.py @@ -525,3 +525,65 @@ class VotanteForm(ModelForm): votante.user = u votante.save() return votante + + +class VincularParlamentarForm(forms.Form): + logger = logging.getLogger(__name__) + + parlamentar = forms.ModelChoiceField( + label=Parlamentar._meta.verbose_name, + queryset=Parlamentar.objects.filter(ativo=True), + required=True, + empty_label='Selecione' + ) + + legislatura = forms.ModelChoiceField( + label=Legislatura._meta.verbose_name, + queryset=Legislatura.objects.all(), + required=True, + empty_label='Selecione' + ) + + data_expedicao_diploma = forms.DateField( + label='Data de Expedição do Diploma', + required=False, + widget=forms.DateInput(format='%d/%m/%Y') + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + row1 = to_row([ + ('parlamentar', 6), + ('legislatura', 3), + ('data_expedicao_diploma', 3) + ]) + + self.helper = SaplFormHelper() + self.helper.layout = Layout( + Fieldset( + 'Vincular Parlamentar', + row1, + form_actions(label='Vincular') + ) + ) + + def clean(self): + super().clean() + + if not self.is_valid(): + return self.cleaned_data + + cleaned_data = self.cleaned_data + parlamentar = cleaned_data['parlamentar'] + legislatura = cleaned_data['legislatura'] + data_expedicao_diploma = cleaned_data['data_expedicao_diploma'] + + if parlamentar.mandato_set.filter(legislatura=legislatura): + self.logger.error('Parlamentar já está vinculado a legislatura informada.') + raise ValidationError(_('Parlamentar já está vinculado a legislatura informada.')) + elif data_expedicao_diploma and legislatura.data_inicio <= data_expedicao_diploma: + self.logger.error('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.') + raise ValidationError(_('Data da Expedição do Diploma deve ser anterior a data de início da Legislatura.')) + + return cleaned_data diff --git a/sapl/parlamentares/urls.py b/sapl/parlamentares/urls.py index 668a65653..51fb856b4 100644 --- a/sapl/parlamentares/urls.py +++ b/sapl/parlamentares/urls.py @@ -19,7 +19,7 @@ from sapl.parlamentares.views import (CargoMesaCrud, ColigacaoCrud, parlamentares_frente_selected, remove_parlamentar_composicao, parlamentares_filiados, - PesquisarParlamentarView) + PesquisarParlamentarView, VincularParlamentarView) from .apps import AppConfig @@ -41,6 +41,9 @@ urlpatterns = [ url(r'^parlamentar/(?P\d+)/materias$', ParlamentarMateriasView.as_view(), name='parlamentar_materias'), + url(r'^parlamentar/vincular-parlamentar/$', + VincularParlamentarView.as_view(), name='vincular_parlamentar'), + url(r'^sistema/coligacao/', include(ColigacaoCrud.get_urls() + ComposicaoColigacaoCrud.get_urls())), diff --git a/sapl/parlamentares/views.py b/sapl/parlamentares/views.py index 772f06eaa..d5e8cc41a 100644 --- a/sapl/parlamentares/views.py +++ b/sapl/parlamentares/views.py @@ -3,6 +3,7 @@ import json import logging from django.contrib import messages +from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.contenttypes.models import ContentType from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.core.urlresolvers import reverse, reverse_lazy @@ -33,7 +34,7 @@ from sapl.parlamentares.apps import AppConfig from sapl.utils import (parlamentares_ativos, show_results_filter_set) from .forms import (FiliacaoForm, FrenteForm, LegislaturaForm, MandatoForm, - ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet) + ParlamentarCreateForm, ParlamentarForm, VotanteForm, ParlamentarFilterSet, VincularParlamentarForm) from .models import (CargoMesa, Coligacao, ComposicaoColigacao, ComposicaoMesa, Dependente, Filiacao, Frente, Legislatura, Mandato, NivelInstrucao, Parlamentar, Partido, SessaoLegislativa, @@ -1132,3 +1133,30 @@ def altera_field_mesa_public_view(request): 'lista_fotos': lista_fotos, 'sessao_selecionada': sessao_selecionada, 'msg': ('', 1)}) + + +class VincularParlamentarView(PermissionRequiredMixin, FormView): + logger = logging.getLogger(__name__) + form_class = VincularParlamentarForm + template_name = 'parlamentares/vincular_parlamentar.html' + permission_required = ('parlamentares.add_parlamentar', ) + + def get_success_url(self): + return reverse('sapl.parlamentares:parlamentar_list') + + def form_valid(self, form): + kwargs = { + 'parlamentar': form.cleaned_data['parlamentar'], + 'legislatura': form.cleaned_data['legislatura'], + 'data_inicio_mandato': form.cleaned_data['legislatura'].data_inicio, + 'data_fim_mandato': form.cleaned_data['legislatura'].data_fim + } + + data_expedicao_diploma = form.cleaned_data.get('data_expedicao_diploma') + if data_expedicao_diploma: + kwargs.update({'data_expedicao_diploma': data_expedicao_diploma}) + + mandato = Mandato.objects.create(**kwargs) + mandato.save() + + return HttpResponseRedirect(self.get_success_url()) diff --git a/sapl/templates/parlamentares/layouts.yaml b/sapl/templates/parlamentares/layouts.yaml index ded7ca647..030e32758 100644 --- a/sapl/templates/parlamentares/layouts.yaml +++ b/sapl/templates/parlamentares/layouts.yaml @@ -30,7 +30,7 @@ SessaoLegislativa: - data_inicio_intervalo data_fim_intervalo Parlamentar: - {% trans 'Cadastro do Parlamentar' %}: + {% trans 'Dados do Parlamentar' %}: - nome_parlamentar:8 ativo - nome_completo - nivel_instrucao sexo data_nascimento @@ -47,7 +47,7 @@ Parlamentar: - biografia ParlamentarUpdate: - {% trans 'Cadastro do Parlamentar' %}: + {% trans 'Dados do Parlamentar' %}: - nome_parlamentar:8 ativo - nome_completo - nivel_instrucao sexo data_nascimento @@ -64,9 +64,7 @@ ParlamentarUpdate: - biografia ParlamentarCreate: - {% trans 'Dados do Mandato' %}: - - legislatura data_expedicao_diploma - {% trans 'Cadastro do Parlamentar' %}: + {% trans 'Dados do Parlamentar' %}: - nome_parlamentar:8 ativo - nome_completo - nivel_instrucao sexo data_nascimento diff --git a/sapl/templates/parlamentares/parlamentar_filter.html b/sapl/templates/parlamentares/parlamentar_filter.html index 9a3ea54f7..dd6af7034 100644 --- a/sapl/templates/parlamentares/parlamentar_filter.html +++ b/sapl/templates/parlamentares/parlamentar_filter.html @@ -5,44 +5,44 @@ {% block base_content %} {% if not show_results %} {% crispy filter.form %} - {% endif %} - - {% if show_results %} -
+ {% else %} + -

+ {% if not request.user.is_anonymous %} + Cadastrar Parlamentar + {% endif %} +
+
{% if numero_res > 0 %} {% if numero_res == 1 %}

Foi encontrado {{ numero_res }} resultado

{% else %}

Foram encontrados {{ numero_res }} resultados

{% endif %} - - - - +
Nome do Parlamentar
+ + + - - - - {% for usuario in page_obj %} - - + + + {% for usuario in page_obj %} + + - - {% endfor %} - -
Nome do Parlamentar Nome Completo Ativo
+
{{usuario.nome_parlamentar}} {{ usuario.nome_completo }} {% if usuario.ativo %} Sim {% else %} Não {% endif %}
+ + {% endfor %} + + {% else %}

{{ NO_ENTRIES_MSG }}

- {% endif %} + {% endif %} {% endif %} -
{% include 'paginacao.html'%}


diff --git a/sapl/templates/parlamentares/parlamentares_list.html b/sapl/templates/parlamentares/parlamentares_list.html index 88ad4acfe..a91d50da9 100644 --- a/sapl/templates/parlamentares/parlamentares_list.html +++ b/sapl/templates/parlamentares/parlamentares_list.html @@ -1,6 +1,15 @@ {% extends "crud/list.html" %} {% load i18n %} {% load crispy_forms_tags cropping%} +{% block actions %} +
+ Pesquisar Parlamentar + {% if not request.user.is_anonymous %} + Vincular Parlamentar + {% endif %} + {% block more_buttons %}{% endblock more_buttons %} +
+{% endblock actions %} {% block extra_content %}
Selecione o Período diff --git a/sapl/templates/parlamentares/vincular_parlamentar.html b/sapl/templates/parlamentares/vincular_parlamentar.html new file mode 100644 index 000000000..6ba8948dd --- /dev/null +++ b/sapl/templates/parlamentares/vincular_parlamentar.html @@ -0,0 +1,8 @@ +{% extends "crud/form.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load common_tags %} + +{% block detail_content %} + {% crispy form %} +{% endblock detail_content %} \ No newline at end of file From b9f7f06e00c3a451fc9968708e15e4b45fbad4e6 Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 3 Apr 2019 13:20:58 -0300 Subject: [PATCH 3/6] Release: 3.1.151 --- docker-compose.yml | 2 +- sapl/settings.py | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5ef3b240e..4be453668 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.150 + image: interlegis/sapl:3.1.151 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/settings.py b/sapl/settings.py index 8bad6c92e..7d414cdbf 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.150' +SAPL_VERSION = '3.1.151' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 2fa19c1cd..1944d53ea 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -179,7 +179,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.150 + Release: 3.1.151

diff --git a/setup.py b/setup.py index 1edc89a91..57429e5a0 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.150', + version='3.1.151', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From f823cd56d70d131986694fd7b2e590d089be558e Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Wed, 3 Apr 2019 15:02:08 -0300 Subject: [PATCH 4/6] HOT-FIX: conserta PDF de extrato --- sapl/relatorios/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 72ef64e45..117b7a172 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -28,11 +28,11 @@ from sapl.settings import STATIC_ROOT from sapl.utils import LISTA_DE_UFS, TrocaTag, filiacao_data from sapl.sessao.views import (get_identificação_basica, get_mesa_diretora, - get_presenca_sessao,get_expedientes, - get_materias_expediente,get_oradores_expediente, + get_presenca_sessao, get_expedientes, + get_materias_expediente, get_oradores_expediente, get_presenca_ordem_do_dia, get_materias_ordem_do_dia, get_oradores_ordemdia, - get_oradores_explicações_pessoais, get_ocorrencias_da_sessão) + get_oradores_explicações_pessoais, get_ocorrencias_da_sessão, get_assinaturas) from .templates import (pdf_capa_processo_gerar, pdf_documento_administrativo_gerar, pdf_espelho_gerar, From 9751df62040d2dc7dc6610480cde8adb32236b0a Mon Sep 17 00:00:00 2001 From: Victor Fabre Date: Thu, 4 Apr 2019 11:12:58 -0300 Subject: [PATCH 5/6] Release: 3.1.152 --- docker-compose.yml | 2 +- sapl/settings.py | 2 +- sapl/templates/base.html | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4be453668..edc04b07e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ sapldb: ports: - "5432:5432" sapl: - image: interlegis/sapl:3.1.151 + image: interlegis/sapl:3.1.152 restart: always environment: ADMIN_PASSWORD: interlegis diff --git a/sapl/settings.py b/sapl/settings.py index 7d414cdbf..057e8ec75 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -41,7 +41,7 @@ ALLOWED_HOSTS = ['*'] LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/?next=' -SAPL_VERSION = '3.1.151' +SAPL_VERSION = '3.1.152' if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/sapl/templates/base.html b/sapl/templates/base.html index 1944d53ea..3048f83b2 100644 --- a/sapl/templates/base.html +++ b/sapl/templates/base.html @@ -179,7 +179,7 @@ Desenvolvido pelo Interlegis em software livre e aberto. - Release: 3.1.151 + Release: 3.1.152

diff --git a/setup.py b/setup.py index 57429e5a0..c2818b7ab 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ install_requires = [ ] setup( name='interlegis-sapl', - version='3.1.151', + version='3.1.152', packages=find_packages(), include_package_data=True, license='GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007', From 84b56a37eccf42860916a30850e501baa8ab641e Mon Sep 17 00:00:00 2001 From: Edward Ribeiro Date: Thu, 4 Apr 2019 15:39:29 -0300 Subject: [PATCH 6/6] HOT-FIX: fixes #2686 --- sapl/materia/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapl/materia/views.py b/sapl/materia/views.py index 73dcb3072..e30b756fb 100644 --- a/sapl/materia/views.py +++ b/sapl/materia/views.py @@ -1987,7 +1987,7 @@ class DocumentoAcessorioEmLoteView(PermissionRequiredMixin, FilterView): 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)