From 9fa37a915657d3637d53920a348dbc47779ab0a8 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 3 Jan 2021 22:57:39 +1100 Subject: [PATCH 1/5] Improve visualisation of global settings --- InvenTree/common/models.py | 16 +++++++++++++++- .../templates/InvenTree/settings/build.html | 2 +- .../templates/InvenTree/settings/global.html | 8 ++++---- .../templates/InvenTree/settings/header.html | 12 ++++++++++++ InvenTree/templates/InvenTree/settings/part.html | 16 +++++++++------- InvenTree/templates/InvenTree/settings/po.html | 2 +- .../templates/InvenTree/settings/setting.html | 9 ++++++++- InvenTree/templates/InvenTree/settings/so.html | 2 +- .../templates/InvenTree/settings/stock.html | 3 +++ 9 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 InvenTree/templates/InvenTree/settings/header.html diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index fa1d4dc5c9..924c55b54d 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -110,7 +110,21 @@ class InvenTreeSetting(models.Model): 'default': True, 'validator': bool }, - + + 'PART_TEMPLATE': { + 'name': _('Template'), + 'description': _('Parts are templates by default'), + 'default': False, + 'validator': bool, + }, + + 'PART_ASSEMBLY': { + 'name': _('Assembly'), + 'description': _('Parts can be assembled from other components by default'), + 'default': False, + 'validator': bool, + }, + 'PART_COMPONENT': { 'name': _('Component'), 'description': _('Parts can be used as sub-components by default'), diff --git a/InvenTree/templates/InvenTree/settings/build.html b/InvenTree/templates/InvenTree/settings/build.html index 781402795b..7d04a8f8b7 100644 --- a/InvenTree/templates/InvenTree/settings/build.html +++ b/InvenTree/templates/InvenTree/settings/build.html @@ -13,7 +13,7 @@ {% block settings %} - + {% include "InvenTree/settings/header.html" %} {% include "InvenTree/settings/setting.html" with key="BUILDORDER_REFERENCE_PREFIX" %} {% include "InvenTree/settings/setting.html" with key="BUILDORDER_REFERENCE_REGEX" %} diff --git a/InvenTree/templates/InvenTree/settings/global.html b/InvenTree/templates/InvenTree/settings/global.html index 775d30b915..76af68b441 100644 --- a/InvenTree/templates/InvenTree/settings/global.html +++ b/InvenTree/templates/InvenTree/settings/global.html @@ -13,11 +13,11 @@ {% block settings %}
- + {% include "InvenTree/settings/header.html" %} - {% include "InvenTree/settings/setting.html" with key="INVENTREE_INSTANCE" %} - {% include "InvenTree/settings/setting.html" with key="INVENTREE_COMPANY_NAME" %} - {% include "InvenTree/settings/setting.html" with key="INVENTREE_DEFAULT_CURRENCY" %} + {% include "InvenTree/settings/setting.html" with key="INVENTREE_INSTANCE" icon="fa-info-circle" %} + {% include "InvenTree/settings/setting.html" with key="INVENTREE_COMPANY_NAME" icon="fa-building" %} + {% include "InvenTree/settings/setting.html" with key="INVENTREE_DEFAULT_CURRENCY" icon="fa-dollar-sign" %}
diff --git a/InvenTree/templates/InvenTree/settings/header.html b/InvenTree/templates/InvenTree/settings/header.html new file mode 100644 index 0000000000..d60a4dd784 --- /dev/null +++ b/InvenTree/templates/InvenTree/settings/header.html @@ -0,0 +1,12 @@ +{% load i18n %} + + + + + + {% trans "Setting" %} + {% trans "Value" %} + {% trans "Description" %} + + + diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index d1ad6e98e9..415449a559 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -14,16 +14,18 @@

{% trans "Part Options" %}

- + {% include "InvenTree/settings/header.html" %} {% include "InvenTree/settings/setting.html" with key="PART_IPN_REGEX" %} {% include "InvenTree/settings/setting.html" with key="PART_ALLOW_DUPLICATE_IPN" %} - - {% include "InvenTree/settings/setting.html" with key="PART_COMPONENT" %} - {% include "InvenTree/settings/setting.html" with key="PART_PURCHASEABLE" %} - {% include "InvenTree/settings/setting.html" with key="PART_SALABLE" %} - {% include "InvenTree/settings/setting.html" with key="PART_TRACKABLE" %} - + + {% include "InvenTree/settings/setting.html" with key="PART_TEMPLATE" icon="fa-clone" %} + {% include "InvenTree/settings/setting.html" with key="PART_ASSEMBLY" icon="fa-tools" %} + {% include "InvenTree/settings/setting.html" with key="PART_COMPONENT" icon="fa-th"%} + {% include "InvenTree/settings/setting.html" with key="PART_TRACKABLE" icon="fa-directions" %} + {% include "InvenTree/settings/setting.html" with key="PART_PURCHASEABLE" icon="fa-shopping-cart" %} + {% include "InvenTree/settings/setting.html" with key="PART_SALABLE" icon="fa-dollar-sign" %} + {% include "InvenTree/settings/setting.html" with key="PART_COPY_BOM" %} {% include "InvenTree/settings/setting.html" with key="PART_COPY_PARAMETERS" %} {% include "InvenTree/settings/setting.html" with key="PART_COPY_TESTS" %} diff --git a/InvenTree/templates/InvenTree/settings/po.html b/InvenTree/templates/InvenTree/settings/po.html index a709d40dd3..20e3b0074b 100644 --- a/InvenTree/templates/InvenTree/settings/po.html +++ b/InvenTree/templates/InvenTree/settings/po.html @@ -11,7 +11,7 @@ {% block settings %}
- + {% include "InvenTree/settings/header.html" %} {% include "InvenTree/settings/setting.html" with key="PURCHASEORDER_REFERENCE_PREFIX" %} diff --git a/InvenTree/templates/InvenTree/settings/setting.html b/InvenTree/templates/InvenTree/settings/setting.html index ffbb78cbbc..b08f4aeb3a 100644 --- a/InvenTree/templates/InvenTree/settings/setting.html +++ b/InvenTree/templates/InvenTree/settings/setting.html @@ -3,6 +3,11 @@ {% setting_object key as setting %} + + + {{ setting.value }}{{ setting.units }} + {% else %} {% trans "No value set" %} {% endif %} diff --git a/InvenTree/templates/InvenTree/settings/so.html b/InvenTree/templates/InvenTree/settings/so.html index 368374532f..4ef1709068 100644 --- a/InvenTree/templates/InvenTree/settings/so.html +++ b/InvenTree/templates/InvenTree/settings/so.html @@ -12,7 +12,7 @@ {% block settings %}
+ {% if icon %} + + {% endif %} + {{ setting.name }} {% if setting.is_bool %} @@ -11,7 +16,9 @@ {% else %} {% if setting.value %} - {{ setting.value }}{{ setting.units }}
- + {% include "InvenTree/settings/header.html" %} {% include "InvenTree/settings/setting.html" with key="SALESORDER_REFERENCE_PREFIX" %} diff --git a/InvenTree/templates/InvenTree/settings/stock.html b/InvenTree/templates/InvenTree/settings/stock.html index c3c40087ff..7bec8b566c 100644 --- a/InvenTree/templates/InvenTree/settings/stock.html +++ b/InvenTree/templates/InvenTree/settings/stock.html @@ -10,4 +10,7 @@ {% endblock %} {% block settings %} +
+ No Stock settings available +
{% endblock %} \ No newline at end of file From 6c7b648133352e5c03856a82d6ab772b17eb66e9 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 3 Jan 2021 23:06:51 +1100 Subject: [PATCH 2/5] Implement global settings for assembly and template values of Part model --- InvenTree/part/forms.py | 3 + .../migrations/0061_auto_20210103_2306.py | 74 +++++++++++++++ InvenTree/part/models.py | 90 +++++++++++++------ InvenTree/part/settings.py | 16 ++++ InvenTree/part/test_part.py | 4 + 5 files changed, 160 insertions(+), 27 deletions(-) create mode 100644 InvenTree/part/migrations/0061_auto_20210103_2306.py diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index 1cbbec0b42..458667f3fe 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -230,6 +230,9 @@ class EditPartForm(HelperForm): 'default_supplier', 'units', 'minimum_stock', + 'component', + 'assembly', + 'is_template', 'trackable', 'purchaseable', 'salable', diff --git a/InvenTree/part/migrations/0061_auto_20210103_2306.py b/InvenTree/part/migrations/0061_auto_20210103_2306.py new file mode 100644 index 0000000000..fa1f8c04c6 --- /dev/null +++ b/InvenTree/part/migrations/0061_auto_20210103_2306.py @@ -0,0 +1,74 @@ +# Generated by Django 3.0.7 on 2021-01-03 12:06 + +import InvenTree.fields +import InvenTree.validators +from django.db import migrations, models +import django.db.models.deletion +import mptt.fields +import part.settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0055_auto_20201117_1453'), + ('part', '0060_merge_20201112_1722'), + ] + + operations = [ + migrations.AlterField( + model_name='part', + name='IPN', + field=models.CharField(blank=True, help_text='Internal Part Number', max_length=100, null=True, validators=[InvenTree.validators.validate_part_ipn], verbose_name='IPN'), + ), + migrations.AlterField( + model_name='part', + name='assembly', + field=models.BooleanField(default=part.settings.part_assembly_default, help_text='Can this part be built from other parts?', verbose_name='Assembly'), + ), + migrations.AlterField( + model_name='part', + name='category', + field=mptt.fields.TreeForeignKey(blank=True, help_text='Part category', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='parts', to='part.PartCategory', verbose_name='Category'), + ), + migrations.AlterField( + model_name='part', + name='default_location', + field=mptt.fields.TreeForeignKey(blank=True, help_text='Where is this item normally stored?', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_parts', to='stock.StockLocation', verbose_name='Default Location'), + ), + migrations.AlterField( + model_name='part', + name='description', + field=models.CharField(help_text='Part description', max_length=250, verbose_name='Description'), + ), + migrations.AlterField( + model_name='part', + name='is_template', + field=models.BooleanField(default=part.settings.part_template_default, help_text='Is this part a template part?', verbose_name='Is Template'), + ), + migrations.AlterField( + model_name='part', + name='keywords', + field=models.CharField(blank=True, help_text='Part keywords to improve visibility in search results', max_length=250, null=True, verbose_name='Keywords'), + ), + migrations.AlterField( + model_name='part', + name='link', + field=InvenTree.fields.InvenTreeURLField(blank=True, help_text='Link to external URL', null=True, verbose_name='Link'), + ), + migrations.AlterField( + model_name='part', + name='name', + field=models.CharField(help_text='Part name', max_length=100, validators=[InvenTree.validators.validate_part_name], verbose_name='Name'), + ), + migrations.AlterField( + model_name='part', + name='revision', + field=models.CharField(blank=True, help_text='Part revision or version number', max_length=100, null=True, verbose_name='Revision'), + ), + migrations.AlterField( + model_name='part', + name='variant_of', + field=models.ForeignKey(blank=True, help_text='Is this part a variant of another part?', limit_choices_to={'active': True, 'is_template': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='variants', to='part.Part', verbose_name='Variant Of'), + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index b9d63979e7..bcb9c99749 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -640,36 +640,69 @@ class Part(MPTTModel): parent_part.clean() parent_part.save() - name = models.CharField(max_length=100, blank=False, - help_text=_('Part name'), - validators=[validators.validate_part_name] - ) + name = models.CharField( + max_length=100, blank=False, + help_text=_('Part name'), + verbose_name=_('Name'), + validators=[validators.validate_part_name] + ) - is_template = models.BooleanField(default=False, help_text=_('Is this part a template part?')) + is_template = models.BooleanField( + default=part_settings.part_template_default, + verbose_name=_('Is Template'), + help_text=_('Is this part a template part?') + ) - variant_of = models.ForeignKey('part.Part', related_name='variants', - null=True, blank=True, - limit_choices_to={ - 'is_template': True, - 'active': True, - }, - on_delete=models.SET_NULL, - help_text=_('Is this part a variant of another part?')) + variant_of = models.ForeignKey( + 'part.Part', related_name='variants', + null=True, blank=True, + limit_choices_to={ + 'is_template': True, + 'active': True, + }, + on_delete=models.SET_NULL, + help_text=_('Is this part a variant of another part?'), + verbose_name=_('Variant Of'), + ) - description = models.CharField(max_length=250, blank=False, help_text=_('Part description')) + description = models.CharField( + max_length=250, blank=False, + verbose_name=_('Description'), + help_text=_('Part description') + ) - keywords = models.CharField(max_length=250, blank=True, null=True, help_text=_('Part keywords to improve visibility in search results')) + keywords = models.CharField( + max_length=250, blank=True, null=True, + verbose_name=_('Keywords'), + help_text=_('Part keywords to improve visibility in search results') + ) - category = TreeForeignKey(PartCategory, related_name='parts', - null=True, blank=True, - on_delete=models.DO_NOTHING, - help_text=_('Part category')) + category = TreeForeignKey( + PartCategory, related_name='parts', + null=True, blank=True, + on_delete=models.DO_NOTHING, + verbose_name=_('Category'), + help_text=_('Part category') + ) - IPN = models.CharField(max_length=100, blank=True, null=True, help_text=_('Internal Part Number'), validators=[validators.validate_part_ipn]) + IPN = models.CharField( + max_length=100, blank=True, null=True, + verbose_name=_('IPN'), + help_text=_('Internal Part Number'), + validators=[validators.validate_part_ipn] + ) - revision = models.CharField(max_length=100, blank=True, null=True, help_text=_('Part revision or version number')) + revision = models.CharField( + max_length=100, blank=True, null=True, + help_text=_('Part revision or version number'), + verbose_name=_('Revision'), + ) - link = InvenTreeURLField(blank=True, null=True, help_text=_('Link to external URL')) + link = InvenTreeURLField( + blank=True, null=True, + verbose_name=_('Link'), + help_text=_('Link to external URL') + ) image = StdImageField( upload_to=rename_part_image, @@ -679,10 +712,13 @@ class Part(MPTTModel): delete_orphans=True, ) - default_location = TreeForeignKey('stock.StockLocation', on_delete=models.SET_NULL, - blank=True, null=True, - help_text=_('Where is this item normally stored?'), - related_name='default_parts') + default_location = TreeForeignKey('stock.StockLocation', + on_delete=models.SET_NULL, + blank=True, null=True, + help_text=_('Where is this item normally stored?'), + related_name='default_parts', + verbose_name=_('Default Location'), + ) def get_default_location(self): """ Get the default location for a Part (may be None). @@ -733,7 +769,7 @@ class Part(MPTTModel): units = models.CharField(max_length=20, default="", blank=True, null=True, help_text=_('Stock keeping units for this part')) assembly = models.BooleanField( - default=False, + default=part_settings.part_assembly_default, verbose_name=_('Assembly'), help_text=_('Can this part be built from other parts?') ) diff --git a/InvenTree/part/settings.py b/InvenTree/part/settings.py index 8d87cdffe3..1705f96a80 100644 --- a/InvenTree/part/settings.py +++ b/InvenTree/part/settings.py @@ -8,6 +8,22 @@ from __future__ import unicode_literals from common.models import InvenTreeSetting +def part_assembly_default(): + """ + Returns the default value for the 'assembly' field of a Part object + """ + + return InvenTreeSetting.get_setting('PART_ASSEMBLY') + + +def part_template_default(): + """ + Returns the default value for the 'is_template' field of a Part object + """ + + return InvenTreeSetting.get_setting('PART_TEMPLATE') + + def part_component_default(): """ Returns the default value for the 'component' field of a Part object diff --git a/InvenTree/part/test_part.py b/InvenTree/part/test_part.py index c02be211b5..4c08911122 100644 --- a/InvenTree/part/test_part.py +++ b/InvenTree/part/test_part.py @@ -235,6 +235,8 @@ class PartSettingsTest(TestCase): InvenTreeSetting.set_setting('PART_PURCHASEABLE', val, self.user) InvenTreeSetting.set_setting('PART_SALABLE', val, self.user) InvenTreeSetting.set_setting('PART_TRACKABLE', val, self.user) + InvenTreeSetting.set_setting('PART_ASSEMBLY', val, self.user) + InvenTreeSetting.set_setting('PART_TEMPLATE', val, self.user) self.assertEqual(val, InvenTreeSetting.get_setting('PART_COMPONENT')) self.assertEqual(val, InvenTreeSetting.get_setting('PART_PURCHASEABLE')) @@ -247,6 +249,8 @@ class PartSettingsTest(TestCase): self.assertEqual(part.purchaseable, val) self.assertEqual(part.salable, val) self.assertEqual(part.trackable, val) + self.assertEqual(part.assembly, val) + self.assertEqual(part.is_template, val) Part.objects.filter(pk=part.pk).delete() From 0aeeba808c84062f5cffcd25524e9b1d36293177 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 3 Jan 2021 23:07:21 +1100 Subject: [PATCH 3/5] PEP fixes --- InvenTree/part/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index bcb9c99749..900e0e5a98 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -712,7 +712,8 @@ class Part(MPTTModel): delete_orphans=True, ) - default_location = TreeForeignKey('stock.StockLocation', + default_location = TreeForeignKey( + 'stock.StockLocation', on_delete=models.SET_NULL, blank=True, null=True, help_text=_('Where is this item normally stored?'), From b05504e1c40683b8e310eaf2887d589ba7039f0d Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 3 Jan 2021 23:13:58 +1100 Subject: [PATCH 4/5] Add PART_VIRTUAL setting --- InvenTree/common/models.py | 7 +++++++ InvenTree/part/forms.py | 1 + ..._20210103_2306.py => 0061_auto_20210103_2313.py} | 13 ++++++++++++- InvenTree/part/models.py | 8 ++++++-- InvenTree/part/settings.py | 8 ++++++++ InvenTree/templates/InvenTree/settings/part.html | 1 + 6 files changed, 35 insertions(+), 3 deletions(-) rename InvenTree/part/migrations/{0061_auto_20210103_2306.py => 0061_auto_20210103_2313.py} (85%) diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 924c55b54d..b3ac4e0381 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -153,6 +153,13 @@ class InvenTreeSetting(models.Model): 'validator': bool, }, + 'PART_VIRTUAL': { + 'name': _('Virtual'), + 'description': _('Parts are virtual by default'), + 'default': False, + 'validator': bool, + }, + 'BUILDORDER_REFERENCE_PREFIX': { 'name': _('Build Order Reference Prefix'), 'description': _('Prefix value for build order reference'), diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py index 458667f3fe..072e1da8c3 100644 --- a/InvenTree/part/forms.py +++ b/InvenTree/part/forms.py @@ -236,6 +236,7 @@ class EditPartForm(HelperForm): 'trackable', 'purchaseable', 'salable', + 'virtual', ] diff --git a/InvenTree/part/migrations/0061_auto_20210103_2306.py b/InvenTree/part/migrations/0061_auto_20210103_2313.py similarity index 85% rename from InvenTree/part/migrations/0061_auto_20210103_2306.py rename to InvenTree/part/migrations/0061_auto_20210103_2313.py index fa1f8c04c6..ca0c2a277f 100644 --- a/InvenTree/part/migrations/0061_auto_20210103_2306.py +++ b/InvenTree/part/migrations/0061_auto_20210103_2313.py @@ -1,9 +1,10 @@ -# Generated by Django 3.0.7 on 2021-01-03 12:06 +# Generated by Django 3.0.7 on 2021-01-03 12:13 import InvenTree.fields import InvenTree.validators from django.db import migrations, models import django.db.models.deletion +import markdownx.models import mptt.fields import part.settings @@ -61,6 +62,11 @@ class Migration(migrations.Migration): name='name', field=models.CharField(help_text='Part name', max_length=100, validators=[InvenTree.validators.validate_part_name], verbose_name='Name'), ), + migrations.AlterField( + model_name='part', + name='notes', + field=markdownx.models.MarkdownxField(blank=True, help_text='Part notes - supports Markdown formatting', null=True, verbose_name='Notes'), + ), migrations.AlterField( model_name='part', name='revision', @@ -71,4 +77,9 @@ class Migration(migrations.Migration): name='variant_of', field=models.ForeignKey(blank=True, help_text='Is this part a variant of another part?', limit_choices_to={'active': True, 'is_template': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='variants', to='part.Part', verbose_name='Variant Of'), ), + migrations.AlterField( + model_name='part', + name='virtual', + field=models.BooleanField(default=part.settings.part_virtual_default, help_text='Is this a virtual part, such as a software product or license?', verbose_name='Virtual'), + ), ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 900e0e5a98..fdd80e71b6 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -802,11 +802,15 @@ class Part(MPTTModel): help_text=_('Is this part active?')) virtual = models.BooleanField( - default=False, + default=part_settings.part_virtual_default, verbose_name=_('Virtual'), help_text=_('Is this a virtual part, such as a software product or license?')) - notes = MarkdownxField(blank=True, null=True, help_text=_('Part notes - supports Markdown formatting')) + notes = MarkdownxField( + blank=True, null=True, + verbose_name=_('Notes'), + help_text=_('Part notes - supports Markdown formatting') + ) bom_checksum = models.CharField(max_length=128, blank=True, help_text=_('Stored BOM checksum')) diff --git a/InvenTree/part/settings.py b/InvenTree/part/settings.py index 1705f96a80..801b4dd2ec 100644 --- a/InvenTree/part/settings.py +++ b/InvenTree/part/settings.py @@ -24,6 +24,14 @@ def part_template_default(): return InvenTreeSetting.get_setting('PART_TEMPLATE') +def part_virtual_default(): + """ + Returns the default value for the 'is_virtual' field of Part object + """ + + return InvenTreeSetting.get_setting('PART_VIRTUAL') + + def part_component_default(): """ Returns the default value for the 'component' field of a Part object diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html index 415449a559..fe46911dae 100644 --- a/InvenTree/templates/InvenTree/settings/part.html +++ b/InvenTree/templates/InvenTree/settings/part.html @@ -25,6 +25,7 @@ {% include "InvenTree/settings/setting.html" with key="PART_TRACKABLE" icon="fa-directions" %} {% include "InvenTree/settings/setting.html" with key="PART_PURCHASEABLE" icon="fa-shopping-cart" %} {% include "InvenTree/settings/setting.html" with key="PART_SALABLE" icon="fa-dollar-sign" %} + {% include "InvenTree/settings/setting.html" with key="PART_VIRTUAL" icon="fa-ghost" %} {% include "InvenTree/settings/setting.html" with key="PART_COPY_BOM" %} {% include "InvenTree/settings/setting.html" with key="PART_COPY_PARAMETERS" %} From 0f9c4703cf07828b01513bbf892f86750ddda5e6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sun, 3 Jan 2021 23:33:47 +1100 Subject: [PATCH 5/5] Update unit testing --- InvenTree/common/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InvenTree/common/tests.py b/InvenTree/common/tests.py index 6d6e517ef5..d8777785f9 100644 --- a/InvenTree/common/tests.py +++ b/InvenTree/common/tests.py @@ -31,7 +31,7 @@ class SettingsTest(TestCase): # There should be two settings objects in the database settings = InvenTreeSetting.objects.all() - self.assertEqual(settings.count(), 2) + self.assertTrue(settings.count() >= 2) instance_name = InvenTreeSetting.objects.get(pk=1) self.assertEqual(instance_name.key, 'INVENTREE_INSTANCE')