2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-05-01 13:06:45 +00:00

Renamed Theme to ColorTheme, ColorTheme is now a per-user selection

This commit is contained in:
eeintech 2020-09-07 16:27:23 -05:00
parent 2e5ec5d249
commit 10dd8fad80
8 changed files with 56 additions and 39 deletions

View File

@ -11,7 +11,8 @@ from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field from crispy_forms.layout import Layout, Field
from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText, StrictButton from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText, StrictButton
from django.contrib.auth.models import User from django.contrib.auth.models import User
from common.models import Theme from common.models import ColorTheme
class HelperForm(forms.ModelForm): class HelperForm(forms.ModelForm):
""" Provides simple integration of crispy_forms extension. """ """ Provides simple integration of crispy_forms extension. """
@ -163,24 +164,24 @@ class SetPasswordForm(HelperForm):
] ]
class ThemeSelectForm(forms.ModelForm): class ColorThemeSelectForm(forms.ModelForm):
""" Form for setting color theme """ Form for setting color theme
""" """
class Meta: class Meta:
model = Theme model = ColorTheme
fields = [ fields = [
'theme' 'name'
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ThemeSelectForm, self).__init__(*args, **kwargs) super(ColorThemeSelectForm, self).__init__(*args, **kwargs)
self.helper = FormHelper() self.helper = FormHelper()
# Form rendering # Form rendering
self.helper.form_show_labels = False self.helper.form_show_labels = False
self.helper.form_class = 'form-inline' self.helper.form_class = 'form-inline'
# self.helper.field_template = 'bootstrap4/layout/inline_field.html' # self.helper.field_template = 'bootstrap4/layout/inline_field.html'
self.helper.layout = Layout( self.helper.layout = Layout(
Field('theme'), Field('name'),
StrictButton(_('Apply Theme'), css_class='btn btn-primary', type='submit') StrictButton(_('Apply Theme'), css_class='btn btn-primary', type='submit')
) )

View File

@ -36,7 +36,7 @@ from django.views.generic.base import RedirectView
from rest_framework.documentation import include_docs_urls from rest_framework.documentation import include_docs_urls
from .views import IndexView, SearchView, DatabaseStatsView from .views import IndexView, SearchView, DatabaseStatsView
from .views import SettingsView, EditUserView, SetPasswordView, ThemeSelectView from .views import SettingsView, EditUserView, SetPasswordView, ColorThemeSelectView
from .views import DynamicJsView from .views import DynamicJsView
from .api import InfoView from .api import InfoView
@ -71,7 +71,7 @@ settings_urls = [
url(r'^user/?', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings-user'), url(r'^user/?', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings-user'),
url(r'^currency/?', SettingsView.as_view(template_name='InvenTree/settings/currency.html'), name='settings-currency'), url(r'^currency/?', SettingsView.as_view(template_name='InvenTree/settings/currency.html'), name='settings-currency'),
url(r'^part/?', SettingsView.as_view(template_name='InvenTree/settings/part.html'), name='settings-part'), url(r'^part/?', SettingsView.as_view(template_name='InvenTree/settings/part.html'), name='settings-part'),
url(r'^theme/?', ThemeSelectView.as_view(), name='settings-theme'), url(r'^theme/?', ColorThemeSelectView.as_view(), name='settings-theme'),
url(r'^other/?', SettingsView.as_view(template_name='InvenTree/settings/other.html'), name='settings-other'), url(r'^other/?', SettingsView.as_view(template_name='InvenTree/settings/other.html'), name='settings-other'),
# Catch any other urls # Catch any other urls

View File

@ -19,9 +19,9 @@ from django.views.generic.base import TemplateView
from part.models import Part, PartCategory from part.models import Part, PartCategory
from stock.models import StockLocation, StockItem from stock.models import StockLocation, StockItem
from common.models import InvenTreeSetting, Theme from common.models import InvenTreeSetting, ColorTheme
from .forms import DeleteForm, EditUserForm, SetPasswordForm, ThemeSelectForm from .forms import DeleteForm, EditUserForm, SetPasswordForm, ColorThemeSelectForm
from .helpers import str2bool from .helpers import str2bool
from rest_framework import views from rest_framework import views
@ -557,33 +557,45 @@ class SettingsView(TemplateView):
return ctx return ctx
class ThemeSelectView(FormView): class ColorThemeSelectView(FormView):
""" View for selecting a color theme """ """ View for selecting a color theme """
form_class = ThemeSelectForm form_class = ColorThemeSelectForm
success_url = reverse_lazy('settings-theme') success_url = reverse_lazy('settings-theme')
template_name = "InvenTree/settings/theme.html" template_name = "InvenTree/settings/theme.html"
def get_user_theme(self):
""" Get user color theme """
try:
user_theme = ColorTheme.objects.filter(user=self.request.user).get()
except ColorTheme.DoesNotExist:
user_theme = None
return user_theme
def get_initial(self): def get_initial(self):
""" Select user theme """ """ Select user theme """
initial = super(ThemeSelectView, self).get_initial() initial = super(ColorThemeSelectView, self).get_initial()
initial['theme'] = Theme.objects.all().get().theme user_theme = self.get_user_theme()
if user_theme:
initial['name'] = user_theme.name
return initial return initial
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
""" Save user color theme """ """ Save user color theme """
form = self.get_form() form = self.get_form()
if form.is_valid(): if form.is_valid():
theme_select = form.cleaned_data['theme'] theme_select = form.cleaned_data['name']
# Get current user theme
user_theme = self.get_user_theme()
try: # Create theme entry if user did not select one yet
user_theme = Theme.objects.all().get() if not user_theme:
except Theme.DoesNotExist: user_theme = ColorTheme()
print('No theme selected yet')
user_theme = Theme()
# Set color theme # Set color theme to form selection
user_theme.theme = theme_select user_theme.user = str(request.user)
user_theme.name = theme_select
user_theme.save() user_theme.save()
return self.form_valid(form) return self.form_valid(form)

View File

@ -1,4 +1,4 @@
# Generated by Django 3.0.7 on 2020-09-07 20:12 # Generated by Django 3.0.7 on 2020-09-07 21:13
from django.db import migrations, models from django.db import migrations, models
@ -11,10 +11,11 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Theme', name='ColorTheme',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('theme', models.CharField(blank=True, choices=[('', 'Default'), ('-darker', 'Darker')], default='', max_length=20)), ('name', models.CharField(blank=True, choices=[('', 'Default'), ('-darker', 'Darker')], default='', max_length=20)),
('user', models.CharField(max_length=150)),
], ],
), ),
] ]

