added uploading files to absences

This commit is contained in:
Faraphel 2023-12-15 21:15:02 +01:00
parent 8db28b9838
commit c3c4623931
4 changed files with 40 additions and 14 deletions

View file

@ -3,6 +3,24 @@ from django import forms
from Palto.Palto import models
# Common
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
def clean(self, data, initial=None):
file_cleaner = super().clean
if isinstance(data, (list, tuple)):
return [file_cleaner(d, initial) for d in data]
else:
return file_cleaner(data, initial)
# Users
@ -19,6 +37,7 @@ class NewAbsenceForm(forms.Form):
start = forms.DateTimeField(widget=forms.TextInput(attrs=dict(type='datetime-local')))
end = forms.DateTimeField(widget=forms.TextInput(attrs=dict(type='datetime-local')))
message = forms.CharField(widget=forms.Textarea)
attachments = MultipleFileField(required=False)
def __init__(self, student: models.User, *args, **kwargs):
super().__init__(*args, **kwargs)

View file

@ -1,7 +1,7 @@
{% extends "Palto/base.html" %}
{% block body %}
<form method="POST">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form_new_absence.as_table }}

View file

@ -29,7 +29,7 @@
{# absence's attachments #}
<div>
{% for attachment in absence.attachments.all %}
<a href="{{ attachment.content.url }}">{{ attachment.content.name }}</a>
<a href="{{ attachment.content.url }}" target="_blank">{{ attachment.content.name }}</a>
{% endfor %}
</div>
{% endblock %}

View file

@ -202,24 +202,31 @@ def new_absence_view(request: WSGIRequest):
return HttpResponseForbidden()
# create a form for the new absence
form_new_absence = forms.NewAbsenceForm(request.user, request.POST)
form_new_absence = forms.NewAbsenceForm(request.user, request.POST, request.FILES)
if form_new_absence.is_valid():
try:
models.Absence.objects.create(
student=request.user,
start=form_new_absence.cleaned_data["start"],
end=form_new_absence.cleaned_data["end"],
department=form_new_absence.cleaned_data["department"],
message=form_new_absence.cleaned_data["message"],
)
except IntegrityError:
print(form_new_absence.files, form_new_absence.cleaned_data)
absence, is_created = models.Absence.objects.get_or_create(
student=request.user,
start=form_new_absence.cleaned_data["start"],
end=form_new_absence.cleaned_data["end"],
department=form_new_absence.cleaned_data["department"],
message=form_new_absence.cleaned_data["message"],
)
if not is_created:
# if the absence already existed, show an error
form_new_absence.add_error(None, "This absence already exists.")
else:
return redirect("Palto:homepage") # TODO(Faraphel): redirect to absence list
# add the attachments files to the absence
for file in form_new_absence.cleaned_data["attachments"]:
absence.attachments.create(
content=file
)
# TODO(Faraphel): add attachments to the forms
return redirect("Palto:homepage") # TODO(Faraphel): redirect to absence list
# render the page
return render(