from django import forms from django.utils.html import conditional_escape, mark_safe from django.utils.translation import gettext_lazy as _ from mptt.forms import TreeNodeChoiceField from ...themes.models import Theme from ..forms import YesNoSwitch from .assets import create_css, create_image class ThemeChoiceField(TreeNodeChoiceField): level_indicator = "- - " def __init__(self, *args, **kwargs): kwargs.setdefault("queryset", Theme.objects.all()) kwargs.setdefault("empty_label", _("No parent")) super().__init__(*args, **kwargs) class ThemeForm(forms.ModelForm): name = forms.CharField(label=_("Name")) parent = ThemeChoiceField(label=_("Parent"), required=False) version = forms.CharField(label=_("Version"), required=False) author = forms.CharField(label=_("Author(s)"), required=False) url = forms.URLField(label=_("Url"), required=False) class Meta: model = Theme fields = ["name", "parent", "version", "author", "url"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.limit_parent_choices() def limit_parent_choices(self): if not self.instance or not self.instance.pk: return self.fields["parent"].queryset = Theme.objects.exclude( tree_id=self.instance.tree_id, lft__gte=self.instance.lft, rght__lte=self.instance.rght, ) class UploadAssetsForm(forms.Form): assets = forms.FileField( widget=forms.ClearableFileInput(attrs={'multiple': True}) ) def __init__(self, *args, instance=None): self.instance = instance super().__init__(*args) def clean(self): cleaned_data = super(UploadAssetsForm, self).clean() return cleaned_data def get_uploaded_assets(self): return self.files.getlist('assets') class UploadCssForm(UploadAssetsForm): def save(self): for css in self.get_uploaded_assets(): create_css(self.instance, css) return True class UploadImagesForm(UploadAssetsForm): assets = forms.ImageField( widget=forms.ClearableFileInput(attrs={'multiple': True}) ) def save(self): for image in self.get_uploaded_assets(): create_image(self.instance, image) return True