Compare commits

...

5 Commits

Author SHA1 Message Date
Raphael Michel
6035a11a24 Bump version to 2023.9.1 2024-02-21 15:02:46 +01:00
Raphael Michel
40fbbdc6cf CachedFileField: Do not store file that does not pass validation 2024-02-21 15:02:40 +01:00
Mira Weller
767c6feda6 forms: fix image file upload in CachedFileField 2024-02-21 15:02:40 +01:00
Mira Weller
60035ab7cf forms: fix bound data retrieval of CachedFile
when re-submitting a form a second time, the cached file got lost
2024-02-21 15:02:40 +01:00
Mira Weller
168af93825 forms: fix file type validation on CachedFileInput 2024-02-21 15:02:40 +01:00
3 changed files with 20 additions and 8 deletions

View File

@@ -19,4 +19,4 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
__version__ = "2023.9.0"
__version__ = "2023.9.1"

View File

@@ -219,15 +219,17 @@ class ExtValidationMixin:
def clean(self, *args, **kwargs):
data = super().clean(*args, **kwargs)
if isinstance(data, UploadedFile):
filename = data.name
from ...base.models import CachedFile
if isinstance(data, (UploadedFile, CachedFile)):
filename = data.name if isinstance(data, UploadedFile) else data.filename
ext = os.path.splitext(filename)[1]
ext = ext.lower()
if ext not in self.ext_whitelist:
raise forms.ValidationError(_("Filetype not allowed!"))
if ext in IMAGE_EXTS:
validate_uploaded_file_for_valid_image(data)
validate_uploaded_file_for_valid_image(data if isinstance(data, UploadedFile) else data.file)
return data
@@ -257,6 +259,12 @@ class CachedFileField(ExtFileField):
if isinstance(data, File):
if hasattr(data, '_uploaded_to'):
return data._uploaded_to
try:
self.clean(data)
except ValidationError:
return None
cf = CachedFile.objects.create(
expires=now() + datetime.timedelta(days=1),
date=now(),
@@ -268,6 +276,9 @@ class CachedFileField(ExtFileField):
cf.save()
data._uploaded_to = cf
return cf
if isinstance(data, CachedFile):
return data
return super().bound_data(data, initial)
def clean(self, *args, **kwargs):

View File

@@ -44,11 +44,12 @@ def validate_uploaded_file_for_valid_image(f):
# have to read the data into memory.
if hasattr(f, 'temporary_file_path'):
file = f.temporary_file_path()
elif hasattr(f, 'read'):
if hasattr(f, 'seek') and callable(f.seek):
f.seek(0)
file = BytesIO(f.read())
else:
if hasattr(f, 'read'):
file = BytesIO(f.read())
else:
file = BytesIO(f['content'])
file = BytesIO(f['content'])
try:
try: