photo26/photologue/forms.py
2022-03-02 21:23:40 +01:00

110 lines
3.5 KiB
Python

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