View File

@ -156,15 +156,16 @@ class Currency(models.Model):
super().save(*args, **kwargs) super().save(*args, **kwargs)
class Theme(models.Model): class ColorTheme(models.Model):
""" Color Theme setting """ """ Color Theme setting """
class ThemeChoices(models.TextChoices): class ColorThemeChoices(models.TextChoices):
DEFAULT = '', _('Default') DEFAULT = '', _('Default')
DARKER = '-darker', _('Darker') DARKER = '-darker', _('Darker')
theme = models.CharField(max_length=20, name = models.CharField(max_length=20,
choices=ThemeChoices.choices, choices=ColorThemeChoices.choices,
default=ThemeChoices.DEFAULT, default=ColorThemeChoices.DEFAULT,
blank=True) blank=True)
user = models.CharField(max_length=150)

View File

@ -6,7 +6,7 @@ from django import template
from InvenTree import version, settings from InvenTree import version, settings
from InvenTree.helpers import decimal2string from InvenTree.helpers import decimal2string
from common.models import InvenTreeSetting, Theme from common.models import InvenTreeSetting, ColorTheme
register = template.Library() register = template.Library()
@ -91,6 +91,9 @@ def inventree_setting(key, *args, **kwargs):
@register.simple_tag() @register.simple_tag()
def get_theme_css(): def get_theme_css(username):
user_theme = Theme.objects.all().get().theme try:
user_theme = ColorTheme.objects.filter(user=username).get().name
except ColorTheme.DoesNotExist:
user_theme = ''
return f'{settings.STATIC_URL}css/inventree' + user_theme + '.css' return f'{settings.STATIC_URL}css/inventree' + user_theme + '.css'

View File

@ -21,10 +21,9 @@
{% csrf_token %} {% csrf_token %}
{% load crispy_forms_tags %} {% load crispy_forms_tags %}
{% crispy form %} {% crispy form %}
{# <button type='submit' class='btn btn-primary'>{% trans "Apply Theme" %}</button> #}
</form> </form>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -39,7 +39,7 @@
<link rel="stylesheet" href="{% static 'css/select2.css' %}"> <link rel="stylesheet" href="{% static 'css/select2.css' %}">
<link rel="stylesheet" href="{% static 'css/select2-bootstrap.css' %}"> <link rel="stylesheet" href="{% static 'css/select2-bootstrap.css' %}">
<link rel="stylesheet" href="{% static 'css/bootstrap-toggle.css' %}"> <link rel="stylesheet" href="{% static 'css/bootstrap-toggle.css' %}">
<link rel="stylesheet" href="{% get_theme_css %}"> <link rel="stylesheet" href="{% get_theme_css user.get_username %}">
{% block css %} {% block css %}
{% endblock %} {% endblock %}