diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 5865b3ce70..a7a75fa180 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -1035,48 +1035,56 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'default': True, 'validator': bool, }, + 'LOGIN_ENABLE_REG': { 'name': _('Enable registration'), 'description': _('Enable self-registration for users on the login pages'), 'default': False, 'validator': bool, }, + 'LOGIN_ENABLE_SSO': { 'name': _('Enable SSO'), 'description': _('Enable SSO on the login pages'), 'default': False, 'validator': bool, }, + 'LOGIN_MAIL_REQUIRED': { 'name': _('Email required'), 'description': _('Require user to supply mail on signup'), 'default': False, 'validator': bool, }, + 'LOGIN_SIGNUP_SSO_AUTO': { 'name': _('Auto-fill SSO users'), 'description': _('Automatically fill out user-details from SSO account-data'), 'default': True, 'validator': bool, }, + 'LOGIN_SIGNUP_MAIL_TWICE': { 'name': _('Mail twice'), 'description': _('On signup ask users twice for their mail'), 'default': False, 'validator': bool, }, + 'LOGIN_SIGNUP_PWD_TWICE': { 'name': _('Password twice'), 'description': _('On signup ask users twice for their password'), 'default': True, 'validator': bool, }, + 'SIGNUP_GROUP': { 'name': _('Group on signup'), 'description': _('Group to which new users are assigned on registration'), 'default': '', 'choices': settings_group_options }, + 'LOGIN_ENFORCE_MFA': { 'name': _('Enforce MFA'), 'description': _('Users must use multifactor security.'), @@ -1091,6 +1099,7 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'validator': bool, 'requires_restart': True, }, + # Settings for plugin mixin features 'ENABLE_PLUGINS_URL': { 'name': _('Enable URL integration'), @@ -1099,6 +1108,7 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'validator': bool, 'requires_restart': True, }, + 'ENABLE_PLUGINS_NAVIGATION': { 'name': _('Enable navigation integration'), 'description': _('Enable plugins to integrate into navigation'), @@ -1106,6 +1116,7 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'validator': bool, 'requires_restart': True, }, + 'ENABLE_PLUGINS_APP': { 'name': _('Enable app integration'), 'description': _('Enable plugins to add apps'), @@ -1113,6 +1124,7 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'validator': bool, 'requires_restart': True, }, + 'ENABLE_PLUGINS_SCHEDULE': { 'name': _('Enable schedule integration'), 'description': _('Enable plugins to run scheduled tasks'), @@ -1120,6 +1132,7 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'validator': bool, 'requires_restart': True, }, + 'ENABLE_PLUGINS_EVENTS': { 'name': _('Enable event integration'), 'description': _('Enable plugins to respond to internal events'), @@ -1173,18 +1186,21 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): 'default': True, 'validator': bool, }, + 'HOMEPAGE_CATEGORY_STARRED': { 'name': _('Show subscribed categories'), 'description': _('Show subscribed part categories on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_PART_LATEST': { 'name': _('Show latest parts'), 'description': _('Show latest parts on the homepage'), 'default': True, 'validator': bool, }, + 'PART_RECENT_COUNT': { 'name': _('Recent Part Count'), 'description': _('Number of recent parts to display on index page'), @@ -1198,78 +1214,91 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): 'default': True, 'validator': bool, }, + 'HOMEPAGE_STOCK_RECENT': { 'name': _('Show recent stock changes'), 'description': _('Show recently changed stock items on the homepage'), 'default': True, 'validator': bool, }, + 'STOCK_RECENT_COUNT': { 'name': _('Recent Stock Count'), 'description': _('Number of recent stock items to display on index page'), 'default': 10, 'validator': [int, MinValueValidator(1)] }, + 'HOMEPAGE_STOCK_LOW': { 'name': _('Show low stock'), 'description': _('Show low stock items on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_STOCK_DEPLETED': { 'name': _('Show depleted stock'), 'description': _('Show depleted stock items on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_STOCK_NEEDED': { 'name': _('Show needed stock'), 'description': _('Show stock items needed for builds on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_STOCK_EXPIRED': { 'name': _('Show expired stock'), 'description': _('Show expired stock items on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_STOCK_STALE': { 'name': _('Show stale stock'), 'description': _('Show stale stock items on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_BUILD_PENDING': { 'name': _('Show pending builds'), 'description': _('Show pending builds on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_BUILD_OVERDUE': { 'name': _('Show overdue builds'), 'description': _('Show overdue builds on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_PO_OUTSTANDING': { 'name': _('Show outstanding POs'), 'description': _('Show outstanding POs on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_PO_OVERDUE': { 'name': _('Show overdue POs'), 'description': _('Show overdue POs on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_SO_OUTSTANDING': { 'name': _('Show outstanding SOs'), 'description': _('Show outstanding SOs on the homepage'), 'default': True, 'validator': bool, }, + 'HOMEPAGE_SO_OVERDUE': { 'name': _('Show overdue SOs'), 'description': _('Show overdue SOs on the homepage'), @@ -1367,7 +1396,7 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): 'default': False, 'validator': bool, }, - + 'PART_SHOW_QUANTITY_IN_FORMS': { 'name': _('Show Quantity in Forms'), 'description': _('Display available part quantity in some forms'), @@ -1381,7 +1410,7 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): 'default': False, 'validator': bool, }, - + 'STICKY_HEADER': { 'name': _('Fixed Navbar'), 'description': _('The navbar position is fixed to the top of the screen'), @@ -1403,7 +1432,7 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): ('MMM DD YYYY', 'Feb 22 2022'), ] }, - + 'DISPLAY_SCHEDULE_TAB': { 'name': _('Part Scheduling'), 'description': _('Display part scheduling information'), diff --git a/InvenTree/common/tests.py b/InvenTree/common/tests.py index 921e1ee9b7..6f983d0009 100644 --- a/InvenTree/common/tests.py +++ b/InvenTree/common/tests.py @@ -243,9 +243,6 @@ class SettingsApiTest(InvenTreeAPITestCase): # Invalid values evaluate to False self.assertFalse(str2bool(response.data['value'])) - def test_user_setting_string(self): - ... - def test_user_setting_choice(self): setting = InvenTreeUserSetting.get_setting_object( @@ -286,7 +283,49 @@ class SettingsApiTest(InvenTreeAPITestCase): self.assertIn('Chosen value is not a valid option', str(response.data)) def test_user_setting_integer(self): - ... + + setting = InvenTreeUserSetting.get_setting_object( + 'SEARCH_PREVIEW_RESULTS', + user=self.user + ) + + url = reverse('api-user-setting-detail', kwargs={'pk': setting.pk}) + + # Check default value for this setting + self.assertEqual(setting.value, 10) + + for v in [1, 9, 99]: + setting.value = v + setting.save() + + response = self.get(url) + + self.assertEqual(response.data['value'], str(v)) + + # Set valid options via the api + for v in [5, 15, 25]: + self.patch( + url, + { + 'value': v, + }, + expected_code=200, + ) + + setting.refresh_from_db() + self.assertEqual(setting.native_value, v) + + # Set invalid options via the API + # Note that this particular setting has a MinValueValidator(1) associated with it + for v in [0, -1, -5]: + + response = self.patch( + url, + { + 'value': v, + }, + expected_code=400, + ) class WebhookMessageTests(TestCase):