mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-15 03:25:42 +00:00
Merge branch 'master' into categories_parameters
This commit is contained in:
@ -64,6 +64,13 @@ class InvenTreeSetting(models.Model):
|
||||
'description': _('Regular expression pattern for matching Part IPN')
|
||||
},
|
||||
|
||||
'PART_ALLOW_DUPLICATE_IPN': {
|
||||
'name': _('Allow Duplicate IPN'),
|
||||
'description': _('Allow multiple parts to share the same IPN'),
|
||||
'default': True,
|
||||
'validator': bool,
|
||||
},
|
||||
|
||||
'PART_COPY_BOM': {
|
||||
'name': _('Copy Part BOM Data'),
|
||||
'description': _('Copy BOM data by default when duplicating a part'),
|
||||
@ -92,6 +99,41 @@ class InvenTreeSetting(models.Model):
|
||||
'validator': bool
|
||||
},
|
||||
|
||||
'PART_CATEGORY_PARAMETERS': {
|
||||
'name': _('Copy Category Parameter Templates'),
|
||||
'description': _('Copy category parameter templates when creating a part'),
|
||||
'default': True,
|
||||
'validator': bool
|
||||
},
|
||||
|
||||
'PART_COMPONENT': {
|
||||
'name': _('Component'),
|
||||
'description': _('Parts can be used as sub-components by default'),
|
||||
'default': True,
|
||||
'validator': bool,
|
||||
},
|
||||
|
||||
'PART_PURCHASEABLE': {
|
||||
'name': _('Purchaseable'),
|
||||
'description': _('Parts are purchaseable by default'),
|
||||
'default': False,
|
||||
'validator': bool,
|
||||
},
|
||||
|
||||
'PART_SALABLE': {
|
||||
'name': _('Salable'),
|
||||
'description': _('Parts are salable by default'),
|
||||
'default': False,
|
||||
'validator': bool,
|
||||
},
|
||||
|
||||
'PART_TRACKABLE': {
|
||||
'name': _('Trackable'),
|
||||
'description': _('Parts are trackable by default'),
|
||||
'default': False,
|
||||
'validator': bool,
|
||||
},
|
||||
|
||||
'BUILDORDER_REFERENCE_PREFIX': {
|
||||
'name': _('Build Order Reference Prefix'),
|
||||
'description': _('Prefix value for build order reference'),
|
||||
@ -249,9 +291,16 @@ class InvenTreeSetting(models.Model):
|
||||
setting = InvenTreeSetting.get_setting_object(key)
|
||||
|
||||
if setting:
|
||||
return setting.value
|
||||
value = setting.value
|
||||
|
||||
# If the particular setting is defined as a boolean, cast the value to a boolean
|
||||
if setting.is_bool():
|
||||
value = InvenTree.helpers.str2bool(value)
|
||||
|
||||
else:
|
||||
return backup_value
|
||||
value = backup_value
|
||||
|
||||
return value
|
||||
|
||||
@classmethod
|
||||
def set_setting(cls, key, value, user, create=True):
|
||||
@ -277,6 +326,10 @@ class InvenTreeSetting(models.Model):
|
||||
setting = InvenTreeSetting(key=key)
|
||||
else:
|
||||
return
|
||||
|
||||
# Enforce standard boolean representation
|
||||
if setting.is_bool():
|
||||
value = InvenTree.helpers.str2bool(value)
|
||||
|
||||
setting.value = str(value)
|
||||
setting.save()
|
||||
@ -289,6 +342,10 @@ class InvenTreeSetting(models.Model):
|
||||
def name(self):
|
||||
return InvenTreeSetting.get_setting_name(self.key)
|
||||
|
||||
@property
|
||||
def default_value(self):
|
||||
return InvenTreeSetting.get_default_value(self.key)
|
||||
|
||||
@property
|
||||
def description(self):
|
||||
return InvenTreeSetting.get_setting_description(self.key)
|
||||
|
@ -69,4 +69,14 @@ class SettingsTest(TestCase):
|
||||
|
||||
InvenTreeSetting.set_setting(key, value, self.user)
|
||||
|
||||
self.assertEqual(str(value), InvenTreeSetting.get_setting(key))
|
||||
self.assertEqual(value, InvenTreeSetting.get_setting(key))
|
||||
|
||||
# Any fields marked as 'boolean' must have a default value specified
|
||||
setting = InvenTreeSetting.get_setting_object(key)
|
||||
|
||||
if setting.is_bool():
|
||||
if setting.default_value in ['', None]:
|
||||
raise ValueError(f'Default value for boolean setting {key} not provided')
|
||||
|
||||
if setting.default_value not in [True, False]:
|
||||
raise ValueError(f'Non-boolean default value specified for {key}')
|
||||
|
Reference in New Issue
Block a user