mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-14 19:15:41 +00:00
Merge remote-tracking branch 'inventree/master' into currency-support
# Conflicts: # InvenTree/InvenTree/settings.py # InvenTree/InvenTree/urls.py # InvenTree/templates/InvenTree/settings/tabs.html # InvenTree/users/models.py # requirements.txt IMPORTANT: Had to merge some migration files due to different migrations applied on the part model tables
This commit is contained in:
@ -1,92 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.apps import AppConfig
|
||||
from django.db.utils import OperationalError, ProgrammingError, IntegrityError
|
||||
|
||||
|
||||
class CommonConfig(AppConfig):
|
||||
name = 'common'
|
||||
|
||||
def ready(self):
|
||||
|
||||
""" Will be called when the Common app is first loaded """
|
||||
self.add_instance_name()
|
||||
self.add_default_settings()
|
||||
|
||||
def add_instance_name(self):
|
||||
"""
|
||||
Check if an InstanceName has been defined for this database.
|
||||
If not, create a random one!
|
||||
"""
|
||||
|
||||
# See note above
|
||||
from .models import InvenTreeSetting
|
||||
|
||||
"""
|
||||
Note: The "old" instance name was stored under the key 'InstanceName',
|
||||
but has now been renamed to 'INVENTREE_INSTANCE'.
|
||||
"""
|
||||
|
||||
try:
|
||||
|
||||
# Quick exit if a value already exists for 'inventree_instance'
|
||||
if InvenTreeSetting.objects.filter(key='INVENTREE_INSTANCE').exists():
|
||||
return
|
||||
|
||||
# Default instance name
|
||||
instance_name = InvenTreeSetting.get_default_value('INVENTREE_INSTANCE')
|
||||
|
||||
# Use the old name if it exists
|
||||
if InvenTreeSetting.objects.filter(key='InstanceName').exists():
|
||||
instance = InvenTreeSetting.objects.get(key='InstanceName')
|
||||
instance_name = instance.value
|
||||
|
||||
# Delete the legacy key
|
||||
instance.delete()
|
||||
|
||||
# Create new value
|
||||
InvenTreeSetting.objects.create(
|
||||
key='INVENTREE_INSTANCE',
|
||||
value=instance_name
|
||||
)
|
||||
|
||||
except (OperationalError, ProgrammingError, IntegrityError):
|
||||
# Migrations have not yet been applied - table does not exist
|
||||
pass
|
||||
|
||||
def add_default_settings(self):
|
||||
"""
|
||||
Create all required settings, if they do not exist.
|
||||
"""
|
||||
|
||||
from .models import InvenTreeSetting
|
||||
|
||||
for key in InvenTreeSetting.GLOBAL_SETTINGS.keys():
|
||||
try:
|
||||
settings = InvenTreeSetting.objects.filter(key__iexact=key)
|
||||
|
||||
if settings.count() == 0:
|
||||
value = InvenTreeSetting.get_default_value(key)
|
||||
|
||||
print(f"Creating default setting for {key} -> '{value}'")
|
||||
|
||||
InvenTreeSetting.objects.create(
|
||||
key=key,
|
||||
value=value
|
||||
)
|
||||
|
||||
return
|
||||
|
||||
elif settings.count() > 1:
|
||||
# Prevent multiple shadow copies of the same setting!
|
||||
for setting in settings[1:]:
|
||||
setting.delete()
|
||||
|
||||
# Ensure that the key has the correct case
|
||||
setting = settings[0]
|
||||
|
||||
if not setting.key == key:
|
||||
setting.key = key
|
||||
setting.save()
|
||||
|
||||
except (OperationalError, ProgrammingError, IntegrityError):
|
||||
# Table might not yet exist
|
||||
pass
|
||||
pass
|
||||
|
@ -1,16 +0,0 @@
|
||||
# Test fixtures for Currency objects
|
||||
|
||||
- model: common.currency
|
||||
fields:
|
||||
symbol: '$'
|
||||
suffix: 'AUD'
|
||||
description: 'Australian Dollars'
|
||||
base: True
|
||||
|
||||
- model: common.currency
|
||||
fields:
|
||||
symbol: '$'
|
||||
suffix: 'USD'
|
||||
description: 'US Dollars'
|
||||
base: False
|
||||
value: 1.4
|
13
InvenTree/common/fixtures/settings.yaml
Normal file
13
InvenTree/common/fixtures/settings.yaml
Normal file
@ -0,0 +1,13 @@
|
||||
# Sample settings objects
|
||||
|
||||
- model: common.InvenTreeSetting
|
||||
pk: 1
|
||||
fields:
|
||||
key: INVENTREE_INSTANCE
|
||||
value: "My very first InvenTree Instance"
|
||||
|
||||
- model: common.InvenTreeSetting
|
||||
pk: 2
|
||||
fields:
|
||||
key: INVENTREE_COMPANY_NAME
|
||||
value: "ACME Pty Ltd"
|
@ -103,6 +103,13 @@ 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'),
|
||||
|
@ -12,6 +12,10 @@ class SettingsTest(TestCase):
|
||||
Tests for the 'settings' model
|
||||
"""
|
||||
|
||||
fixtures = [
|
||||
'settings',
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
|
||||
User = get_user_model()
|
||||
@ -22,6 +26,20 @@ class SettingsTest(TestCase):
|
||||
|
||||
self.client.login(username='username', password='password')
|
||||
|
||||
def test_settings_objects(self):
|
||||
|
||||
# There should be two settings objects in the database
|
||||
settings = InvenTreeSetting.objects.all()
|
||||
|
||||
self.assertEqual(settings.count(), 2)
|
||||
|
||||
instance_name = InvenTreeSetting.objects.get(pk=1)
|
||||
self.assertEqual(instance_name.key, 'INVENTREE_INSTANCE')
|
||||
self.assertEqual(instance_name.value, 'My very first InvenTree Instance')
|
||||
|
||||
# Check object lookup (case insensitive)
|
||||
self.assertEqual(InvenTreeSetting.get_setting_object('iNvEnTrEE_inSTanCE').pk, 1)
|
||||
|
||||
def test_required_values(self):
|
||||
"""
|
||||
- Ensure that every global setting has a name.
|
||||
|
Reference in New Issue
Block a user