From c43b45a0e4434a43a2991f9391720df94a0bac0f Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 9 Dec 2021 12:39:04 +0100 Subject: [PATCH 1/2] #46 MIME Type check * adds file mime type check on NewDocumentForm * adds file size check on NewDocumentForm * adds is_xy_valid methods as classmethods on AbstractDocument * adds translations for error messages * updates help text on NewDocumentForm file field --- konova/forms.py | 24 ++++++++++++++++++++++- konova/models/document.py | 19 ++++++++++++++++++ locale/de/LC_MESSAGES/django.mo | Bin 27644 -> 28052 bytes locale/de/LC_MESSAGES/django.po | 33 +++++++++++++++++++++++--------- 4 files changed, 66 insertions(+), 10 deletions(-) diff --git a/konova/forms.py b/konova/forms.py index 95cf590..359b78b 100644 --- a/konova/forms.py +++ b/konova/forms.py @@ -354,7 +354,7 @@ class NewDocumentForm(BaseModalForm): file = forms.FileField( label=_("File"), label_suffix=_(""), - help_text=_("Must be smaller than 15 Mb"), + help_text=_("Allowed formats: pdf, jpg, png. Max size 15 MB."), widget=forms.FileInput( attrs={ "class": "form-control-file", @@ -391,6 +391,28 @@ class NewDocumentForm(BaseModalForm): if not self.document_model: raise NotImplementedError("Unsupported document type for {}".format(self.instance.__class__)) + def is_valid(self): + super_valid = super().is_valid() + + _file = self.cleaned_data.get("file", None) + + mime_type_valid = self.document_model.is_mime_type_valid(_file) + if not mime_type_valid: + self.add_error( + "file", + _("Unsupported file type") + ) + + file_size_valid = self.document_model.is_file_size_valid(_file) + if not file_size_valid: + self.add_error( + "file", + _("File too large") + ) + + file_valid = mime_type_valid and file_size_valid + return super_valid and file_valid + def save(self): with transaction.atomic(): action = UserActionLogEntry.get_created_action(self.user) diff --git a/konova/models/document.py b/konova/models/document.py index 11b6c06..59b84bb 100644 --- a/konova/models/document.py +++ b/konova/models/document.py @@ -5,6 +5,7 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 15.11.21 """ +import mimetypes import os from django.db import models @@ -62,6 +63,15 @@ class AbstractDocument(BaseResource): file = models.FileField() comment = models.TextField() + _accepted_mime_types = { + mimetypes.types_map[".pdf"], + mimetypes.types_map[".jpg"], + mimetypes.types_map[".jpeg"], + mimetypes.types_map[".png"], + } + # _maximum_file_size in MB + _maximum_file_size = 15 + class Meta: abstract = True @@ -82,3 +92,12 @@ class AbstractDocument(BaseResource): pass super().delete(using=using, keep_parents=keep_parents) + @classmethod + def is_mime_type_valid(cls, _file: str): + mime_type = _file.content_type + return mime_type in cls._accepted_mime_types + + @classmethod + def is_file_size_valid(cls, _file): + max_size = cls._maximum_file_size * pow(1000, 2) + return _file.size <= max_size diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index d5e0cf26971a00a4f68bdb18be011b046f64a128..bea21be232cddb49fe38ef32b85a9c5e0c0d48ab 100644 GIT binary patch delta 8970 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 83f193b..b194437 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-11-17 14:27+0100\n" +"POT-Creation-Date: 2021-12-09 12:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1311,7 +1311,7 @@ msgstr "Datum des Widerspruchs" msgid "Document" msgstr "Dokument" -#: intervention/forms/modalForms.py:140 konova/forms.py:357 +#: intervention/forms/modalForms.py:140 msgid "Must be smaller than 15 Mb" msgstr "Muss kleiner als 15 Mb sein" @@ -1333,7 +1333,7 @@ msgstr "Kompensationen und Zahlungen geprüft" msgid "Run check" msgstr "Prüfung vornehmen" -#: intervention/forms/modalForms.py:196 konova/forms.py:429 +#: intervention/forms/modalForms.py:196 konova/forms.py:451 msgid "" "I, {} {}, confirm that all necessary control steps have been performed by " "myself." @@ -1559,27 +1559,39 @@ msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?" msgid "File" msgstr "Datei" -#: konova/forms.py:397 +#: konova/forms.py:357 +msgid "Allowed formats: pdf, jpg, png. Max size 15 MB." +msgstr "Formate: pdf, jpg, png. Maximal 15 MB." + +#: konova/forms.py:403 +msgid "Unsupported file type" +msgstr "Dateiformat nicht unterstützt" + +#: konova/forms.py:410 +msgid "File too large" +msgstr "Datei zu groß" + +#: konova/forms.py:419 msgid "Added document" msgstr "Dokument hinzugefügt" -#: konova/forms.py:420 +#: konova/forms.py:442 msgid "Confirm record" msgstr "Verzeichnen bestätigen" -#: konova/forms.py:428 +#: konova/forms.py:450 msgid "Record data" msgstr "Daten verzeichnen" -#: konova/forms.py:435 +#: konova/forms.py:457 msgid "Confirm unrecord" msgstr "Entzeichnen bestätigen" -#: konova/forms.py:436 +#: konova/forms.py:458 msgid "Unrecord data" msgstr "Daten entzeichnen" -#: konova/forms.py:437 +#: konova/forms.py:459 msgid "I, {} {}, confirm that this data must be unrecorded." msgstr "" "Ich, {} {}, bestätige, dass diese Daten wieder entzeichnet werden müssen." @@ -3182,6 +3194,9 @@ msgstr "" msgid "A fontawesome icon field" msgstr "" +#~ msgid "No file given!" +#~ msgstr "Keine Datei angegeben!" + #~ msgid "Added payment" #~ msgstr "Zahlung hinzufügen" -- 2.38.5 From c93f16a598042691864652361c51878136b233ba Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 9 Dec 2021 13:19:52 +0100 Subject: [PATCH 2/2] #46 MIME Type check * adds unit tests for new methods in konova/tests/test_documents.py * refactors _accepted_mime_types of AbstractDocument into _valid_mime_types --- konova/models/document.py | 4 +- konova/tests/test_documents.py | 73 ++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 konova/tests/test_documents.py diff --git a/konova/models/document.py b/konova/models/document.py index 59b84bb..72b124d 100644 --- a/konova/models/document.py +++ b/konova/models/document.py @@ -63,7 +63,7 @@ class AbstractDocument(BaseResource): file = models.FileField() comment = models.TextField() - _accepted_mime_types = { + _valid_mime_types = { mimetypes.types_map[".pdf"], mimetypes.types_map[".jpg"], mimetypes.types_map[".jpeg"], @@ -95,7 +95,7 @@ class AbstractDocument(BaseResource): @classmethod def is_mime_type_valid(cls, _file: str): mime_type = _file.content_type - return mime_type in cls._accepted_mime_types + return mime_type in cls._valid_mime_types @classmethod def is_file_size_valid(cls, _file): diff --git a/konova/tests/test_documents.py b/konova/tests/test_documents.py new file mode 100644 index 0000000..e1f800e --- /dev/null +++ b/konova/tests/test_documents.py @@ -0,0 +1,73 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: michel.peltriaux@sgdnord.rlp.de +Created on: 09.12.21 + +""" +import mimetypes + +from django.core.files.uploadedfile import InMemoryUploadedFile + +from konova.models import AbstractDocument +from konova.tests.test_views import BaseTestCase + + +class TestCaseDocuments(BaseTestCase): + """ + Tests for the Documents functionalities + """ + + @classmethod + def setUpTestData(cls): + """ Creates a test file in memory for using in further tests + + Returns: + + """ + super().setUpTestData() + cls.max_file_size = AbstractDocument._maximum_file_size * pow(1000, 2) + cls.test_file = InMemoryUploadedFile( + charset="utf-8", + name="test_file", + size=cls.max_file_size, + file=None, + content_type=None, + field_name=None + ) + + def test_allowed_mime_types(self): + """ Unit test for mime type validity checker + + Checks that only as acceptable configured mime types of an AbstractDocument object will pass the + validity check. + + Returns: + + """ + accepted_mime_types = [] + for file_ending, mime_type in mimetypes.types_map.items(): + self.test_file.content_type = mime_type + valid = AbstractDocument.is_mime_type_valid(self.test_file) + if valid: + accepted_mime_types.append(mime_type) + accepted_mime_types = set(accepted_mime_types) + + self.assertEqual(accepted_mime_types, AbstractDocument._valid_mime_types) + + def test_max_file_size(self): + """ Unit test for maximum file size validity checker + + Returns: + + """ + # Test for exact maximum size + self.assertTrue(AbstractDocument.is_file_size_valid(self.test_file)) + + # Test for lower than maximum size + self.test_file.size = self.max_file_size - 1 + self.assertTrue(AbstractDocument.is_file_size_valid(self.test_file)) + + # Test for larger than maximum size + self.test_file.size = self.max_file_size + 1 + self.assertFalse(AbstractDocument.is_file_size_valid(self.test_file)) -- 2.38.5