Handle database integrity error during upload

This commit is contained in:
Alexandre Iooss 2021-10-15 14:45:26 +02:00
parent 2334017abf
commit baf70d396c
3 changed files with 26 additions and 19 deletions

View file

@ -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."

View file

@ -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)

View file

@ -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(