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 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 # Users
@ -19,6 +37,7 @@ class NewAbsenceForm(forms.Form):
start = forms.DateTimeField(widget=forms.TextInput(attrs=dict(type='datetime-local'))) start = forms.DateTimeField(widget=forms.TextInput(attrs=dict(type='datetime-local')))
end = 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) message = forms.CharField(widget=forms.Textarea)
attachments = MultipleFileField(required=False)
def __init__(self, student: models.User, *args, **kwargs): def __init__(self, student: models.User, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

View file

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

View file

@ -29,7 +29,7 @@
{# absence's attachments #} {# absence's attachments #}
<div> <div>
{% for attachment in absence.attachments.all %} {% 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 %} {% endfor %}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -202,24 +202,31 @@ def new_absence_view(request: WSGIRequest):
return HttpResponseForbidden() return HttpResponseForbidden()
# create a form for the new absence # 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(): if form_new_absence.is_valid():
try: print(form_new_absence.files, form_new_absence.cleaned_data)
models.Absence.objects.create(
absence, is_created = models.Absence.objects.get_or_create(
student=request.user, student=request.user,
start=form_new_absence.cleaned_data["start"], start=form_new_absence.cleaned_data["start"],
end=form_new_absence.cleaned_data["end"], end=form_new_absence.cleaned_data["end"],
department=form_new_absence.cleaned_data["department"], department=form_new_absence.cleaned_data["department"],
message=form_new_absence.cleaned_data["message"], message=form_new_absence.cleaned_data["message"],
) )
except IntegrityError:
if not is_created:
# if the absence already existed, show an error
form_new_absence.add_error(None, "This absence already exists.") form_new_absence.add_error(None, "This absence already exists.")
else: 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 # render the page
return render( return render(