forms.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from django import forms
  2. from django.utils.html import conditional_escape, mark_safe
  3. from django.utils.translation import gettext_lazy as _
  4. from mptt.forms import TreeNodeChoiceField
  5. from ...themes.models import Theme
  6. from ..forms import YesNoSwitch
  7. from .assets import create_css, create_image
  8. class ThemeChoiceField(TreeNodeChoiceField):
  9. level_indicator = "- - "
  10. def __init__(self, *args, **kwargs):
  11. kwargs.setdefault("queryset", Theme.objects.all())
  12. kwargs.setdefault("empty_label", _("No parent"))
  13. super().__init__(*args, **kwargs)
  14. class ThemeForm(forms.ModelForm):
  15. name = forms.CharField(label=_("Name"))
  16. parent = ThemeChoiceField(label=_("Parent"), required=False)
  17. version = forms.CharField(label=_("Version"), required=False)
  18. author = forms.CharField(label=_("Author(s)"), required=False)
  19. url = forms.URLField(label=_("Url"), required=False)
  20. class Meta:
  21. model = Theme
  22. fields = ["name", "parent", "version", "author", "url"]
  23. def __init__(self, *args, **kwargs):
  24. super().__init__(*args, **kwargs)
  25. self.limit_parent_choices()
  26. def limit_parent_choices(self):
  27. if not self.instance or not self.instance.pk:
  28. return
  29. self.fields["parent"].queryset = Theme.objects.exclude(
  30. tree_id=self.instance.tree_id,
  31. lft__gte=self.instance.lft,
  32. rght__lte=self.instance.rght,
  33. )
  34. class UploadAssetsForm(forms.Form):
  35. assets = forms.FileField(
  36. widget=forms.ClearableFileInput(attrs={'multiple': True})
  37. )
  38. def __init__(self, *args, instance=None):
  39. self.instance = instance
  40. super().__init__(*args)
  41. def clean(self):
  42. cleaned_data = super(UploadAssetsForm, self).clean()
  43. return cleaned_data
  44. def get_uploaded_assets(self):
  45. return self.files.getlist('assets')
  46. class UploadCssForm(UploadAssetsForm):
  47. def save(self):
  48. for css in self.get_uploaded_assets():
  49. create_css(self.instance, css)
  50. return True
  51. class UploadImagesForm(UploadAssetsForm):
  52. assets = forms.ImageField(
  53. widget=forms.ClearableFileInput(attrs={'multiple': True})
  54. )
  55. def save(self):
  56. for image in self.get_uploaded_assets():
  57. create_image(self.instance, image)
  58. return True