Check available themes in form

This commit is contained in:
Mouse Reeve 2022-02-27 11:19:09 -08:00
parent 8850b68b52
commit 8259d16ee9
3 changed files with 40 additions and 23 deletions

View file

@ -4,8 +4,6 @@ from collections import defaultdict
from urllib.parse import urlparse
from django import forms
from django.contrib.staticfiles.utils import get_files
from django.contrib.staticfiles.storage import StaticFilesStorage
from django.forms import ModelForm, PasswordInput, widgets, ChoiceField
from django.forms.widgets import Textarea
from django.utils import timezone
@ -462,22 +460,13 @@ class SiteThemeForm(CustomForm):
fields = ["default_theme"]
def get_theme_choices():
"""static files"""
choices = list(get_files(StaticFilesStorage(), location="css/themes"))
current = models.Theme.objects.values_list("path", flat=True)
return [(c, c) for c in choices if c not in current and c[-5:] == ".scss"]
class ThemeForm(CustomForm):
class Meta:
model = models.Theme
fields = ["name", "path"]
widgets = {
"name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
"path": forms.Select(
attrs={"aria-describedby": "desc_path"}, choices=get_theme_choices()
),
"path": forms.Select(attrs={"aria-describedby": "desc_path"}),
}

View file

@ -50,6 +50,12 @@
class="box"
enctype="multipart/form-data"
>
{% if not choices %}
<div class="notification is-warning">
{% trans "No available theme files detected" %}
</div>
{% endif %}
<fieldset {% if not choices %}disabled{% endif %}>
{% csrf_token %}
<div class="columns">
<div class="column is-half">
@ -68,7 +74,18 @@
</label>
<div class="control">
<div class="select">
{{ theme_form.path }}
<select
name="path"
aria-describedby="desc_path"
class=""
id="id_path"
>
{% for choice in choices %}
<option value="{{ choice }}">
{{ choice }}
</option>
{% endfor %}
</select>
</div>
{% include 'snippets/form_errors.html' with errors_list=theme_form.path.errors id="desc_path" %}
</div>
@ -76,6 +93,7 @@
</div>
<button type="submit" class="button">{% trans "Add theme" %}</button>
</fieldset>
</form>
</section>

View file

@ -1,5 +1,7 @@
""" manage themes """
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.staticfiles.utils import get_files
from django.contrib.staticfiles.storage import StaticFilesStorage
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
@ -18,21 +20,29 @@ class Themes(View):
def get(self, request):
"""view existing themes and set defaults"""
data = {
"themes": models.Theme.objects.all(),
"theme_form": forms.ThemeForm(),
}
return TemplateResponse(request, "settings/themes.html", data)
return TemplateResponse(request, "settings/themes.html", get_view_data())
def post(self, request):
"""edit the site settings"""
form = forms.ThemeForm(request.POST, request.FILES)
data = {
"themes": models.Theme.objects.all(),
"theme_form": form,
}
if form.is_valid():
form.save()
data = get_view_data()
if not form.is_valid():
data["theme_form"] = form
else:
data["success"] = True
data["theme_form"] = forms.ThemeForm()
return TemplateResponse(request, "settings/themes.html", data)
def get_view_data():
"""data for view"""
choices = list(get_files(StaticFilesStorage(), location="css/themes"))
current = models.Theme.objects.values_list("path", flat=True)
return {
"themes": models.Theme.objects.all(),
"choices": [c for c in choices if c not in current and c[-5:] == ".scss"],
"theme_form": forms.ThemeForm(),
}