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 #: photologue_custom/forms.py:38
msgid "New gallery event end date" 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 #: photologue_custom/forms.py:46
msgid "A gallery with that title already exists." msgid "A gallery with that title already exists."

View file

@ -3,9 +3,9 @@ import datetime
from django import forms from django import forms
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _ 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): class UploadForm(forms.Form):
@ -71,16 +71,3 @@ class UploadForm(forms.Form):
date_end=self.cleaned_data['date_end'], date_end=self.cleaned_data['date_end'],
) )
return gallery 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 import messages
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.mail import mail_managers from django.core.mail import mail_managers
from django.db import IntegrityError
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.text import slugify
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.edit import FormView 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 photologue.views import GalleryArchiveIndexView, GalleryYearArchiveView
from taggit.models import Tag from taggit.models import Tag
from .forms import UploadForm from .forms import UploadForm
from .models import PhotoExtended
class TagDetail(LoginRequiredMixin, DetailView): class TagDetail(LoginRequiredMixin, DetailView):
@ -109,10 +112,27 @@ class GalleryUpload(FormView):
# Upload photos # Upload photos
# We take files from the request to support multiple upload # We take files from the request to support multiple upload
files = self.request.FILES.getlist('file_field') 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 # 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', '') gallery_title = form.cleaned_data['gallery'] or form.cleaned_data.get('new_gallery_title', '')
photos = ", ".join(f.name for f in files) photos = ", ".join(f.name for f in files)
mail_managers( mail_managers(