From 2e5ec5d24903f8e1681c291115ca8188f4cf4a2c Mon Sep 17 00:00:00 2001 From: eeintech Date: Mon, 7 Sep 2020 15:15:51 -0500 Subject: [PATCH] Theme change works but applies to all user --- InvenTree/InvenTree/forms.py | 16 ++++++++++-- InvenTree/InvenTree/views.py | 26 +++++++++++++++++++ InvenTree/common/migrations/0007_theme.py | 4 +-- InvenTree/common/models.py | 14 +++++----- .../part/templatetags/inventree_extras.py | 10 +++++-- .../templates/InvenTree/settings/theme.html | 9 ++++--- InvenTree/templates/base.html | 3 ++- 7 files changed, 65 insertions(+), 17 deletions(-) diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py index e090ab9de3..2937ad5651 100644 --- a/InvenTree/InvenTree/forms.py +++ b/InvenTree/InvenTree/forms.py @@ -9,7 +9,7 @@ from django.utils.translation import ugettext as _ from django import forms from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Field -from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText +from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText, StrictButton from django.contrib.auth.models import User from common.models import Theme @@ -171,4 +171,16 @@ class ThemeSelectForm(forms.ModelForm): model = Theme fields = [ 'theme' - ] \ No newline at end of file + ] + + def __init__(self, *args, **kwargs): + super(ThemeSelectForm, self).__init__(*args, **kwargs) + self.helper = FormHelper() + # Form rendering + self.helper.form_show_labels = False + self.helper.form_class = 'form-inline' + # self.helper.field_template = 'bootstrap4/layout/inline_field.html' + self.helper.layout = Layout( + Field('theme'), + StrictButton(_('Apply Theme'), css_class='btn btn-primary', type='submit') + ) \ No newline at end of file diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index a6b7c6cd26..0fd81698e7 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -564,6 +564,32 @@ class ThemeSelectView(FormView): success_url = reverse_lazy('settings-theme') template_name = "InvenTree/settings/theme.html" + def get_initial(self): + """ Select user theme """ + initial = super(ThemeSelectView, self).get_initial() + initial['theme'] = Theme.objects.all().get().theme + return initial + + def post(self, request, *args, **kwargs): + """ Save user color theme """ + form = self.get_form() + if form.is_valid(): + theme_select = form.cleaned_data['theme'] + + try: + user_theme = Theme.objects.all().get() + except Theme.DoesNotExist: + print('No theme selected yet') + user_theme = Theme() + + # Set color theme + user_theme.theme = theme_select + user_theme.save() + + return self.form_valid(form) + else: + return self.form_invalid(form) + class DatabaseStatsView(AjaxView): """ View for displaying database statistics """ diff --git a/InvenTree/common/migrations/0007_theme.py b/InvenTree/common/migrations/0007_theme.py index 9af751af05..ca763b0b07 100644 --- a/InvenTree/common/migrations/0007_theme.py +++ b/InvenTree/common/migrations/0007_theme.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.7 on 2020-09-07 16:12 +# Generated by Django 3.0.7 on 2020-09-07 20:12 from django.db import migrations, models @@ -14,7 +14,7 @@ class Migration(migrations.Migration): name='Theme', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('theme', models.IntegerField(choices=[(0, 'Default'), (1, 'Darker')], default=0)), + ('theme', models.CharField(blank=True, choices=[('', 'Default'), ('-darker', 'Darker')], default='', max_length=20)), ], ), ] diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index ef1778cb87..b696c5486a 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -159,12 +159,12 @@ class Currency(models.Model): class Theme(models.Model): """ Color Theme setting """ - class ThemeChoices(models.IntegerChoices): - DEFAULT = 0, _('Default') - DARKER = 1, _('Darker') + class ThemeChoices(models.TextChoices): + DEFAULT = '', _('Default') + DARKER = '-darker', _('Darker') - theme = models.IntegerField(choices=ThemeChoices.choices, - default=ThemeChoices.DEFAULT) + theme = models.CharField(max_length=20, + choices=ThemeChoices.choices, + default=ThemeChoices.DEFAULT, + blank=True) - def __str__(self): - return self.theme diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 8fa63adc0f..d2a4f66607 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -3,10 +3,10 @@ over and above the built-in Django tags. """ from django import template -from InvenTree import version +from InvenTree import version, settings from InvenTree.helpers import decimal2string -from common.models import InvenTreeSetting +from common.models import InvenTreeSetting, Theme register = template.Library() @@ -88,3 +88,9 @@ def inventree_docs_url(*args, **kwargs): @register.simple_tag() def inventree_setting(key, *args, **kwargs): return InvenTreeSetting.get_setting(key) + + +@register.simple_tag() +def get_theme_css(): + user_theme = Theme.objects.all().get().theme + return f'{settings.STATIC_URL}css/inventree' + user_theme + '.css' diff --git a/InvenTree/templates/InvenTree/settings/theme.html b/InvenTree/templates/InvenTree/settings/theme.html index 234b8e1cd3..e09739671b 100644 --- a/InvenTree/templates/InvenTree/settings/theme.html +++ b/InvenTree/templates/InvenTree/settings/theme.html @@ -1,4 +1,6 @@ {% extends "InvenTree/settings/settings.html" %} +{% load i18n %} +{% load inventree_extras %} {% block tabs %} {% include "InvenTree/settings/tabs.html" with tab='theme' %} @@ -16,9 +18,10 @@
- {% csrf_token %} - {{ form }} - + {% csrf_token %} + {% load crispy_forms_tags %} + {% crispy form %} +{# #}
diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html index ca2ab83f36..1b4cfd0af9 100644 --- a/InvenTree/templates/base.html +++ b/InvenTree/templates/base.html @@ -1,5 +1,6 @@ {% load static %} {% load i18n %} +{% load inventree_extras %} @@ -38,7 +39,7 @@ - + {% block css %} {% endblock %}