import datetime from crispy_forms.helper import FormHelper from crispy_forms.layout import Div, Layout, Submit from django import forms from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from photologue.models import Gallery, Tag 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, empty_label=_('-- Create a new gallery --'), 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, ) new_gallery_date_start = forms.DateField( label=_('New gallery event start date'), initial=datetime.date.today, required=False, ) new_gallery_date_end = forms.DateField( label=_('New gallery event end date'), initial=datetime.date.today, required=False, ) new_gallery_tags = forms.ModelMultipleChoiceField( Tag.objects.all(), label=_('New gallery tags'), required=False, help_text=_('Hold down "Control", or "Command" on a Mac, to select more than one.') ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.use_custom_control = False self.helper.layout = Layout( 'file_field', 'gallery', 'new_gallery_title', Div( Div('new_gallery_date_start', css_class='col'), Div('new_gallery_date_end', css_class='col'), css_class='row' ), 'new_gallery_tags', Submit('submit', _('Upload'), css_class='btn btn-success mt-2') ) 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), date_start=self.cleaned_data['new_gallery_date_start'], date_end=self.cleaned_data['new_gallery_date_end'], ) for tag in self.cleaned_data['new_gallery_tags']: gallery.tags.add(tag) return gallery