Compare commits

...
5 Commits
3 changed files with 20 additions and 8 deletions
+1 -1
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 # 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/>. # <https://www.gnu.org/licenses/>.
# #
__version__ = "2024.1.0" __version__ = "2024.1.1"
+14 -3
View File
@@ -219,15 +219,17 @@ class ExtValidationMixin:
def clean(self, *args, **kwargs): def clean(self, *args, **kwargs):
data = super().clean(*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 = os.path.splitext(filename)[1]
ext = ext.lower() ext = ext.lower()
if ext not in self.ext_whitelist: if ext not in self.ext_whitelist:
raise forms.ValidationError(_("Filetype not allowed!")) raise forms.ValidationError(_("Filetype not allowed!"))
if ext in IMAGE_EXTS: 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 return data
@@ -257,6 +259,12 @@ class CachedFileField(ExtFileField):
if isinstance(data, File): if isinstance(data, File):
if hasattr(data, '_uploaded_to'): if hasattr(data, '_uploaded_to'):
return data._uploaded_to return data._uploaded_to
try:
self.clean(data)
except ValidationError:
return None
cf = CachedFile.objects.create( cf = CachedFile.objects.create(
expires=now() + datetime.timedelta(days=1), expires=now() + datetime.timedelta(days=1),
date=now(), date=now(),
@@ -268,6 +276,9 @@ class CachedFileField(ExtFileField):
cf.save() cf.save()
data._uploaded_to = cf data._uploaded_to = cf
return cf return cf
if isinstance(data, CachedFile):
return data
return super().bound_data(data, initial) return super().bound_data(data, initial)
def clean(self, *args, **kwargs): def clean(self, *args, **kwargs):
+5 -4
View File
@@ -44,11 +44,12 @@ def validate_uploaded_file_for_valid_image(f):
# have to read the data into memory. # have to read the data into memory.
if hasattr(f, 'temporary_file_path'): if hasattr(f, 'temporary_file_path'):
file = 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: else:
if hasattr(f, 'read'): file = BytesIO(f['content'])
file = BytesIO(f.read())
else:
file = BytesIO(f['content'])
try: try:
try: try: