From 360e0124a13583a377c9493f8fa5286f850db966 Mon Sep 17 00:00:00 2001 From: Ulysses Lara Date: Wed, 10 Jul 2019 09:17:20 -0300 Subject: [PATCH] =?UTF-8?q?Limite=20e=20valida=C3=A7=C3=A3o=20de=20upload?= =?UTF-8?q?=20de=20arquivos=20PDF=20(#2885)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * HOT-FIX - Aumentando limite de upload de arquivos * Adcionando validação para upload de arquivos sessão plenaria * Adicionar validação upload arquivos - audiencia * Adicionar validação upload arquivos - comissoes * Adicionar validação upload arquivos - materia * Adicionar validação upload arquivos - norma * Adicionar validação upload arquivos - protocoloadm * Adicionar validação upload arquivos - sessao --- sapl/audiencia/forms.py | 33 +++++++++++++++++++++++++-- sapl/comissoes/forms.py | 46 ++++++++++++++++++++++++++++++++++++++ sapl/materia/forms.py | 31 ++++++++++++++++++++----- sapl/norma/forms.py | 22 +++++++++--------- sapl/protocoloadm/forms.py | 21 +++++++++++++++++ sapl/sessao/forms.py | 43 +++++++++++++++++++++++++++++++++++ sapl/settings.py | 2 +- 7 files changed, 177 insertions(+), 21 deletions(-) diff --git a/sapl/audiencia/forms.py b/sapl/audiencia/forms.py index 56f4d1285..d62900df6 100755 --- a/sapl/audiencia/forms.py +++ b/sapl/audiencia/forms.py @@ -1,6 +1,7 @@ import logging from django import forms +from sapl.settings import MAX_DOC_UPLOAD_SIZE from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import transaction from django.utils.translation import ugettext_lazy as _ @@ -106,8 +107,6 @@ class AudienciaForm(FileFieldCheckMixin, forms.ModelForm): else: cleaned_data['numero'] = 1 - - if self.cleaned_data['hora_inicio'] and self.cleaned_data['hora_fim']: if (self.cleaned_data['hora_fim'] < self.cleaned_data['hora_inicio']): @@ -116,6 +115,22 @@ class AudienciaForm(FileFieldCheckMixin, forms.ModelForm): self.logger.error('Hora de fim anterior à hora de início.') raise ValidationError(msg) + upload_pauta = self.cleaned_data.get('upload_pauta', False) + upload_ata = self.cleaned_data.get('upload_ata', False) + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_pauta and upload_pauta.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Pauta da Audiência Pública deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_pauta.size/1024)/1024)) + + if upload_ata and upload_ata.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Ata da Audiência Pública deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_ata.size/1024)/1024)) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo da Audiência Pública deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + return cleaned_data @@ -140,3 +155,17 @@ class AnexoAudienciaPublicaForm(forms.ModelForm): row1, row2)) super(AnexoAudienciaPublicaForm, self).__init__( *args, **kwargs) + + def clean(self): + super(AnexoAudienciaPublicaForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + arquivo = self.cleaned_data.get('arquivo', False) + + if arquivo and arquivo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (arquivo.size/1024)/1024)) + + return self.cleaned_data diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py index e999f0b8d..9f7c449f8 100644 --- a/sapl/comissoes/forms.py +++ b/sapl/comissoes/forms.py @@ -1,6 +1,7 @@ import logging from django import forms +from sapl.settings import MAX_DOC_UPLOAD_SIZE from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import transaction @@ -381,6 +382,23 @@ class ReuniaoForm(ModelForm): self.logger.error("A hora de término da reunião ({}) não pode ser menor que a de início ({})." .format(self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio'])) raise ValidationError(msg) + + upload_pauta = self.cleaned_data.get('upload_pauta', False) + upload_ata = self.cleaned_data.get('upload_ata', False) + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_pauta and upload_pauta.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Pauta da Reunião deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_pauta.size/1024)/1024)) + + if upload_ata and upload_ata.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Ata da Reunião deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_ata.size/1024)/1024)) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo da Reunião deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + return self.cleaned_data @@ -412,6 +430,20 @@ class DocumentoAcessorioCreateForm(FileFieldCheckMixin, forms.ModelForm): def create_documentoacessorio(self): reuniao = Reuniao.objects.get(id=self.initial['parent_pk']) + def clean(self): + super(DocumentoAcessorioCreateForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + arquivo = self.cleaned_data.get('arquivo', False) + + if arquivo and arquivo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Texto Integral deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (arquivo.size/1024)/1024)) + + return self.cleaned_data + class DocumentoAcessorioEditForm(FileFieldCheckMixin, forms.ModelForm): @@ -424,3 +456,17 @@ class DocumentoAcessorioEditForm(FileFieldCheckMixin, forms.ModelForm): def __init__(self, user=None, **kwargs): super(DocumentoAcessorioEditForm, self).__init__(**kwargs) + + def clean(self): + super(DocumentoAcessorioEditForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + arquivo = self.cleaned_data.get('arquivo', False) + + if arquivo and arquivo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Texto Integral deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (arquivo.size/1024)/1024)) + + return self.cleaned_data diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 1cfbbb000..85e202139 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -249,6 +249,12 @@ class MateriaLegislativaForm(FileFieldCheckMixin, ModelForm): "pode ser diferente do ano na data de " "origem externa")) + texto_original = self.cleaned_data.get('texto_original', False) + + if texto_original and texto_original.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Texto Original deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (texto_original.size/1024)/1024)) + return cleaned_data def save(self, commit=False): @@ -338,6 +344,20 @@ class DocumentoAcessorioForm(FileFieldCheckMixin, ModelForm): class Meta: model = DocumentoAcessorio fields = ['tipo', 'nome', 'data', 'autor', 'ementa', 'arquivo'] + + def clean(self): + super(DocumentoAcessorioForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + arquivo = self.cleaned_data.get('arquivo', False) + + if arquivo and arquivo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Texto Integral deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (arquivo.size/1024)/1024)) + + return self.cleaned_data class RelatoriaForm(ModelForm): @@ -1801,7 +1821,6 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): 'observacao', 'texto_original', 'materia_de_vinculo', - 'tipo_materia', 'numero_materia', 'ano_materia', @@ -1889,12 +1908,11 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): def clean_texto_original(self): texto_original = self.cleaned_data.get('texto_original', False) + if texto_original and texto_original.size > MAX_DOC_UPLOAD_SIZE: - max_size = str(MAX_DOC_UPLOAD_SIZE / (1024 * 1024)) - self.logger.error( - "- Arquivo muito grande. ( > {0}MB )".format(max_size)) - raise ValidationError( - "Arquivo muito grande. ( > {0}MB )".format(max_size)) + raise ValidationError("O arquivo Texto Original deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (texto_original.size/1024)/1024)) + return texto_original def gerar_hash(self, inst, receber_recibo): @@ -1948,6 +1966,7 @@ class ProposicaoForm(FileFieldCheckMixin, forms.ModelForm): self.logger.info("MateriaLegislativa vinculada (tipo_id={}, ano={}, numero={}) com sucesso." .format(tm, am, nm)) cd['materia_de_vinculo'] = materia_de_vinculo + return cd def save(self, commit=True): diff --git a/sapl/norma/forms.py b/sapl/norma/forms.py index 0dfcbd417..128bdbf49 100644 --- a/sapl/norma/forms.py +++ b/sapl/norma/forms.py @@ -205,13 +205,11 @@ class NormaJuridicaForm(FileFieldCheckMixin, ModelForm): super(NormaJuridicaForm, self).clean() texto_integral = self.cleaned_data.get('texto_integral', False) + if texto_integral and texto_integral.size > MAX_DOC_UPLOAD_SIZE: - max_size = str(MAX_DOC_UPLOAD_SIZE / (1024 * 1024)) - tam_fornecido = str(texto_integral.size / (1024 * 1024)) - self.logger.error("Arquivo muito grande ({}MB). ( Tamanho máximo permitido: {}MB )".format( - tam_fornecido, max_size)) - raise ValidationError( - "Arquivo muito grande. ( > {0}MB )".format(max_size)) + raise ValidationError("O arquivo Texto Integral deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (texto_integral.size/1024)/1024)) + return texto_integral def save(self, commit=False): @@ -285,16 +283,16 @@ class AnexoNormaJuridicaForm(FileFieldCheckMixin, ModelForm): def clean(self): cleaned_data = super(AnexoNormaJuridicaForm, self).clean() + if not self.is_valid(): return cleaned_data + anexo_arquivo = self.cleaned_data.get('anexo_arquivo', False) + if anexo_arquivo and anexo_arquivo.size > MAX_DOC_UPLOAD_SIZE: - max_size = str(MAX_DOC_UPLOAD_SIZE / (1024 * 1024)) - tam_fornecido = str(anexo_arquivo.size / (1024 * 1024)) - self.logger.error("Arquivo muito grande ({}MB). ( Tamanho máximo permitido: {}MB )".format( - tam_fornecido, max_size)) - raise ValidationError( - "Arquivo muito grande. ( > {0}MB )".format(max_size)) + raise ValidationError("O Arquivo Anexo deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (anexo_arquivo.size/1024)/1024)) + return cleaned_data def save(self, commit=False): diff --git a/sapl/protocoloadm/forms.py b/sapl/protocoloadm/forms.py index 52332dcbb..859de2850 100644 --- a/sapl/protocoloadm/forms.py +++ b/sapl/protocoloadm/forms.py @@ -5,6 +5,7 @@ from crispy_forms.bootstrap import InlineRadios, Alert, FormActions from sapl.crispy_layout_mixin import SaplFormHelper from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout, Div, Submit from django import forms +from sapl.settings import MAX_DOC_UPLOAD_SIZE from django.core.exceptions import (MultipleObjectsReturned, ObjectDoesNotExist, ValidationError) from django.db import models, transaction @@ -657,6 +658,20 @@ class DocumentoAcessorioAdministrativoForm(FileFieldCheckMixin, ModelForm): 'data': forms.DateInput(format='%d/%m/%Y') } + def clean(self): + super(DocumentoAcessorioAdministrativoForm, self).clean() + + if not self.is_valid(): + return self.cleaned_data + + arquivo = self.cleaned_data.get('arquivo', False) + + if arquivo and arquivo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (arquivo.size/1024)/1024)) + + return self.cleaned_data + class TramitacaoAdmForm(ModelForm): @@ -1142,6 +1157,12 @@ class DocumentoAdministrativoForm(FileFieldCheckMixin, ModelForm): ' documento vinculado' % (numero_protocolo, ano_protocolo))) + texto_integral = self.cleaned_data.get('texto_integral', False) + + if texto_integral and texto_integral.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Texto Integral deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (texto_integral.size/1024)/1024)) + return self.cleaned_data def save(self, commit=True): diff --git a/sapl/sessao/forms.py b/sapl/sessao/forms.py index ec9ab1267..570a706c4 100644 --- a/sapl/sessao/forms.py +++ b/sapl/sessao/forms.py @@ -11,6 +11,7 @@ from django.forms.widgets import CheckboxSelectMultiple from django.utils.translation import ugettext_lazy as _ import django_filters +from sapl.settings import MAX_DOC_UPLOAD_SIZE from sapl.base.models import Autor, TipoAutor from sapl.crispy_layout_mixin import SaplFormHelper from sapl.crispy_layout_mixin import form_actions, to_row, SaplFormLayout @@ -149,6 +150,24 @@ class SessaoPlenariaForm(FileFieldCheckMixin, ModelForm): "entre a data de início e fim tanto da " "Legislatura quanto da Sessão Legislativa.") + + upload_pauta = self.cleaned_data.get('upload_pauta', False) + upload_ata = self.cleaned_data.get('upload_ata', False) + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_pauta and upload_pauta.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Pauta da Sessão deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_pauta.size/1024)/1024)) + + if upload_ata and upload_ata.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Ata da Sessão deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_ata.size/1024)/1024)) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo da Sessão deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + + return self.cleaned_data @@ -603,6 +622,12 @@ class OradorForm(ModelForm): "Já existe orador nesta posição de ordem de pronunciamento" )) + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo do Orador deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + return self.cleaned_data class Meta: @@ -638,6 +663,12 @@ class OradorExpedienteForm(ModelForm): raise ValidationError(_( 'Já existe orador nesta posição da ordem de pronunciamento')) + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo do Orador deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + return self.cleaned_data class Meta: @@ -675,6 +706,12 @@ class OradorOrdemDiaForm(ModelForm): "Já existe orador nesta posição de ordem de pronunciamento" )) + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo do Orador deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + return self.cleaned_data class Meta: @@ -773,6 +810,12 @@ class JustificativaAusenciaForm(ModelForm): sessao_plenaria = self.instance.sessao_plenaria + upload_anexo = self.cleaned_data.get('upload_anexo', False) + + if upload_anexo and upload_anexo.size > MAX_DOC_UPLOAD_SIZE: + raise ValidationError("O arquivo Anexo de Justificativa deve ser menor que {0:.1f} mb, o tamanho atual desse arquivo é {1:.1f} mb" \ + .format((MAX_DOC_UPLOAD_SIZE/1024)/1024, (upload_anexo.size/1024)/1024)) + if not sessao_plenaria.finalizada or sessao_plenaria.finalizada is None: raise ValidationError( "A sessão deve estar finalizada para registrar uma Ausência") diff --git a/sapl/settings.py b/sapl/settings.py index 2f257a4e3..27d27ad8d 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -263,7 +263,7 @@ DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL', cast=str, default='') SERVER_EMAIL = config('SERVER_EMAIL', cast=str, default='') EMAIL_RUNNING = None -MAX_DOC_UPLOAD_SIZE = 60 * 1024 * 1024 # 60MB +MAX_DOC_UPLOAD_SIZE = 80 * 1024 * 1024 # 80MB MAX_IMAGE_UPLOAD_SIZE = 2 * 1024 * 1024 # 2MB # Internationalization