86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
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 .models import GalleryExtended, PhotoExtended
|
|
|
|
|
|
class UploadForm(forms.Form):
|
|
file_field = forms.FileField(
|
|
label="",
|
|
widget=forms.FileInput(attrs={
|
|
'accept': 'image/*',
|
|
'multiple': True,
|
|
'class': 'mb-3',
|
|
}),
|
|
)
|
|
gallery = forms.ModelChoiceField(
|
|
Gallery.objects.all(),
|
|
label=_('Gallery'),
|
|
required=False,
|
|
help_text=_('Select a gallery to add these images to. Leave this empty to '
|
|
'create a new gallery from the supplied title.')
|
|
)
|
|
new_gallery_title = forms.CharField(
|
|
label=_('New gallery title'),
|
|
max_length=250,
|
|
required=False,
|
|
)
|
|
date_start = forms.DateField(
|
|
label=_('New gallery event start date'),
|
|
initial=datetime.date.today,
|
|
required=False,
|
|
)
|
|
date_end = forms.DateField(
|
|
label=_('New gallery event end date'),
|
|
initial=datetime.date.today,
|
|
required=False,
|
|
)
|
|
|
|
def clean_new_gallery_title(self):
|
|
title = self.cleaned_data['new_gallery_title']
|
|
if title and Gallery.objects.filter(title=title).exists():
|
|
raise forms.ValidationError(_('A gallery with that title already exists.'))
|
|
return title
|
|
|
|
def clean(self):
|
|
cleaned_data = super().clean()
|
|
|
|
# Check that either an existing gallery is chosen, or new_gallery_title is filled
|
|
if not (bool(cleaned_data['gallery']) ^ bool(cleaned_data.get('new_gallery_title', None))):
|
|
raise forms.ValidationError(
|
|
_('Select an existing gallery, or enter a title for a new gallery.'))
|
|
|
|
return cleaned_data
|
|
|
|
def get_or_create_gallery(self):
|
|
"""
|
|
Get or create gallery
|
|
"""
|
|
gallery = self.cleaned_data['gallery']
|
|
if not gallery:
|
|
# Create new gallery
|
|
title = self.cleaned_data.get('new_gallery_title')
|
|
gallery = Gallery.objects.create(title=title, slug=slugify(title))
|
|
GalleryExtended.objects.create(
|
|
gallery=gallery,
|
|
date_start=self.cleaned_data['date_start'],
|
|
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)
|