diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 25ec22949..7b5c00bf7 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1,4 +1,5 @@ import logging +import os from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton from sapl.crispy_layout_mixin import SaplFormHelper @@ -36,7 +37,7 @@ from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, RangeWidgetOverride, autor_label, autor_modal, models_with_gr_for_model, qs_override_django_filter, choice_anos_com_normas, choice_anos_com_materias, - FilterOverridesMetaMixin) + FilterOverridesMetaMixin, FileFieldCheckMixin) from .models import AppConfig, CasaLegislativa @@ -1108,7 +1109,7 @@ class RelatorioMateriasPorAutorFilterSet(django_filters.FilterSet): ) -class CasaLegislativaForm(ModelForm): +class CasaLegislativaForm(FileFieldCheckMixin, ModelForm): class Meta: @@ -1138,8 +1139,12 @@ class CasaLegislativaForm(ModelForm): } def clean_logotipo(self): - logotipo = self.cleaned_data.get('logotipo', False) + logotipo = self.cleaned_data.get('logotipo') if logotipo: + if not os.path.exists(logotipo.path): + raise ValidationError("Arquivo referenciado no campo " + " '%s' inexistente! Marque a " + "opção Limpar e Salve." % self.fields['logotipo'].label) if logotipo.size > MAX_IMAGE_UPLOAD_SIZE: raise ValidationError("Imagem muito grande. ( > 2MB )") return logotipo diff --git a/sapl/materia/forms.py b/sapl/materia/forms.py index 05e3d3161..ad1d77e46 100644 --- a/sapl/materia/forms.py +++ b/sapl/materia/forms.py @@ -45,7 +45,7 @@ from sapl.utils import (YES_NO_CHOICES, SEPARADOR_HASH_PROPOSICAO, MateriaPesquisaOrderingFilter, RangeWidgetOverride, autor_label, autor_modal, gerar_hash_arquivo, models_with_gr_for_model, qs_override_django_filter, - choice_anos_com_materias, FilterOverridesMetaMixin) + choice_anos_com_materias, FilterOverridesMetaMixin, FileFieldCheckMixin) from .models import (AcompanhamentoMateria, Anexada, Autoria, DespachoInicial, DocumentoAcessorio, Numeracao, Proposicao, Relatoria, @@ -122,7 +122,7 @@ class ReceberProposicaoForm(Form): super(ReceberProposicaoForm, self).__init__(*args, **kwargs) -class MateriaSimplificadaForm(ModelForm): +class MateriaSimplificadaForm(FileFieldCheckMixin, ModelForm): logger = logging.getLogger(__name__) @@ -175,7 +175,7 @@ class MateriaSimplificadaForm(ModelForm): return cleaned_data -class MateriaLegislativaForm(ModelForm): +class MateriaLegislativaForm(FileFieldCheckMixin, ModelForm): logger = logging.getLogger(__name__) diff --git a/sapl/utils.py b/sapl/utils.py index 16652698e..e0ff59c27 100644 --- a/sapl/utils.py +++ b/sapl/utils.py @@ -6,6 +6,9 @@ import re from unicodedata import normalize as unicodedata_normalize import unicodedata +from django.core.files.uploadedfile import UploadedFile +from django.forms import BaseForm + from sapl.crispy_layout_mixin import SaplFormHelper from crispy_forms.layout import HTML, Button from django import forms @@ -574,6 +577,29 @@ class NormaPesquisaOrderingFilter(django_filters.OrderingFilter): return super().filter(qs, _value) +class FileFieldCheckMixin(BaseForm): + def clean(self): + cleaned_data = super(FileFieldCheckMixin, self).clean() + for name, campo in self.fields.items(): + if isinstance(campo, forms.fields.FileField): + error = self.errors.get(name) + if error: + msgs = [e.replace('Certifique-se de que o arquivo', + "Certifique-se de que o nome do " + "arquivo no campo '{}'".format( + campo.label)) + for e in error] + raise ValidationError(msgs) + + arquivo = self.cleaned_data.get(name) + if arquivo and not isinstance(arquivo, UploadedFile): + if not os.path.exists(arquivo.path): + raise ValidationError("Arquivo referenciado no campo " + " '%s' inexistente! Marque a " + "opção Limpar e Salve." % campo.label) + return cleaned_data + + class AnoNumeroOrderingFilter(django_filters.OrderingFilter): choices = (('DEC', 'Ordem Decrescente'),