From baf70d396c70f129ce0753717dc8e4cd2be950c1 Mon Sep 17 00:00:00 2001 From: Alexandre Iooss Date: Fri, 15 Oct 2021 14:45:26 +0200 Subject: [PATCH] Handle database integrity error during upload --- photo21/locale/fr/LC_MESSAGES/django.po | 2 +- photologue_custom/forms.py | 17 ++-------------- photologue_custom/views.py | 26 ++++++++++++++++++++++--- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/photo21/locale/fr/LC_MESSAGES/django.po b/photo21/locale/fr/LC_MESSAGES/django.po index e872907..3f8956a 100644 --- a/photo21/locale/fr/LC_MESSAGES/django.po +++ b/photo21/locale/fr/LC_MESSAGES/django.po @@ -299,7 +299,7 @@ msgstr "Date de début de l'évènement de la nouvelle galerie" #: photologue_custom/forms.py:38 msgid "New gallery event end date" -msgstr "Date de fin de l'énèvement de la nouvelle galerie" +msgstr "Date de fin de l'évènement de la nouvelle galerie" #: photologue_custom/forms.py:46 msgid "A gallery with that title already exists." diff --git a/photologue_custom/forms.py b/photologue_custom/forms.py index f7ff388..2d823f3 100644 --- a/photologue_custom/forms.py +++ b/photologue_custom/forms.py @@ -3,9 +3,9 @@ import datetime from django import forms from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ -from photologue.models import Gallery, Photo +from photologue.models import Gallery -from .models import GalleryExtended, PhotoExtended +from .models import GalleryExtended class UploadForm(forms.Form): @@ -71,16 +71,3 @@ class UploadForm(forms.Form): date_end=self.cleaned_data['date_end'], ) return gallery - - def save(self, user, files): - """ - Save gallery then photos - """ - gallery = self.get_or_create_gallery() - for photo_file in files: - title = f"{gallery.title} - {photo_file.name}" - photo = Photo(title=title, slug=slugify(title)) - photo.image.save(photo_file.name, photo_file) - photo.save() - photo.galleries.set([gallery]) - PhotoExtended.objects.create(photo=photo, owner=user) diff --git a/photologue_custom/views.py b/photologue_custom/views.py index 4c0ca54..51d0517 100644 --- a/photologue_custom/views.py +++ b/photologue_custom/views.py @@ -8,15 +8,18 @@ from io import BytesIO from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.core.mail import mail_managers +from django.db import IntegrityError from django.http import HttpResponse from django.urls import reverse_lazy +from django.utils.text import slugify from django.views.generic.detail import DetailView from django.views.generic.edit import FormView -from photologue.models import Gallery +from photologue.models import Gallery, Photo from photologue.views import GalleryArchiveIndexView, GalleryYearArchiveView from taggit.models import Tag from .forms import UploadForm +from .models import PhotoExtended class TagDetail(LoginRequiredMixin, DetailView): @@ -109,10 +112,27 @@ class GalleryUpload(FormView): # Upload photos # We take files from the request to support multiple upload files = self.request.FILES.getlist('file_field') - form.save(self.request.user, files) + gallery = form.get_or_create_gallery() + failed_upload = 0 + for photo_file in files: + title = f"{gallery.title} - {photo_file.name}" + try: + photo = Photo(title=title, slug=slugify(title)) + photo.image.save(photo_file.name, photo_file) + photo.save() + photo.galleries.set([gallery]) + PhotoExtended.objects.create(photo=photo, owner=self.request.user) + except IntegrityError: + messages.error(self.request, f"{photo_file.name} was not uploaded. Maybe the photo was already uploaded.") + failed_upload += 1 # Notify user then managers - messages.success(self.request, "Photos has been successfully uploaded.") + if not failed_upload: + messages.success(self.request, "All photos has been successfully uploaded.") + else: + n_success = len(files) - failed_upload + messages.warning(self.request, f"Only {n_success} photos were successfully uploaded !") + gallery_title = form.cleaned_data['gallery'] or form.cleaned_data.get('new_gallery_title', '') photos = ", ".join(f.name for f in files) mail_managers(