From de89c3997d700171b7a6d51674b385e27d7e4753 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 00:20:31 +1000 Subject: [PATCH 01/19] Refactoring a lot of existing settings views --- InvenTree/InvenTree/urls.py | 14 +-- InvenTree/InvenTree/views.py | 2 +- .../InvenTree/settings/appearance.html | 19 ++-- .../templates/InvenTree/settings/build.html | 10 +-- .../templates/InvenTree/settings/global.html | 11 ++- .../templates/InvenTree/settings/navbar.html | 89 ++++++++++++++++++ .../templates/InvenTree/settings/part.html | 10 +-- .../templates/InvenTree/settings/po.html | 10 +-- .../templates/InvenTree/settings/report.html | 10 +-- .../InvenTree/settings/settings.html | 64 +++++++++---- .../templates/InvenTree/settings/so.html | 10 +-- .../templates/InvenTree/settings/stock.html | 11 +-- .../templates/InvenTree/settings/tabs.html | 18 ++-- .../templates/InvenTree/settings/user.html | 90 +++++++------------ .../InvenTree/settings/user_settings.html | 12 +-- InvenTree/templates/panel.html | 13 +++ 16 files changed, 232 insertions(+), 161 deletions(-) create mode 100644 InvenTree/templates/InvenTree/settings/navbar.html create mode 100644 InvenTree/templates/panel.html diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 3cc50bc889..f7581982a7 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -79,19 +79,11 @@ apipatterns = [ settings_urls = [ - url(r'^usersettings/', SettingsView.as_view(template_name='InvenTree/settings/user_settings.html'), name='settings-user-settings'), - url(r'^user/?', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings-user'), - url(r'^appearance/?', AppearanceSelectView.as_view(), name='settings-appearance'), url(r'^i18n/?', include('django.conf.urls.i18n')), + + url(r'^appearance/?', AppearanceSelectView.as_view(), name='settings-appearance'), - url(r'^global/', SettingsView.as_view(template_name='InvenTree/settings/global.html'), name='settings-global'), - url(r'^report/', SettingsView.as_view(template_name='InvenTree/settings/report.html'), name='settings-report'), url(r'^category/', SettingCategorySelectView.as_view(), name='settings-category'), - url(r'^part/', SettingsView.as_view(template_name='InvenTree/settings/part.html'), name='settings-part'), - url(r'^stock/', SettingsView.as_view(template_name='InvenTree/settings/stock.html'), name='settings-stock'), - url(r'^build/', SettingsView.as_view(template_name='InvenTree/settings/build.html'), name='settings-build'), - url(r'^purchase-order/', SettingsView.as_view(template_name='InvenTree/settings/po.html'), name='settings-po'), - url(r'^sales-order/', SettingsView.as_view(template_name='InvenTree/settings/so.html'), name='settings-so'), url(r'^currencies/', CurrencySettingsView.as_view(), name='settings-currencies'), url(r'^currencies-refresh/', CurrencyRefreshView.as_view(), name='settings-currencies-refresh'), @@ -99,7 +91,7 @@ settings_urls = [ url(r'^(?P\d+)/edit/', SettingEdit.as_view(), name='setting-edit'), # Catch any other urls - url(r'^.*$', SettingsView.as_view(template_name='InvenTree/settings/user.html'), name='settings'), + url(r'^.*$', SettingsView.as_view(template_name='InvenTree/settings/settings.html'), name='settings'), ] # Some javascript files are served 'dynamically', allowing them to pass through the Django translation layer diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 4b559642ca..3850dc5e0a 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -779,7 +779,7 @@ class SettingsView(TemplateView): """ View for configuring User settings """ - template_name = "InvenTree/settings.html" + template_name = "InvenTree/settings/settings.html" def get_context_data(self, **kwargs): diff --git a/InvenTree/templates/InvenTree/settings/appearance.html b/InvenTree/templates/InvenTree/settings/appearance.html index d0b414e423..b8d8923859 100644 --- a/InvenTree/templates/InvenTree/settings/appearance.html +++ b/InvenTree/templates/InvenTree/settings/appearance.html @@ -1,16 +1,14 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} + {% load i18n %} -{% load inventree_extras %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='theme' %} +{% block label %}appearance{% endblock %} + +{% block heading %} +{% trans "Appearance" %} {% endblock %} -{% block subtitle %} -{% trans "Theme Settings" %} -{% endblock %} - -{% block settings %} +{% block content %}
@@ -33,15 +31,12 @@
{% endif %} -

{% trans "Language" %}

- -
{% csrf_token %} diff --git a/InvenTree/templates/InvenTree/settings/build.html b/InvenTree/templates/InvenTree/settings/build.html index 7d04a8f8b7..6d16512a99 100644 --- a/InvenTree/templates/InvenTree/settings/build.html +++ b/InvenTree/templates/InvenTree/settings/build.html @@ -1,16 +1,14 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} {% load inventree_extras %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='build' %} -{% endblock %} +{% block label %}build-order{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Build Order Settings" %} {% endblock %} -{% block settings %} +{% block content %} {% include "InvenTree/settings/header.html" %} diff --git a/InvenTree/templates/InvenTree/settings/global.html b/InvenTree/templates/InvenTree/settings/global.html index 0c10a13271..45b83e3851 100644 --- a/InvenTree/templates/InvenTree/settings/global.html +++ b/InvenTree/templates/InvenTree/settings/global.html @@ -1,16 +1,15 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} {% load inventree_extras %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='global' %} -{% endblock %} +{% block label %}global{% endblock %} -{% block subtitle %} + +{% block heading %} {% trans "Global InvenTree Settings" %} {% endblock %} -{% block settings %} +{% block content %}
{% include "InvenTree/settings/header.html" %} diff --git a/InvenTree/templates/InvenTree/settings/navbar.html b/InvenTree/templates/InvenTree/settings/navbar.html new file mode 100644 index 0000000000..4dcb92c8b2 --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/navbar.html @@ -0,0 +1,89 @@ +{% load i18n %} + + \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index 4f49a63cb4..7acb116616 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -1,15 +1,13 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='part' %} -{% endblock %} +{% block label %}parts{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Part Settings" %} {% endblock %} -{% block settings %} +{% block content %}

{% trans "Part Options" %}

diff --git a/InvenTree/templates/InvenTree/settings/po.html b/InvenTree/templates/InvenTree/settings/po.html index 20e3b0074b..f8a114bb12 100644 --- a/InvenTree/templates/InvenTree/settings/po.html +++ b/InvenTree/templates/InvenTree/settings/po.html @@ -1,15 +1,13 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='po' %} -{% endblock %} +{% block label %}purchase-order{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Purchase Order Settings" %} {% endblock %} -{% block settings %} +{% block content %}
{% include "InvenTree/settings/header.html" %} diff --git a/InvenTree/templates/InvenTree/settings/report.html b/InvenTree/templates/InvenTree/settings/report.html index 4e68030ee5..b9a2bd6aec 100644 --- a/InvenTree/templates/InvenTree/settings/report.html +++ b/InvenTree/templates/InvenTree/settings/report.html @@ -1,16 +1,14 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} {% load inventree_extras %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='report' %} -{% endblock %} +{% block label %}reporting{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Report Settings" %} {% endblock %} -{% block settings %} +{% block content %}
{% include "InvenTree/settings/header.html" %} diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index 03cf276594..b845252fd0 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -8,30 +8,26 @@ {% inventree_title %} | {% trans "Settings" %} {% endblock %} +{% block menubar %} +{% include "InvenTree/settings/navbar.html" %} +{% endblock %} + {% block content %} -
-

InvenTree {% trans "Settings" %}

-
+{% include "InvenTree/settings/user.html" %} +{% include "InvenTree/settings/user_settings.html" %} -
- {% block tabs %} - {% include "InvenTree/settings/tabs.html" %} - {% endblock %} -
+{% if user.is_staff %} -
-

- {% block subtitle %} - SUBTITLE GOES HERE - {% endblock %} -

-
- {% block settings %} - {% endblock %} -
+{% include "InvenTree/settings/global.html" %} +{% include "InvenTree/settings/report.html" %} +{% include "InvenTree/settings/part.html" %} +{% include "InvenTree/settings/stock.html" %} +{% include "InvenTree/settings/build.html" %} +{% include "InvenTree/settings/po.html" %} +{% include "InvenTree/settings/so.html" %} -
+{% endif %} {% endblock %} @@ -59,4 +55,34 @@ $('table').find('.btn-edit-setting').click(function() { ); }); +$("#edit-user").on('click', function() { + launchModalForm( + "{% url 'edit-user' %}", + { + reload: true, + } + ); +}); + +$("#edit-password").on('click', function() { + launchModalForm( + "{% url 'set-password' %}", + { + reload: true, + } + ); +}); + + + +enableNavbar({ + label: 'settings', + toggleId: '#item-menu-toggle', +}); + +attachNavCallbacks({ + name: 'settings', + default: 'account' +}); + {% endblock %} diff --git a/InvenTree/templates/InvenTree/settings/so.html b/InvenTree/templates/InvenTree/settings/so.html index 4ef1709068..2fe5680d71 100644 --- a/InvenTree/templates/InvenTree/settings/so.html +++ b/InvenTree/templates/InvenTree/settings/so.html @@ -1,15 +1,13 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='so' %} -{% endblock %} +{% block label %}sales-order{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Sales Order Settings" %} {% endblock %} -{% block settings %} +{% block content %}
{% include "InvenTree/settings/header.html" %} diff --git a/InvenTree/templates/InvenTree/settings/stock.html b/InvenTree/templates/InvenTree/settings/stock.html index 7cf7a94e0b..feb072815a 100644 --- a/InvenTree/templates/InvenTree/settings/stock.html +++ b/InvenTree/templates/InvenTree/settings/stock.html @@ -1,16 +1,13 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='stock' %} -{% endblock %} +{% block label %}stock{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Stock Settings" %} {% endblock %} -{% block settings %} -

{% trans "Stock Options" %}

+{% block content %}
{% include "InvenTree/settings/header.html" %} diff --git a/InvenTree/templates/InvenTree/settings/tabs.html b/InvenTree/templates/InvenTree/settings/tabs.html index 846dfccd23..cde540898c 100644 --- a/InvenTree/templates/InvenTree/settings/tabs.html +++ b/InvenTree/templates/InvenTree/settings/tabs.html @@ -3,44 +3,44 @@

{% trans "User Settings" %}

{% if user.is_staff %}

{% trans "InvenTree Settings" %}

{% endif %} diff --git a/InvenTree/templates/InvenTree/settings/user.html b/InvenTree/templates/InvenTree/settings/user.html index 1606a05cec..bc1d5c7699 100644 --- a/InvenTree/templates/InvenTree/settings/user.html +++ b/InvenTree/templates/InvenTree/settings/user.html @@ -1,69 +1,39 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='user' %} +{% block label %}account{% endblock %} + +{% block heading %} +{% trans "Account Settings" %} {% endblock %} -{% block subtitle %} -{% trans "User Settings" %} -{% endblock %} - -{% block settings %} - -
-

{% trans "User Information" %}

-
-
- {% trans "Edit" %} -
-
- {% trans "Set Password" %} -
+{% block content %} +
+
+ {% trans "Edit" %} +
+
+ {% trans "Set Password" %}
- -
- - - - - - - - - - - - - - - - -
{% trans "Username" %}{{ user.username }}
{% trans "First Name" %}{{ user.first_name }}
{% trans "Last Name" %}{{ user.last_name }}
{% trans "Email Address" %}{{ user.email }}
-{% endblock %} - -{% block js_ready %} -{{ block.super }} - - $("#edit-user").on('click', function() { - launchModalForm( - "{% url 'edit-user' %}", - { - reload: true, - } - ); - }); - - $("#edit-password").on('click', function() { - launchModalForm( - "{% url 'set-password' %}", - { - reload: true, - } - ); - }); - + + + + + + + + + + + + + + + + + +
{% trans "Username" %}{{ user.username }}
{% trans "First Name" %}{{ user.first_name }}
{% trans "Last Name" %}{{ user.last_name }}
{% trans "Email Address" %}{{ user.email }}
{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/user_settings.html b/InvenTree/templates/InvenTree/settings/user_settings.html index 0b76b930c5..00c1ac6f5a 100644 --- a/InvenTree/templates/InvenTree/settings/user_settings.html +++ b/InvenTree/templates/InvenTree/settings/user_settings.html @@ -1,16 +1,15 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} + {% load i18n %} {% load inventree_extras %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='user_settings' %} -{% endblock %} +{% block label %}user-settings{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "User Settings" %} {% endblock %} -{% block settings %} +{% block content %}
@@ -38,4 +37,5 @@
+ {% endblock %} diff --git a/InvenTree/templates/panel.html b/InvenTree/templates/panel.html new file mode 100644 index 0000000000..4fb2e87bc7 --- /dev/null +++ b/InvenTree/templates/panel.html @@ -0,0 +1,13 @@ +
+ {% block panel_heading %} +
+

{% block heading %}HEADING{% endblock %}

+
+ {% endblock %} + {% block panel_content %} +
+ {% block content %} + {% endblock %} +
+ {% endblock %} +
\ No newline at end of file From ca1c692b15ab879c793d98a19ada115b5a97dd39 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 00:29:55 +1000 Subject: [PATCH 02/19] Refactor "Currency settings" view --- InvenTree/InvenTree/urls.py | 3 +- InvenTree/InvenTree/views.py | 42 +++++++------------ .../InvenTree/settings/currencies.html | 14 ++----- .../InvenTree/settings/settings.html | 1 + 4 files changed, 20 insertions(+), 40 deletions(-) diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index f7581982a7..74b4c41b23 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -39,7 +39,7 @@ from rest_framework.documentation import include_docs_urls from .views import auth_request from .views import IndexView, SearchView, DatabaseStatsView from .views import SettingsView, EditUserView, SetPasswordView -from .views import CurrencySettingsView, CurrencyRefreshView +from .views import CurrencyRefreshView from .views import AppearanceSelectView, SettingCategorySelectView from .views import DynamicJsView @@ -84,7 +84,6 @@ settings_urls = [ url(r'^appearance/?', AppearanceSelectView.as_view(), name='settings-appearance'), url(r'^category/', SettingCategorySelectView.as_view(), name='settings-category'), - url(r'^currencies/', CurrencySettingsView.as_view(), name='settings-currencies'), url(r'^currencies-refresh/', CurrencyRefreshView.as_view(), name='settings-currencies-refresh'), url(r'^(?P\d+)/edit/user', UserSettingEdit.as_view(), name='user-setting-edit'), diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 3850dc5e0a..be09969671 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -12,6 +12,7 @@ from django.utils.translation import gettext_lazy as _ from django.template.loader import render_to_string from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.urls import reverse_lazy +from django.shortcuts import redirect from django.contrib.auth.mixins import PermissionRequiredMixin @@ -787,6 +788,18 @@ class SettingsView(TemplateView): ctx['settings'] = InvenTreeSetting.objects.all().order_by('key') + ctx["base_currency"] = currency_code_default() + ctx["currencies"] = currency_codes + + ctx["rates"] = Rate.objects.filter(backend="InvenTreeExchange") + + # When were the rates last updated? + try: + backend = ExchangeBackend.objects.get(name='InvenTreeExchange') + ctx["rates_updated"] = backend.last_update + except: + ctx["rates_updated"] = None + return ctx @@ -805,34 +818,7 @@ class CurrencyRefreshView(RedirectView): # Will block for a little bit InvenTree.tasks.update_exchange_rates() - return self.get(request, *args, **kwargs) - - -class CurrencySettingsView(TemplateView): - """ - View for configuring currency settings - """ - - template_name = "InvenTree/settings/currencies.html" - - def get_context_data(self, **kwargs): - - ctx = super().get_context_data(**kwargs).copy() - - ctx['settings'] = InvenTreeSetting.objects.all().order_by('key') - ctx["base_currency"] = currency_code_default() - ctx["currencies"] = currency_codes - - ctx["rates"] = Rate.objects.filter(backend="InvenTreeExchange") - - # When were the rates last updated? - try: - backend = ExchangeBackend.objects.get(name='InvenTreeExchange') - ctx["rates_updated"] = backend.last_update - except: - ctx["rates_updated"] = None - - return ctx + return redirect(reverse_lazy('settings')) class AppearanceSelectView(FormView): diff --git a/InvenTree/templates/InvenTree/settings/currencies.html b/InvenTree/templates/InvenTree/settings/currencies.html index 6e61533e6b..85274e91aa 100644 --- a/InvenTree/templates/InvenTree/settings/currencies.html +++ b/InvenTree/templates/InvenTree/settings/currencies.html @@ -1,16 +1,14 @@ -{% extends "InvenTree/settings/settings.html" %} +{% extends "panel.html" %} {% load i18n %} {% load inventree_extras %} -{% block tabs %} -{% include "InvenTree/settings/tabs.html" with tab='currencies' %} -{% endblock %} +{% block label %}currencies{% endblock %} -{% block subtitle %} +{% block heading %} {% trans "Currency Settings" %} {% endblock %} -{% block settings %} +{% block content %} {% include "InvenTree/settings/header.html" %} @@ -55,8 +53,4 @@
-{% endblock %} - -{% block js_ready %} -{{ block.super }} {% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index b845252fd0..1d18261b2a 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -20,6 +20,7 @@ {% if user.is_staff %} {% include "InvenTree/settings/global.html" %} +{% include "InvenTree/settings/currencies.html" %} {% include "InvenTree/settings/report.html" %} {% include "InvenTree/settings/part.html" %} {% include "InvenTree/settings/stock.html" %} From 9b0fbb700693b2be9745ff647bfac73932caf829 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 00:36:41 +1000 Subject: [PATCH 03/19] Separate tab for "barcode" settings --- .../templates/InvenTree/settings/barcode.html | 20 ++++++++ .../templates/InvenTree/settings/global.html | 7 +-- .../templates/InvenTree/settings/navbar.html | 12 +++-- .../InvenTree/settings/settings.html | 1 + .../templates/InvenTree/settings/tabs.html | 46 ------------------- 5 files changed, 32 insertions(+), 54 deletions(-) create mode 100644 InvenTree/templates/InvenTree/settings/barcode.html delete mode 100644 InvenTree/templates/InvenTree/settings/tabs.html diff --git a/InvenTree/templates/InvenTree/settings/barcode.html b/InvenTree/templates/InvenTree/settings/barcode.html new file mode 100644 index 0000000000..32b85151d7 --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/barcode.html @@ -0,0 +1,20 @@ +{% extends "panel.html" %} +{% load i18n %} +{% load inventree_extras %} + +{% block label %}barcodes{% endblock %} + +{% block heading %} +{% trans "Barcode Settings" %} +{% endblock %} + +{% block content %} + + + {% include "InvenTree/settings/header.html" %} + + {% include "InvenTree/settings/setting.html" with key="BARCODE_ENABLE" icon="fa-qrcode" %} + +
+ +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/settings/global.html b/InvenTree/templates/InvenTree/settings/global.html index 45b83e3851..d43bec80c0 100644 --- a/InvenTree/templates/InvenTree/settings/global.html +++ b/InvenTree/templates/InvenTree/settings/global.html @@ -2,11 +2,11 @@ {% load i18n %} {% load inventree_extras %} -{% block label %}global{% endblock %} +{% block label %}server{% endblock %} {% block heading %} -{% trans "Global InvenTree Settings" %} +{% trans "Server Settings" %} {% endblock %} {% block content %} @@ -22,12 +22,9 @@ -

{% trans "Barcode Settings" %}

{% include "InvenTree/settings/header.html" %} - {% include "InvenTree/settings/setting.html" with key="BARCODE_ENABLE" icon="fa-qrcode" %} -

{% trans "Search Settings" %}

diff --git a/InvenTree/templates/InvenTree/settings/navbar.html b/InvenTree/templates/InvenTree/settings/navbar.html index 4dcb92c8b2..d5da2ca5de 100644 --- a/InvenTree/templates/InvenTree/settings/navbar.html +++ b/InvenTree/templates/InvenTree/settings/navbar.html @@ -36,9 +36,15 @@ {% trans "InvenTree Settings" %} -
  • - - {% trans "Global" %} +
  • + + {% trans "Server" %} + +
  • + +
  • + + {% trans "Barcodes" %}
  • diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index 1d18261b2a..246f36a0b4 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -20,6 +20,7 @@ {% if user.is_staff %} {% include "InvenTree/settings/global.html" %} +{% include "InvenTree/settings/barcode.html" %} {% include "InvenTree/settings/currencies.html" %} {% include "InvenTree/settings/report.html" %} {% include "InvenTree/settings/part.html" %} diff --git a/InvenTree/templates/InvenTree/settings/tabs.html b/InvenTree/templates/InvenTree/settings/tabs.html deleted file mode 100644 index cde540898c..0000000000 --- a/InvenTree/templates/InvenTree/settings/tabs.html +++ /dev/null @@ -1,46 +0,0 @@ -{% load i18n %} - -

    {% trans "User Settings" %}

    - -{% if user.is_staff %} -

    {% trans "InvenTree Settings" %}

    - -{% endif %} From b7b0574a44d4d0c3cb6f8e18b9405d398895ef8f Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 00:38:59 +1000 Subject: [PATCH 04/19] Add "appearance" --- InvenTree/templates/InvenTree/settings/settings.html | 1 + 1 file changed, 1 insertion(+) diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index 246f36a0b4..6405968674 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -15,6 +15,7 @@ {% block content %} {% include "InvenTree/settings/user.html" %} +{% include "InvenTree/settings/appearance.html" %} {% include "InvenTree/settings/user_settings.html" %} {% if user.is_staff %} From 3349e9ff6cf080609a03de03103b0efb94015fc6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 00:58:31 +1000 Subject: [PATCH 05/19] Refactor language selection --- .../InvenTree/settings/appearance.html | 4 +++ .../InvenTree/settings/settings.html | 1 - .../templates/InvenTree/settings/user.html | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/InvenTree/templates/InvenTree/settings/appearance.html b/InvenTree/templates/InvenTree/settings/appearance.html index b8d8923859..7c4d3a067e 100644 --- a/InvenTree/templates/InvenTree/settings/appearance.html +++ b/InvenTree/templates/InvenTree/settings/appearance.html @@ -37,6 +37,10 @@
    +
    +

    {% trans "Language Settings" %}

    +
    +
    {% csrf_token %} diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index 6405968674..246f36a0b4 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -15,7 +15,6 @@ {% block content %} {% include "InvenTree/settings/user.html" %} -{% include "InvenTree/settings/appearance.html" %} {% include "InvenTree/settings/user_settings.html" %} {% if user.is_staff %} diff --git a/InvenTree/templates/InvenTree/settings/user.html b/InvenTree/templates/InvenTree/settings/user.html index bc1d5c7699..25df98475a 100644 --- a/InvenTree/templates/InvenTree/settings/user.html +++ b/InvenTree/templates/InvenTree/settings/user.html @@ -1,6 +1,7 @@ {% extends "panel.html" %} {% load i18n %} +{% load inventree_extras %} {% block label %}account{% endblock %} @@ -36,4 +37,30 @@ {{ user.email }} +
    +

    {% trans "Language Settings" %}

    +
    + +
    + + {% csrf_token %} + +
    + +
    +
    + +
    + +
    + {% endblock %} \ No newline at end of file From 0186d23563892b3d5598c021623c3a39be498a0b Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 07:56:24 +1000 Subject: [PATCH 06/19] inline theme form --- .../part/templatetags/inventree_extras.py | 12 ++++++++++++ .../templates/InvenTree/settings/user.html | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index a7887ec250..1d4c690cf9 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -226,6 +226,18 @@ def get_color_theme_css(username): return inventree_css_static_url +@register.simple_tag() +def get_available_themes(*args, **kwargs): + """ + Return the available theme choices + """ + + print("available:") + print(ColorTheme.get_color_themes_choices()) + + return ColorTheme.get_color_themes_choices() + + @register.filter def keyvalue(dict, key): """ diff --git a/InvenTree/templates/InvenTree/settings/user.html b/InvenTree/templates/InvenTree/settings/user.html index 25df98475a..e4a08635fa 100644 --- a/InvenTree/templates/InvenTree/settings/user.html +++ b/InvenTree/templates/InvenTree/settings/user.html @@ -37,6 +37,25 @@ {{ user.email }} + +
    +

    {% trans "Theme Settings" %}

    +
    + +
    + +
    + {% csrf_token %} + + +
    + +
    +

    {% trans "Language Settings" %}

    From c63a061cf3ec069003b8e038493098b3ce1db794 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 27 Jul 2021 08:31:43 +1000 Subject: [PATCH 07/19] Refactor "theme" selection --- InvenTree/InvenTree/urls.py | 2 +- InvenTree/InvenTree/views.py | 54 ++-------------- .../part/templatetags/inventree_extras.py | 11 +++- .../InvenTree/settings/appearance.html | 64 ------------------- .../templates/InvenTree/settings/user.html | 24 +++++-- 5 files changed, 31 insertions(+), 124 deletions(-) delete mode 100644 InvenTree/templates/InvenTree/settings/appearance.html diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 74b4c41b23..41ef306a50 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -82,9 +82,9 @@ settings_urls = [ url(r'^i18n/?', include('django.conf.urls.i18n')), url(r'^appearance/?', AppearanceSelectView.as_view(), name='settings-appearance'), + url(r'^currencies-refresh/', CurrencyRefreshView.as_view(), name='settings-currencies-refresh'), url(r'^category/', SettingCategorySelectView.as_view(), name='settings-category'), - url(r'^currencies-refresh/', CurrencyRefreshView.as_view(), name='settings-currencies-refresh'), url(r'^(?P\d+)/edit/user', UserSettingEdit.as_view(), name='user-setting-edit'), url(r'^(?P\d+)/edit/', SettingEdit.as_view(), name='setting-edit'), diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index be09969671..fbb83aeb79 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -821,13 +821,9 @@ class CurrencyRefreshView(RedirectView): return redirect(reverse_lazy('settings')) -class AppearanceSelectView(FormView): +class AppearanceSelectView(RedirectView): """ View for selecting a color theme """ - form_class = ColorThemeSelectForm - success_url = reverse_lazy('settings-appearance') - template_name = "InvenTree/settings/appearance.html" - def get_user_theme(self): """ Get current user color theme """ try: @@ -837,40 +833,10 @@ class AppearanceSelectView(FormView): return user_theme - def get_initial(self): - """ Select current user color theme as initial choice """ - - initial = super(AppearanceSelectView, self).get_initial() - - user_theme = self.get_user_theme() - if user_theme: - initial['name'] = user_theme.name - return initial - - def get(self, request, *args, **kwargs): - """ Check if current color theme exists, else display alert box """ - - context = {} - - form = self.get_form() - context['form'] = form - - user_theme = self.get_user_theme() - if user_theme: - # Check color theme is a valid choice - if not ColorTheme.is_valid_choice(user_theme): - user_color_theme_name = user_theme.name - if not user_color_theme_name: - user_color_theme_name = 'default' - - context['invalid_color_theme'] = user_color_theme_name - - return self.render_to_response(context) - def post(self, request, *args, **kwargs): """ Save user color theme selection """ - form = self.get_form() + theme = request.POST.get('theme', None) # Get current user theme user_theme = self.get_user_theme() @@ -880,20 +846,10 @@ class AppearanceSelectView(FormView): user_theme = ColorTheme() user_theme.user = request.user - if form.is_valid(): - theme_selected = form.cleaned_data['name'] + user_theme.name = theme + user_theme.save() - # Set color theme to form selection - user_theme.name = theme_selected - user_theme.save() - - return self.form_valid(form) - else: - # Set color theme to default - user_theme.name = ColorTheme.default_color_theme[0] - user_theme.save() - - return self.form_invalid(form) + return redirect(reverse_lazy('settings')) class SettingCategorySelectView(FormView): diff --git a/InvenTree/part/templatetags/inventree_extras.py b/InvenTree/part/templatetags/inventree_extras.py index 1d4c690cf9..f930fa4467 100644 --- a/InvenTree/part/templatetags/inventree_extras.py +++ b/InvenTree/part/templatetags/inventree_extras.py @@ -232,10 +232,15 @@ def get_available_themes(*args, **kwargs): Return the available theme choices """ - print("available:") - print(ColorTheme.get_color_themes_choices()) + themes = [] - return ColorTheme.get_color_themes_choices() + for key, name in ColorTheme.get_color_themes_choices(): + themes.append({ + 'key': key, + 'name': name + }) + + return themes @register.filter diff --git a/InvenTree/templates/InvenTree/settings/appearance.html b/InvenTree/templates/InvenTree/settings/appearance.html deleted file mode 100644 index 7c4d3a067e..0000000000 --- a/InvenTree/templates/InvenTree/settings/appearance.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends "panel.html" %} - -{% load i18n %} - -{% block label %}appearance{% endblock %} - -{% block heading %} -{% trans "Appearance" %} -{% endblock %} - -{% block content %} - -
    -
    -

    {% trans "Color Themes" %}

    -
    -
    - -
    - {% csrf_token %} - {% load crispy_forms_tags %} - {% crispy form %} -
    - -{% if invalid_color_theme %} - -{% endif %} - -
    -
    -

    {% trans "Language" %}

    -
    -
    - -
    -

    {% trans "Language Settings" %}

    -
    - -
    -
    {% csrf_token %} - -
    - -
    -
    - -
    -
    -
    -{% endblock %} diff --git a/InvenTree/templates/InvenTree/settings/user.html b/InvenTree/templates/InvenTree/settings/user.html index e4a08635fa..140d2f6b86 100644 --- a/InvenTree/templates/InvenTree/settings/user.html +++ b/InvenTree/templates/InvenTree/settings/user.html @@ -44,14 +44,24 @@
    -
    + {% csrf_token %} - +
    +
    +
    + +
    +
    +
    +
    + +
    @@ -64,7 +74,7 @@
    {% csrf_token %} -
    +
    +
    +
    + +
    -{% if category %} -
    - -

    {% trans "Category Parameter Templates" %}

    - -
    -
    - +
    -{% endif %} -{% endblock %} - -{% block js_ready %} -{{ block.super }} - - {# Convert dropdown to select2 format #} - $(document).ready(function() { - attachSelect('#category-select'); - }); - -{% if category %} - $("#param-table").inventreeTable({ - url: "{% url 'api-part-category-parameters' pk=category.pk %}", - queryParams: { - ordering: 'name', - }, - formatNoMatches: function() { return '{% trans "No category parameter templates found" %}'; }, - columns: [ - { - field: 'pk', - title: 'ID', - visible: false, - switchable: false, - }, - { - field: 'parameter_template.name', - title: '{% trans "Parameter Template" %}', - sortable: 'true', - }, - { - field: 'default_value', - title: '{% trans "Default Value" %}', - sortable: 'true', - formatter: function(value, row, index, field) { - var bEdit = ""; - var bDel = ""; - - var html = value - html += "
    " + bEdit + bDel + "
    "; - - return html; - } - } - ] - }); - - $("#new-param").click(function() { - launchModalForm("{% url 'category-param-template-create' category.pk %}", { - success: function() { - $("#param-table").bootstrapTable('refresh'); - }, - }); - }); - - $("#param-table").on('click', '.template-edit', function() { - var button = $(this); - - var url = "/part/category/{{ category.pk }}/parameters/" + button.attr('pk') + "/edit/"; - - launchModalForm(url, { - success: function() { - $("#param-table").bootstrapTable('refresh'); - } - }); - }); - - $("#param-table").on('click', '.template-delete', function() { - var button = $(this); - - var url = "/part/category/{{ category.pk }}/parameters/" + button.attr('pk') + "/delete/"; - - launchModalForm(url, { - success: function() { - $("#param-table").bootstrapTable('refresh'); - } - }); - }); -{% endif %} + {% endblock %} diff --git a/InvenTree/templates/InvenTree/settings/navbar.html b/InvenTree/templates/InvenTree/settings/navbar.html index e3c00f60be..83bbc10fe9 100644 --- a/InvenTree/templates/InvenTree/settings/navbar.html +++ b/InvenTree/templates/InvenTree/settings/navbar.html @@ -74,6 +74,12 @@ +
  • + + {% trans "Categories" %} + +
  • +
  • {% trans "Stock" %} diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index ad6edf00b8..330a1e617b 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -26,6 +26,7 @@ {% include "InvenTree/settings/currencies.html" %} {% include "InvenTree/settings/report.html" %} {% include "InvenTree/settings/part.html" %} +{% include "InvenTree/settings/category.html" %} {% include "InvenTree/settings/stock.html" %} {% include "InvenTree/settings/build.html" %} {% include "InvenTree/settings/po.html" %} @@ -86,6 +87,159 @@ $("#edit-password").on('click', function() { }); +$('#category-select').select2({ + placeholder: '', + width: '100%', + ajax: { + url: '{% url "api-part-category-list" %}', + dataType: 'json', + delay: 250, + cache: false, + data: function(params) { + if (!params.page) { + offset = 0; + } else { + offset = (params.page - 1) * 25; + } + + return { + search: params.term, + offset: offset, + limit: 25, + }; + }, + processResults: function(response) { + var data = []; + + var more = false; + + if ('count' in response && 'results' in response) { + // Response is paginated + data = response.results; + + // Any more data available? + if (response.next) { + more = true; + } + + } else { + // Non-paginated response + data = response; + } + + // Each 'row' must have the 'id' attribute + for (var idx = 0; idx < data.length; idx++) { + data[idx].id = data[idx].pk; + data[idx].text = data[idx].pathstring; + } + + // Ref: https://select2.org/data-sources/formats + var results = { + results: data, + pagination: { + more: more, + } + }; + + return results; + } + }, +}); + +$('#cat-param-table').inventreeTable({ + formatNoMatches: function() { return '{% trans "No category parameter templates found" %}'; }, + columns: [ + { + field: 'pk', + title: 'ID', + visible: false, + switchable: false, + }, + { + field: 'parameter_template.name', + title: '{% trans "Parameter Template" %}', + sortable: 'true', + }, + { + field: 'category_detail.pathstring', + title: '{% trans "Category" %}', + }, + { + field: 'default_value', + title: '{% trans "Default Value" %}', + sortable: 'true', + formatter: function(value, row, index, field) { + var bEdit = ""; + var bDel = ""; + + var html = value + html += "
    " + bEdit + bDel + "
    "; + + return html; + } + } + ] +}); + +function loadTemplateTable(pk) { + + console.log('refresh:', pk); + + // Enable the buttons + $('#new-cat-param').removeAttr('disabled'); + + // Load the parameter table + $("#cat-param-table").bootstrapTable('refresh', { + query: { + category: pk, + }, + url: '{% url "api-part-category-parameter-list" %}', + }); +} + +$('body').on('change', '#category-select', function() { + var pk = $(this).val(); + loadTemplateTable(pk); +}); + +$("#new-cat-param").click(function() { + + var pk = $('#category-select').val(); + + launchModalForm(`/part/category/${pk}/parameters/new/`, { + success: function() { + $("#cat-param-table").bootstrapTable('refresh'); + }, + }); +}); + +$("#cat-param-table").on('click', '.template-edit', function() { + + var category = $('#category-select').val(); + var pk = $(this).attr('pk'); + + var url = `/part/category/${category}/parameters/${pk}/edit/`; + + launchModalForm(url, { + success: function() { + $("#cat-param-table").bootstrapTable('refresh'); + } + }); +}); + +$("#cat-param-table").on('click', '.template-delete', function() { + + var category = $('#category-select').val(); + var pk = $(this).attr('pk'); + + var url = `/part/category/${category}/parameters/${pk}/delete/`; + + launchModalForm(url, { + success: function() { + $("#cat-param-table").bootstrapTable('refresh'); + } + }); +}); enableNavbar({ label: 'settings', From cd1ecc5e8fc1511507b1c19c5e506a34664e44ac Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 28 Jul 2021 14:17:25 +1000 Subject: [PATCH 18/19] style fixes --- InvenTree/part/api.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 5df5913ea0..3612a1c9f9 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -6,10 +6,9 @@ Provides a JSON API for the Part app from __future__ import unicode_literals from django.conf.urls import url, include -from django.db.models.expressions import Value from django.urls import reverse from django.http import JsonResponse -from django.db.models import Q, F, Count, Min, Max, Avg, query +from django.db.models import Q, F, Count, Min, Max, Avg from django.utils.translation import ugettext_lazy as _ from rest_framework import status From 6fd70e474123adedf52dd1454d2cb69d7439c955 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 28 Jul 2021 14:18:42 +1000 Subject: [PATCH 19/19] Fix search settings page --- InvenTree/templates/InvenTree/settings/settings.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/templates/InvenTree/settings/settings.html b/InvenTree/templates/InvenTree/settings/settings.html index 330a1e617b..9fd069af52 100644 --- a/InvenTree/templates/InvenTree/settings/settings.html +++ b/InvenTree/templates/InvenTree/settings/settings.html @@ -17,7 +17,7 @@ {% include "InvenTree/settings/user.html" %} {% include "InvenTree/settings/user_settings.html" %} {% include "InvenTree/settings/user_homepage.html" %} -{% include "InvenTree/settings/user_homepage.html" %} +{% include "InvenTree/settings/user_search.html" %} {% if user.is_staff %}