From 508dd5425d2c374d14d6286e16347e8fb61f4638 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 5 Apr 2023 00:00:24 +1000 Subject: [PATCH] Build order barcodes (#4581) * Adds barcode support for BuildOrder model * Add barcode_hash to serializer * Add assign functionality for build * Add UI elements --- InvenTree/InvenTree/api_version.py | 1 + .../migrations/0040_auto_20230404_1310.py | 23 +++++++++ InvenTree/build/models.py | 4 +- InvenTree/build/serializers.py | 3 ++ .../build/templates/build/build_base.html | 48 +++++++++++++++++++ .../builtin/barcodes/inventree_barcode.py | 2 + 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 InvenTree/build/migrations/0040_auto_20230404_1310.py diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py index 21cff45c72..33222ebe75 100644 --- a/InvenTree/InvenTree/api_version.py +++ b/InvenTree/InvenTree/api_version.py @@ -11,6 +11,7 @@ v107 -> 2023-04-04 : https://github.com/inventree/InvenTree/pull/4575 - Adds barcode support for PurchaseOrder model - Adds barcode support for ReturnOrder model - Adds barcode support for SalesOrder model + - Adds barcode support for BuildOrder model v106 -> 2023-04-03 : https://github.com/inventree/InvenTree/pull/4566 - Adds 'search_regex' parameter to all searchable API endpoints diff --git a/InvenTree/build/migrations/0040_auto_20230404_1310.py b/InvenTree/build/migrations/0040_auto_20230404_1310.py new file mode 100644 index 0000000000..fcb29e7e3a --- /dev/null +++ b/InvenTree/build/migrations/0040_auto_20230404_1310.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.18 on 2023-04-04 13:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('build', '0039_auto_20230317_0816'), + ] + + operations = [ + migrations.AddField( + model_name='build', + name='barcode_data', + field=models.CharField(blank=True, help_text='Third party barcode data', max_length=500, verbose_name='Barcode Data'), + ), + migrations.AddField( + model_name='build', + name='barcode_hash', + field=models.CharField(blank=True, help_text='Unique hash of barcode data', max_length=128, verbose_name='Barcode Hash'), + ), + ] diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index a56b69978d..7ac1c0f6e0 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -23,7 +23,7 @@ from rest_framework import serializers from InvenTree.status_codes import BuildStatus, StockStatus, StockHistoryCode from InvenTree.helpers import increment, normalize, notify_responsible -from InvenTree.models import InvenTreeAttachment, ReferenceIndexingMixin +from InvenTree.models import InvenTreeAttachment, InvenTreeBarcodeMixin, ReferenceIndexingMixin from build.validators import generate_next_build_reference, validate_build_order_reference @@ -42,7 +42,7 @@ import stock.models import users.models -class Build(MPTTModel, MetadataMixin, ReferenceIndexingMixin): +class Build(MPTTModel, InvenTreeBarcodeMixin, MetadataMixin, ReferenceIndexingMixin): """A Build object organises the creation of new StockItem objects from other existing StockItem objects. Attributes: diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index 5bacad8845..3ac30928bd 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -37,6 +37,7 @@ class BuildSerializer(InvenTreeModelSerializer): 'pk', 'url', 'title', + 'barcode_hash', 'batch', 'creation_date', 'completed', @@ -84,6 +85,8 @@ class BuildSerializer(InvenTreeModelSerializer): responsible_detail = OwnerSerializer(source='responsible', read_only=True) + barcode_hash = serializers.CharField(read_only=True) + @staticmethod def annotate_queryset(queryset): """Add custom annotations to the BuildSerializer queryset, performing database queries as efficiently as possible. diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html index e02112c6bf..f0aff38766 100644 --- a/InvenTree/build/templates/build/build_base.html +++ b/InvenTree/build/templates/build/build_base.html @@ -33,6 +33,24 @@ src="{% static 'img/blank_image.png' %}" {% url 'admin:build_build_change' build.pk as url %} {% include "admin_button.html" with url=url %} {% endif %} +{% if barcodes %} + +
+ + +
+{% endif %} {% if report_enabled %}
@@ -90,6 +108,7 @@ src="{% static 'img/blank_image.png' %}" {% trans "Build Description" %} {{ build.title }} + {% include "barcode_data.html" with instance=build %}
@@ -264,4 +283,33 @@ src="{% static 'img/blank_image.png' %}" ); }); + {% if barcodes %} + + $('#show-qr-code').click(function() { + showQRDialog( + '{% trans "Build Order QR Code" %}', + '{"build": {{ build.pk }}}' + ); + }); + + {% if roles.purchase_order.change %} + $("#barcode-link").click(function() { + linkBarcodeDialog( + { + build: {{ build.pk }}, + }, + { + title: '{% trans "Link Barcode to Build Order" %}', + } + ); + }); + + $("#barcode-unlink").click(function() { + unlinkBarcode({ + build: {{ build.pk }}, + }); + }); + {% endif %} + {% endif %} + {% endblock %} diff --git a/InvenTree/plugin/builtin/barcodes/inventree_barcode.py b/InvenTree/plugin/builtin/barcodes/inventree_barcode.py index fd92101ace..330c2e8fca 100644 --- a/InvenTree/plugin/builtin/barcodes/inventree_barcode.py +++ b/InvenTree/plugin/builtin/barcodes/inventree_barcode.py @@ -11,6 +11,7 @@ import json from django.utils.translation import gettext_lazy as _ +import build.models import company.models import order.models import part.models @@ -34,6 +35,7 @@ class InvenTreeInternalBarcodePlugin(BarcodeMixin, InvenTreePlugin): """Returns a list of database models which support barcode functionality""" return [ + build.models.Build, company.models.SupplierPart, order.models.PurchaseOrder, order.models.ReturnOrder,