updated document upload form

This commit is contained in:
Jonas Winkler 2020-11-07 23:25:50 +01:00
parent 26bb6cba1a
commit 51a4398969

@ -1,4 +1,3 @@
import magic
import os import os
from datetime import datetime from datetime import datetime
@ -6,77 +5,25 @@ from time import mktime
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from pathvalidate import validate_filename, ValidationError
from .models import Document, Correspondent
class UploadForm(forms.Form): class UploadForm(forms.Form):
TYPE_LOOKUP = {
"application/pdf": Document.TYPE_PDF,
"image/png": Document.TYPE_PNG,
"image/jpeg": Document.TYPE_JPG,
"image/gif": Document.TYPE_GIF,
"image/tiff": Document.TYPE_TIF,
}
correspondent = forms.CharField(
max_length=Correspondent._meta.get_field("name").max_length,
required=False
)
title = forms.CharField(
max_length=Document._meta.get_field("title").max_length,
required=False
)
document = forms.FileField() document = forms.FileField()
def __init__(self, *args, **kwargs):
forms.Form.__init__(self, *args, **kwargs)
self._file_type = None
def clean_correspondent(self):
"""
I suppose it might look cleaner to use .get_or_create() here, but that
would also allow someone to fill up the db with bogus correspondents
before all validation was met.
"""
corresp = self.cleaned_data.get("correspondent")
if not corresp:
return None
if not Correspondent.SAFE_REGEX.match(corresp) or " - " in corresp:
raise forms.ValidationError(
"That correspondent name is suspicious.")
return corresp
def clean_title(self):
title = self.cleaned_data.get("title")
if not title:
return None
if not Correspondent.SAFE_REGEX.match(title) or " - " in title:
raise forms.ValidationError("That title is suspicious.")
return title
def clean_document(self): def clean_document(self):
try:
validate_filename(self.cleaned_data.get("document").name)
except ValidationError:
raise forms.ValidationError("That filename is suspicious.")
return self.cleaned_data.get("document")
document = self.cleaned_data.get("document").read() def get_filename(self, i=None):
return os.path.join(
with magic.Magic(flags=magic.MAGIC_MIME_TYPE) as m: settings.CONSUMPTION_DIR,
file_type = m.id_buffer(document) "{}_{}".format(str(i), self.cleaned_data.get("document").name) if i else self.cleaned_data.get("document").name
)
if file_type not in self.TYPE_LOOKUP:
raise forms.ValidationError("The file type is invalid.")
self._file_type = self.TYPE_LOOKUP[file_type]
return document
def save(self): def save(self):
""" """
@ -85,15 +32,15 @@ class UploadForm(forms.Form):
form do that as well. Think of it as a poor-man's queue server. form do that as well. Think of it as a poor-man's queue server.
""" """
correspondent = self.cleaned_data.get("correspondent") document = self.cleaned_data.get("document").read()
title = self.cleaned_data.get("title")
document = self.cleaned_data.get("document")
t = int(mktime(datetime.now().timetuple())) t = int(mktime(datetime.now().timetuple()))
file_name = os.path.join(
settings.CONSUMPTION_DIR, file_name = self.get_filename()
"{} - {}.{}".format(correspondent, title, self._file_type) i = 0
) while os.path.exists(file_name):
i += 1
file_name = self.get_filename(i)
with open(file_name, "wb") as f: with open(file_name, "wb") as f:
f.write(document) f.write(document)