diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5185cbac91..510be71848 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,7 +17,7 @@ repos: - id: check-yaml - id: mixed-line-ending - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.7.3 + rev: v0.7.4 hooks: - id: ruff-format args: [--preview] @@ -28,7 +28,7 @@ repos: --preview ] - repo: https://github.com/astral-sh/uv-pre-commit - rev: 0.5.1 + rev: 0.5.3 hooks: - id: pip-compile name: pip-compile requirements-dev.in diff --git a/src/backend/InvenTree/InvenTree/models.py b/src/backend/InvenTree/InvenTree/models.py index 8b465222b2..ab289e067d 100644 --- a/src/backend/InvenTree/InvenTree/models.py +++ b/src/backend/InvenTree/InvenTree/models.py @@ -289,6 +289,7 @@ class ReferenceIndexingMixin(models.Model): # Name of the global setting which defines the required reference pattern for this model REFERENCE_PATTERN_SETTING = None + REFERENCE_PATTERN_WILDCARD_DEFAULT_SETTING = None class Meta: """Metaclass options. Abstract ensures no database table is created.""" @@ -309,6 +310,28 @@ class ReferenceIndexingMixin(models.Model): cls.REFERENCE_PATTERN_SETTING, create=False ).strip() + @classmethod + def get_reference_pattern_wildcard_default(cls): + """Returns the reference pattern associated with this model. + + This is defined by a global setting object, specified by the REFERENCE_PATTERN_WILDCARD_DEFAULT_SETTING attribute + """ + # By default, we return None to indicate no default exists + if cls.REFERENCE_PATTERN_WILDCARD_DEFAULT_SETTING is None: + return None + + # import at function level to prevent cyclic imports + from common.models import InvenTreeSetting + + setting = InvenTreeSetting.get_setting( + cls.REFERENCE_PATTERN_WILDCARD_DEFAULT_SETTING, create=False + ).strip() + + if setting == '': + return None + else: + return setting + @classmethod def get_reference_context(cls): """Generate context data for generating the 'reference' field for this class. @@ -365,6 +388,7 @@ class ReferenceIndexingMixin(models.Model): """Generate the next 'reference' field based on specified pattern.""" fmt = cls.get_reference_pattern() ctx = cls.get_reference_context() + wildcard_default = cls.get_reference_pattern_wildcard_default() reference = None @@ -394,6 +418,9 @@ class ReferenceIndexingMixin(models.Model): recent = cls.get_most_recent_item() reference = recent.reference if recent else '' + if wildcard_default is not None: + reference = reference.replace('?', wildcard_default) + return reference @classmethod diff --git a/src/backend/InvenTree/common/models.py b/src/backend/InvenTree/common/models.py index fb57bfa67d..7ee33fde46 100644 --- a/src/backend/InvenTree/common/models.py +++ b/src/backend/InvenTree/common/models.py @@ -1981,6 +1981,15 @@ class InvenTreeSetting(BaseInvenTreeSetting): 'default': 'PO-{ref:04d}', 'validator': order.validators.validate_purchase_order_reference_pattern, }, + 'PURCHASEORDER_REFERENCE_PATTERN_WILDCARD_DEFAULT': { + 'name': _('Purchase Order Reference Pattern Wildcard Default'), + 'description': _( + 'Replace all wildcard ? characters in reference pattern with a default value' + ), + 'default': None, + # TODO: add validator + 'validator': lambda x: x, + }, 'PURCHASEORDER_REQUIRE_RESPONSIBLE': { 'name': _('Require Responsible Owner'), 'description': _('A responsible owner must be assigned to each order'), diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index 8578974711..e27613588f 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -378,6 +378,9 @@ class PurchaseOrder(TotalPriceMixin, Order): """ REFERENCE_PATTERN_SETTING = 'PURCHASEORDER_REFERENCE_PATTERN' + REFERENCE_PATTERN_WILDCARD_DEFAULT_SETTING = ( + 'PURCHASEORDER_REFERENCE_PATTERN_WILDCARD_DEFAULT' + ) REQUIRE_RESPONSIBLE_SETTING = 'PURCHASEORDER_REQUIRE_RESPONSIBLE' class Meta: diff --git a/src/backend/InvenTree/templates/InvenTree/settings/po.html b/src/backend/InvenTree/templates/InvenTree/settings/po.html index 6759d14bf9..ea12dcd3bf 100644 --- a/src/backend/InvenTree/templates/InvenTree/settings/po.html +++ b/src/backend/InvenTree/templates/InvenTree/settings/po.html @@ -11,6 +11,7 @@