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)