Skip to content

Commit d2adfa6

Browse files
authored
Fix bulk upload Turbo error (#377)
1 parent a6b5ea9 commit d2adfa6

3 files changed

Lines changed: 76 additions & 14 deletions

File tree

documents/forms.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,18 @@ class UploadFileForm(DocumentForm):
5252

5353

5454
class BulkFilesForm(forms.Form):
55-
url = forms.URLField()
55+
url = forms.URLField(
56+
widget=forms.URLInput(
57+
attrs={
58+
"class": "form-control",
59+
"placeholder": "https://...",
60+
"id": "url",
61+
}
62+
),
63+
error_messages={
64+
"invalid": "Le lien fourni n'est pas valide. Entre une URL complète (ex: https://...)."
65+
},
66+
)
5667

5768

5869
class ReUploadForm(forms.Form):

documents/templates/documents/document_upload.html

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,18 @@
193193

194194
<form class="mt-5 text-muted"
195195
action="{% url 'document_submit_bulk' course.slug %}"
196-
method="post">
197-
{% csrf_token %}
196+
method="post"
197+
novalidate> {% csrf_token %}
198+
199+
{% if bulk_form.url.errors %}
200+
<div class="alert alert-danger alert-dismissible fade show" role="alert">
201+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-triangle-fill flex-shrink-0 me-2" viewBox="0 0 16 16">
202+
<path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/>
203+
</svg>
204+
{{ bulk_form.url.errors.0 }}
205+
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
206+
</div>
207+
{% endif %}
198208

199209
<div class="mb-3">
200210
<label for="url" class="form-label d-flex align-items-center gap-2">
@@ -206,20 +216,18 @@
206216
d="M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5L14 4.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1h-2v1h-1v1h1v1h-1v1h1v1H6V5H5V4h1V3H5V2h1V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5h-2z"/>
207217
</svg>
208218
<div>
209-
Tu as beaucoup de documents à ajouter à la fois ? Par exemple un gros .zip sur WeTransfer ou une
210-
Dropbox ?<br/>
211-
Rentre ici l'adresse à laquelle Dochub peut trouver tes fichiers et tout sera ajouté automatiquement
212-
!
219+
Tu as beaucoup de documents à ajouter à la fois ? Par exemple un gros .zip sur WeTransfer ou une Dropbox ?<br/>
220+
Rentre ici l'adresse à laquelle Dochub peut trouver tes fichiers et tout sera ajouté automatiquement !
213221
</div>
214222
</label>
215223
<div class="d-flex gap-2">
216-
<div class="flex-grow-1"><input type="text" id="url" name="url" class="form-control"
217-
placeholder="http://"></div>
224+
<div class="flex-grow-1">
225+
{{ bulk_form.url }}
226+
</div>
218227
<button type="submit" class="btn btn-primary mb-2">Envoyer</button>
219228
</div>
220229
<div class="form-text">
221-
Si ton lien contient un dossier séparé par cours, les fichiers seront automatiquement ajoutés dans le
222-
bon cours.
230+
Si ton lien contient un dossier séparé par cours, les fichiers seront automatiquement ajoutés dans le bon cours.
223231
</div>
224232
</div>
225233
</form>

documents/views.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,15 @@ def upload_file(request, slug):
6868
form = UploadFileForm()
6969

7070
multiform = MultipleUploadFileForm()
71+
bulk_form = BulkFilesForm()
7172

7273
return render(
7374
request,
7475
"documents/document_upload.html",
7576
{
7677
"form": form,
7778
"multiform": multiform,
79+
"bulk_form": bulk_form,
7880
"course": course,
7981
},
8082
)
@@ -305,18 +307,59 @@ def submit_bulk(request, slug):
305307
form = BulkFilesForm(request.POST)
306308

307309
if form.is_valid():
308-
BulkDocuments.objects.create(
309-
url=form.cleaned_data["url"], course=course, user=request.user
310+
url = form.cleaned_data["url"]
311+
312+
# Verify Duplicate Submission URL
313+
if BulkDocuments.objects.filter(
314+
url=url, course=course, processed=False
315+
).exists():
316+
form.add_error(
317+
"url",
318+
"Ce lien a déjà été soumis pour ce cours et est en attente de traitement.",
319+
)
320+
return render(
321+
request,
322+
"documents/document_upload.html",
323+
{
324+
"course": course,
325+
"form": UploadFileForm(),
326+
"multiform": MultipleUploadFileForm(),
327+
"bulk_form": form,
328+
},
329+
# status=422 mandatory for Turbo: forces the display of validation errors (Turbo ignores 200 codes)
330+
status=422,
331+
)
332+
333+
# Succes submit URL
334+
BulkDocuments.objects.create(url=url, course=course, user=request.user)
335+
success_url = (
336+
reverse("document_submit_bulk", args=[course.slug]) + "?success=true"
310337
)
338+
return HttpResponseRedirect(success_url)
311339

340+
else:
341+
# Bad URL submit
312342
return render(
313343
request,
314-
"documents/document_bulk.html",
344+
"documents/document_upload.html",
315345
{
316346
"course": course,
347+
"form": UploadFileForm(),
348+
"multiform": MultipleUploadFileForm(),
349+
"bulk_form": form,
317350
},
351+
status=422,
318352
)
319353

354+
if "success" in request.GET:
355+
return render(
356+
request,
357+
"documents/document_bulk.html",
358+
{
359+
"course": course,
360+
},
361+
)
362+
320363
return HttpResponseRedirect(reverse("document_put", args=[course.slug]))
321364

322365

0 commit comments

Comments
 (0)