From 5fac72bb4659f54f1915c6ca1806ad5577eb4dab Mon Sep 17 00:00:00 2001 From: Lewis7Lewis <87246452+Lewis7Lewis@users.noreply.github.com> Date: Sat, 11 Oct 2025 23:26:41 +0200 Subject: [PATCH 1/3] Add a continious upload V0 --- photologue/static/upload.js | 98 +++++++++++++++++++++++++++++++++++-- photologue/views.py | 45 +++++++++++++---- 2 files changed, 130 insertions(+), 13 deletions(-) diff --git a/photologue/static/upload.js b/photologue/static/upload.js index e54c304..401bbd4 100644 --- a/photologue/static/upload.js +++ b/photologue/static/upload.js @@ -5,20 +5,21 @@ // When user drags files, register them in the file field const dropZone = document.getElementById('drop_zone'); const uploadInput = document.getElementById('id_file_field'); +const form = document.getElementById('upload_form') -dropZone.ondrop = function(e) { +dropZone.ondrop = function (e) { e.preventDefault(); this.className = 'upload-drop-zone'; console.log(e.dataTransfer.files) uploadInput.files = e.dataTransfer.files; } -dropZone.ondragover = function() { +dropZone.ondragover = function () { this.className = 'upload-drop-zone drop'; return false; } -dropZone.ondragleave = function() { +dropZone.ondragleave = function () { this.className = 'upload-drop-zone'; return false; } @@ -39,4 +40,93 @@ gallerySelectUpdate(); document.getElementById('upload_form').addEventListener('submit', (e) => { document.getElementById('submit-id-submit').disabled = true; document.getElementById('submit-id-submit').value = "Please be patient"; -}) +}); + + +submitbtn = document.getElementById('submit-id-submit'); +submitbtn.type = "button"; + +async function uplaodfnc() { + + console.log(uploadInput.files); + files = uploadInput.files; + submitbtn.disabled = true; + actual = 0; + submitbtn.value = "Please be patient 0% (" + actual + "/" + files.length + ")"; + + csrfvalue = document.getElementsByName("csrfmiddlewaretoken")[0].value; + + gallery_ID = gallerySelect.value; + + if (gallery_ID == "") { + // Create gallery + } + + total = files.length; + + fdata = new FormData(uploadInput.form); + fdata.delete("file_field"); + fdata.append("reptype", "json"); + console.log(fdata); + + const response = await fetch("/upload/", { + method: "POST", + body: fdata, + }); + returned = await response.json(); + + console.log(returned); + console.log(returned.code); + if (returned.code != 200) { + window.alert("There is an error in the form" + returned.error); + } + + // Upload files + for (let file of files) { + actual++; + sendform = new FormData(); + sendform.append("csrfmiddlewaretoken", csrfvalue); + sendform.append("file_field", file); + sendform.append("reptype", "json"); + sendform.append("gallery", returned.galleryID); + + try { + const response = await fetch("/upload/", { + method: "POST", + body: sendform, + }); + okpass = await response.ok; + console.log(file.name, okpass); + if ( !okpass) { + window.alert("Error with " + file.name + "code" + await response.code); + } + submitbtn.value = "Please be patient " + Math.round(100 * actual / total) + "% (" + actual + "/" + files.length + ")"; + + } catch (e) { + console.error(e); + } + + } + + fdata = new FormData(uploadInput.form); + fdata.delete("file_field"); + fdata.append("reptype", "json"); + fdata.append("end","end") + console.log(fdata); + + const response = await fetch("/upload/", { + method: "POST", + body: fdata, + }); + returned = await response.json(); + + submitbtn.value = "Upload Complete Please reload the page"; +} + +submitbtn.addEventListener("click", uplaodfnc); + +console.log("New Upload File"); + + + + diff --git a/photologue/views.py b/photologue/views.py index 088b40c..fbda394 100644 --- a/photologue/views.py +++ b/photologue/views.py @@ -12,6 +12,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMix from django.core.mail import mail_admins from django.db import IntegrityError from django.http import HttpResponse +from django.http import JsonResponse from django.shortcuts import redirect from django.urls import reverse_lazy from django.utils.text import slugify @@ -189,7 +190,17 @@ class GalleryUpload(PermissionRequiredMixin, FormView): def form_valid(self, form): # Get or create gallery + + if form.data.get("reptype","")=="json": + response_json = True + finish_json = form.data.get("end","")=="end" + else : + response_json = False + gallery = form.get_or_create_gallery() + + jsondata = {"galleryID":gallery.id,"code":200} + gallery_year = Path(str(gallery.date_start.year)) gallery_dir = gallery_year / gallery.slug @@ -207,6 +218,8 @@ class GalleryUpload(PermissionRequiredMixin, FormView): messages.error( self.request, f"{photo_file.name} was not recognized as an image" ) + jsondata["code"]=400 + jsondata["error"] = f"{photo_file.name} was not recognized as an image" continue title = f"{gallery.title} - {photo_file.name}" @@ -228,24 +241,38 @@ class GalleryUpload(PermissionRequiredMixin, FormView): uploaded_photo_name.append(photo_file.name) + # Notify user then managers n_success = len(uploaded_photo_name) - if already_exists: - messages.success( - self.request, - f"{n_success} photo(s) uploaded, {already_exists} photo(s) skipped as they already exist in this gallery.", - ) - else: - messages.success(self.request, f"{n_success} photo(s) uploaded.") + if not response_json : + if already_exists: + messages.success( + self.request, + f"{n_success} photo(s) uploaded, {already_exists} photo(s) skipped as they already exist in this gallery.", + ) + else: + messages.success(self.request, f"{n_success} photo(s) uploaded.") + # Notify administrators on new uploads gallery_url = reverse_lazy("photologue:pl-gallery", args=[gallery.slug]) gallery_url = self.request.build_absolute_uri(gallery_url) - if uploaded_photo_name: + if uploaded_photo_name and (not response_json): photos = ", ".join(uploaded_photo_name) mail_admins( subject=f"New upload from {self.request.user.username}", message=f"{self.request.user.username} has uploaded in <{gallery_url}>:\n{photos}", ) - return super().form_valid(form) + elif response_json and finish_json : + photos = ", ".join(uploaded_photo_name) + mail_admins( + subject=f"New continious upload from {self.request.user.username}", + message=f"{self.request.user.username} has uploaded multiples photo with continious upload in <{gallery_url}>", + ) + if response_json : + jsondata["uploadeds"] = uploaded_photo_name + return JsonResponse(jsondata) + + else : + return super().form_valid(form) From 952f2ec584f67036e12e047191444cf180ae0a6c Mon Sep 17 00:00:00 2001 From: Lewis7Lewis <87246452+Lewis7Lewis@users.noreply.github.com> Date: Tue, 28 Oct 2025 21:39:41 +0100 Subject: [PATCH 2/3] Remove JS errors --- photologue/static/upload.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/photologue/static/upload.js b/photologue/static/upload.js index 401bbd4..03222ae 100644 --- a/photologue/static/upload.js +++ b/photologue/static/upload.js @@ -69,7 +69,7 @@ async function uplaodfnc() { fdata.append("reptype", "json"); console.log(fdata); - const response = await fetch("/upload/", { + response = await fetch("/upload/", { method: "POST", body: fdata, }); @@ -114,7 +114,7 @@ async function uplaodfnc() { fdata.append("end","end") console.log(fdata); - const response = await fetch("/upload/", { + response = await fetch("/upload/", { method: "POST", body: fdata, }); From da657fcf6064547b11680959e9b09f5c7b1ca522 Mon Sep 17 00:00:00 2001 From: Lewis7Lewis <87246452+Lewis7Lewis@users.noreply.github.com> Date: Fri, 21 Nov 2025 17:29:42 +0100 Subject: [PATCH 3/3] Remove console log and keep the classic upload viewable --- photologue/static/upload.js | 54 ++++++++++++++++++++++++------------- photologue/views.py | 9 ++++--- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/photologue/static/upload.js b/photologue/static/upload.js index 03222ae..23a927e 100644 --- a/photologue/static/upload.js +++ b/photologue/static/upload.js @@ -42,17 +42,24 @@ document.getElementById('upload_form').addEventListener('submit', (e) => { document.getElementById('submit-id-submit').value = "Please be patient"; }); - submitbtn = document.getElementById('submit-id-submit'); -submitbtn.type = "button"; +//submitbtn.type = "button"; + +//submitbtn.addEventListener("click", uplaodfnc); + +var ctnbtn = document.createElement("input"); +ctnbtn.classList = submitbtn.classList; +ctnbtn.value="Continious Upload"; +ctnbtn.type = "button"; async function uplaodfnc() { console.log(uploadInput.files); files = uploadInput.files; submitbtn.disabled = true; + ctnbtn.disabled = true; actual = 0; - submitbtn.value = "Please be patient 0% (" + actual + "/" + files.length + ")"; + ctnbtn.value = "Please be patient 0% (" + actual + "/" + files.length + ")"; csrfvalue = document.getElementsByName("csrfmiddlewaretoken")[0].value; @@ -66,17 +73,18 @@ async function uplaodfnc() { fdata = new FormData(uploadInput.form); fdata.delete("file_field"); - fdata.append("reptype", "json"); - console.log(fdata); + //fdata.append("reptype", "json"); + response = await fetch("/upload/", { method: "POST", body: fdata, + headers: { + 'Accept': 'application/json' + } }); returned = await response.json(); - console.log(returned); - console.log(returned.code); if (returned.code != 200) { window.alert("There is an error in the form" + returned.error); } @@ -87,20 +95,22 @@ async function uplaodfnc() { sendform = new FormData(); sendform.append("csrfmiddlewaretoken", csrfvalue); sendform.append("file_field", file); - sendform.append("reptype", "json"); + //sendform.append("reptype", "json"); sendform.append("gallery", returned.galleryID); try { const response = await fetch("/upload/", { method: "POST", body: sendform, + headers: { + 'Accept': 'application/json' + } }); okpass = await response.ok; - console.log(file.name, okpass); - if ( !okpass) { + if (!okpass) { window.alert("Error with " + file.name + "code" + await response.code); } - submitbtn.value = "Please be patient " + Math.round(100 * actual / total) + "% (" + actual + "/" + files.length + ")"; + ctnbtn.value = "Please be patient " + Math.round(100 * actual / total) + "% (" + actual + "/" + files.length + ")"; } catch (e) { console.error(e); @@ -110,22 +120,30 @@ async function uplaodfnc() { fdata = new FormData(uploadInput.form); fdata.delete("file_field"); - fdata.append("reptype", "json"); - fdata.append("end","end") - console.log(fdata); + fdata.delete("new_gallery_title"); + fdata.delete("new_galleru_date_start"); + fdata.delete("new_galleru_date_end"); + //fdata.append("reptype", "json"); + fdata.append("gallery", returned.galleryID); + fdata.append("end", "end") response = await fetch("/upload/", { method: "POST", body: fdata, + headers: { + 'Accept': 'application/json' + } }); - returned = await response.json(); + returned = await response.json(); - submitbtn.value = "Upload Complete Please reload the page"; + ctnbtn.value = "Upload Complete Please reload the page"; } -submitbtn.addEventListener("click", uplaodfnc); -console.log("New Upload File"); +ctnbtn.addEventListener("click", uplaodfnc); + +form.appendChild(ctnbtn); + diff --git a/photologue/views.py b/photologue/views.py index fbda394..3027105 100644 --- a/photologue/views.py +++ b/photologue/views.py @@ -191,11 +191,12 @@ class GalleryUpload(PermissionRequiredMixin, FormView): def form_valid(self, form): # Get or create gallery - if form.data.get("reptype","")=="json": - response_json = True - finish_json = form.data.get("end","")=="end" - else : + if self.request.accepts('text/html') or not self.request.accepts('application/json'): response_json = False + finish_json = False + else : + response_json = True + finish_json = form.data.get("end","") == "end" gallery = form.get_or_create_gallery()