diff --git a/hypha/public/forms/models.py b/hypha/public/forms/models.py index bd9b3abfcee610a633230b51dbec71f4451895c0..62812d68ac2451f63eeebff2c8b21dc6bea8ba83 100644 --- a/hypha/public/forms/models.py +++ b/hypha/public/forms/models.py @@ -5,6 +5,7 @@ from django.conf import settings from django.core.files.storage import get_storage_class from django.core.serializers.json import DjangoJSONEncoder from django.db import models +from django.core.exceptions import ValidationError from django.forms import FileField, FileInput from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ @@ -44,6 +45,19 @@ class ExtendedFormBuilder(FormBuilder): def create_document_field(self, field, options): return FileField(widget=FileInput(attrs={'accept': settings.FILE_ALLOWED_EXTENSIONS}), **options) + def clean(self): + cleaned_data = self.cleaned_data + for name, field in self.fields.items(): + if isinstance(field, FileField): + file_data = cleaned_data[name] + if file_data: + file_name = file_data.name + file_extension = file_name.split('.')[-1] + if file_extension not in settings.FILE_ALLOWED_EXTENSIONS: + self.add_error(name, f"File extension '{file_extension}' is not allowed. " + f"Allowed extensions are: '{', '.join(settings.FILE_ALLOWED_EXTENSIONS)}'") + return self.cleaned_data + @method_decorator(never_cache, name='serve') class FormPage(AbstractEmailForm, BasePage): @@ -70,6 +84,11 @@ class FormPage(AbstractEmailForm, BasePage): ], "Email"), ] + def get_form(self, *args, **kwargs): + form = super(FormPage, self).get_form(*args, **kwargs) + form.clean = self.form_builder.clean.__get__(form) + return form + def process_form_submission(self, form): cleaned_data = form.cleaned_data