From c3c462393177920f7842af4cf6da2232904bcf90 Mon Sep 17 00:00:00 2001 From: Faraphel Date: Fri, 15 Dec 2023 21:15:02 +0100 Subject: [PATCH] added uploading files to absences --- Palto/Palto/forms.py | 19 ++++++++++++ Palto/Palto/templates/Palto/absence_new.html | 2 +- Palto/Palto/templates/Palto/absence_view.html | 2 +- Palto/Palto/views.py | 31 ++++++++++++------- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Palto/Palto/forms.py b/Palto/Palto/forms.py index eb9aebd..f1116ae 100644 --- a/Palto/Palto/forms.py +++ b/Palto/Palto/forms.py @@ -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) diff --git a/Palto/Palto/templates/Palto/absence_new.html b/Palto/Palto/templates/Palto/absence_new.html index f9dcb66..e73e87c 100644 --- a/Palto/Palto/templates/Palto/absence_new.html +++ b/Palto/Palto/templates/Palto/absence_new.html @@ -1,7 +1,7 @@ {% extends "Palto/base.html" %} {% block body %} -
+ {% csrf_token %} {{ form_new_absence.as_table }} diff --git a/Palto/Palto/templates/Palto/absence_view.html b/Palto/Palto/templates/Palto/absence_view.html index 6f93217..91f8e29 100644 --- a/Palto/Palto/templates/Palto/absence_view.html +++ b/Palto/Palto/templates/Palto/absence_view.html @@ -29,7 +29,7 @@ {# absence's attachments #}
{% for attachment in absence.attachments.all %} - {{ attachment.content.name }} + {{ attachment.content.name }} {% endfor %}
{% endblock %} diff --git a/Palto/Palto/views.py b/Palto/Palto/views.py index 7e0bbb7..ca4eabe 100644 --- a/Palto/Palto/views.py +++ b/Palto/Palto/views.py @@ -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(