diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py index 88ffd0c4a4..816f71f77e 100644 --- a/InvenTree/InvenTree/api_version.py +++ b/InvenTree/InvenTree/api_version.py @@ -2,11 +2,14 @@ # InvenTree API version -INVENTREE_API_VERSION = 121 +INVENTREE_API_VERSION = 122 """ Increment this API version number whenever there is a significant change to the API that any clients need to know about +v122 -> 2023-06-14 : https://github.com/inventree/InvenTree/pull/5034 + - Adds new BuildLineLabel label type + v121 -> 2023-06-14 : https://github.com/inventree/InvenTree/pull/4808 - Adds "ProjectCode" link to Build model @@ -14,9 +17,6 @@ v120 -> 2023-06-07 : https://github.com/inventree/InvenTree/pull/4855 - Major overhaul of the build order API - Adds new BuildLine model -v120 -> 2023-06-12 : https://github.com/inventree/InvenTree/pull/4804 - - Adds 'project_code' field to build order API endpoints - v119 -> 2023-06-01 : https://github.com/inventree/InvenTree/pull/4898 - Add Metadata to: Part test templates, Part parameters, Part category parameter templates, BOM item substitute, Related Parts, Stock item test result diff --git a/InvenTree/label/admin.py b/InvenTree/label/admin.py index f2b981ff12..ec4cb3f7dd 100644 --- a/InvenTree/label/admin.py +++ b/InvenTree/label/admin.py @@ -13,3 +13,4 @@ class LabelAdmin(admin.ModelAdmin): admin.site.register(label.models.StockItemLabel, LabelAdmin) admin.site.register(label.models.StockLocationLabel, LabelAdmin) admin.site.register(label.models.PartLabel, LabelAdmin) +admin.site.register(label.models.BuildLineLabel, LabelAdmin) diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py index 28bdb6b5a3..724c00e4d5 100644 --- a/InvenTree/label/api.py +++ b/InvenTree/label/api.py @@ -10,6 +10,7 @@ from django.views.decorators.cache import cache_page, never_cache from django_filters.rest_framework import DjangoFilterBackend from rest_framework.exceptions import NotFound +import build.models import common.models import InvenTree.helpers import label.models @@ -368,6 +369,31 @@ class PartLabelPrint(PartLabelMixin, LabelPrintMixin, RetrieveAPI): pass +class BuildLineLabelMixin: + """Mixin class for BuildLineLabel endpoints""" + + queryset = label.models.BuildLineLabel.objects.all() + serializer_class = label.serializers.BuildLineLabelSerializer + + ITEM_MODEL = build.models.BuildLine + ITEM_KEY = 'line' + + +class BuildLineLabelList(BuildLineLabelMixin, LabelListView): + """API endpoint for viewing a list of BuildLineLabel objects""" + pass + + +class BuildLineLabelDetail(BuildLineLabelMixin, RetrieveUpdateDestroyAPI): + """API endpoint for a single BuildLineLabel object""" + pass + + +class BuildLineLabelPrint(BuildLineLabelMixin, LabelPrintMixin, RetrieveAPI): + """API endpoint for printing a BuildLineLabel object""" + pass + + label_api_urls = [ # Stock item labels @@ -408,4 +434,17 @@ label_api_urls = [ # List view re_path(r'^.*$', PartLabelList.as_view(), name='api-part-label-list'), ])), + + # BuildLine labels + re_path(r'^buildline/', include([ + # Detail views + path(r'/', include([ + re_path(r'^print/', BuildLineLabelPrint.as_view(), name='api-buildline-label-print'), + re_path(r'^metadata/', MetadataView.as_view(), {'model': label.models.BuildLineLabel}, name='api-buildline-label-metadata'), + re_path(r'^.*$', BuildLineLabelDetail.as_view(), name='api-buildline-label-detail'), + ])), + + # List view + re_path(r'^.*$', BuildLineLabelList.as_view(), name='api-buildline-label-list'), + ])), ] diff --git a/InvenTree/label/apps.py b/InvenTree/label/apps.py index 51243e238b..34dd190ad9 100644 --- a/InvenTree/label/apps.py +++ b/InvenTree/label/apps.py @@ -46,12 +46,12 @@ class LabelConfig(AppConfig): def create_labels(self): """Create all default templates.""" # Test if models are ready - from .models import PartLabel, StockItemLabel, StockLocationLabel - assert bool(StockLocationLabel is not None) + import label.models + assert bool(label.models.StockLocationLabel is not None) # Create the categories self.create_labels_category( - StockItemLabel, + label.models.StockItemLabel, 'stockitem', [ { @@ -65,7 +65,7 @@ class LabelConfig(AppConfig): ) self.create_labels_category( - StockLocationLabel, + label.models.StockLocationLabel, 'stocklocation', [ { @@ -86,7 +86,7 @@ class LabelConfig(AppConfig): ) self.create_labels_category( - PartLabel, + label.models.PartLabel, 'part', [ { @@ -106,6 +106,20 @@ class LabelConfig(AppConfig): ] ) + self.create_labels_category( + label.models.BuildLineLabel, + 'buildline', + [ + { + 'file': 'buildline_label.html', + 'name': 'Build Line Label', + 'description': 'Example build line label', + 'width': 125, + 'height': 48, + }, + ] + ) + def create_labels_category(self, model, ref_name, labels): """Create folder and database entries for the default templates, if they do not already exist.""" # Create root dir for templates diff --git a/InvenTree/label/migrations/0010_buildlinelabel.py b/InvenTree/label/migrations/0010_buildlinelabel.py new file mode 100644 index 0000000000..329c274367 --- /dev/null +++ b/InvenTree/label/migrations/0010_buildlinelabel.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.19 on 2023-06-13 11:10 + +import django.core.validators +from django.db import migrations, models +import label.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('label', '0009_auto_20230317_0816'), + ] + + operations = [ + migrations.CreateModel( + name='BuildLineLabel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('metadata', models.JSONField(blank=True, help_text='JSON metadata field, for use by external plugins', null=True, verbose_name='Plugin Metadata')), + ('name', models.CharField(help_text='Label name', max_length=100, verbose_name='Name')), + ('description', models.CharField(blank=True, help_text='Label description', max_length=250, null=True, verbose_name='Description')), + ('label', models.FileField(help_text='Label template file', unique=True, upload_to=label.models.rename_label, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['html'])], verbose_name='Label')), + ('enabled', models.BooleanField(default=True, help_text='Label template is enabled', verbose_name='Enabled')), + ('width', models.FloatField(default=50, help_text='Label width, specified in mm', validators=[django.core.validators.MinValueValidator(2)], verbose_name='Width [mm]')), + ('height', models.FloatField(default=20, help_text='Label height, specified in mm', validators=[django.core.validators.MinValueValidator(2)], verbose_name='Height [mm]')), + ('filename_pattern', models.CharField(default='label.pdf', help_text='Pattern for generating label filenames', max_length=100, verbose_name='Filename Pattern')), + ('filters', models.CharField(blank=True, help_text='Query filters (comma-separated list of key=value pairs)', max_length=250, validators=[label.models.validate_build_line_filters], verbose_name='Filters')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/InvenTree/label/models.py b/InvenTree/label/models.py index 8bbd1b19a0..91b503a055 100644 --- a/InvenTree/label/models.py +++ b/InvenTree/label/models.py @@ -13,6 +13,7 @@ from django.template.loader import render_to_string from django.urls import reverse from django.utils.translation import gettext_lazy as _ +import build.models import part.models import stock.models from InvenTree.helpers import normalize, validateFilterString @@ -59,6 +60,13 @@ def validate_part_filters(filters): return filters +def validate_build_line_filters(filters): + """Validate query filters for the BuildLine model""" + filters = validateFilterString(filters, model=build.models.BuildLine) + + return filters + + class WeasyprintLabelMixin(WeasyTemplateResponseMixin): """Class for rendering a label to a PDF.""" @@ -330,3 +338,38 @@ class PartLabel(LabelTemplate): 'qr_url': request.build_absolute_uri(part.get_absolute_url()), 'parameters': part.parameters_map(), } + + +class BuildLineLabel(LabelTemplate): + """Template for printing labels against BuildLine objects""" + + @staticmethod + def get_api_url(): + """Return the API URL associated with the BuildLineLabel model""" + return reverse('api-buildline-label-list') + + SUBDIR = 'buildline' + + filters = models.CharField( + blank=True, max_length=250, + help_text=_('Query filters (comma-separated list of key=value pairs)'), + verbose_name=_('Filters'), + validators=[ + validate_build_line_filters + ] + ) + + def get_context_data(self, request): + """Generate context data for each provided BuildLine object.""" + + build_line = self.object_to_print + + return { + 'build_line': build_line, + 'build': build_line.build, + 'bom_item': build_line.bom_item, + 'part': build_line.bom_item.sub_part, + 'quantity': build_line.quantity, + 'allocated_quantity': build_line.allocated_quantity, + 'allocations': build_line.allocations, + } diff --git a/InvenTree/label/serializers.py b/InvenTree/label/serializers.py index 21a8185b3a..576d4af8fa 100644 --- a/InvenTree/label/serializers.py +++ b/InvenTree/label/serializers.py @@ -52,3 +52,13 @@ class PartLabelSerializer(LabelSerializerBase): model = label.models.PartLabel fields = LabelSerializerBase.label_fields() + + +class BuildLineLabelSerializer(LabelSerializerBase): + """Serializes a BuildLineLabel object""" + + class Meta: + """Metaclass options.""" + + model = label.models.BuildLineLabel + fields = LabelSerializerBase.label_fields() diff --git a/InvenTree/label/templates/label/buildline/buildline_label.html b/InvenTree/label/templates/label/buildline/buildline_label.html new file mode 100644 index 0000000000..efbb9a3db6 --- /dev/null +++ b/InvenTree/label/templates/label/buildline/buildline_label.html @@ -0,0 +1,3 @@ +{% extends "label/buildline/buildline_label_base.html" %} + + diff --git a/InvenTree/label/templates/label/buildline/buildline_label_base.html b/InvenTree/label/templates/label/buildline/buildline_label_base.html new file mode 100644 index 0000000000..bec22c5cbb --- /dev/null +++ b/InvenTree/label/templates/label/buildline/buildline_label_base.html @@ -0,0 +1,74 @@ +{% extends "label/label_base.html" %} +{% load barcode report %} +{% load inventree_extras %} + + + +{% block style %} + +{{ block.super }} + +.label { + margin: 1mm; +} + +.qr { + height: 28mm; + width: 28mm; + position: relative; + top: 0mm; + right: 0mm; + float: right; +} + +.label-table { + width: 100%; + border-collapse: collapse; + border: 1pt solid black; +} + +.label-table tr { + width: 100%; + border-bottom: 1pt solid black; + padding: 2.5mm; +} + +.label-table td { + padding: 3mm; +} + +{% endblock style %} + +{% block content %} + +
+ + + + + + + + + +
+ Build Order: {{ build.reference }}
+ Build Qty: {% decimal build.quantity %}
+
+ build qr +
+ Part: {{ part.name }}
+ {% if part.IPN %} + IPN: {{ part.IPN }}
+ {% endif %} + Qty / Unit: {% decimal bom_item.quantity %} {% if part.units %}[{{ part.units }}]{% endif %}
+ Qty Total: {% decimal quantity %} {% if part.units %}[{{ part.units }}]{% endif %} +
+ part qr +
+
+ +{% endblock content %} diff --git a/InvenTree/templates/js/translated/build.js b/InvenTree/templates/js/translated/build.js index 3d70cb9347..f99603aeba 100644 --- a/InvenTree/templates/js/translated/build.js +++ b/InvenTree/templates/js/translated/build.js @@ -2349,8 +2349,17 @@ function loadBuildLineTable(table, build_id, options={}) { let filters = loadTableFilters('buildlines', params); let filterTarget = options.filterTarget || '#filter-list-buildlines'; - setupFilterList('buildlines', $(table), filterTarget); - // If data is passed directly to this function, do not request data from the server + // If data is passed directly to this function, do not setup filters + if (!options.data) { + setupFilterList('buildlines', $(table), filterTarget, { + labels: { + url: '{% url "api-buildline-label-list" %}', + key: 'line', + }, + singular_name: '{% trans "build line" %}', + plural_name: '{% trans "build lines" %}', + }); + } let table_options = { name: name, diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index 7a9120770f..1cfca8a596 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -136,6 +136,7 @@ class RuleSet(models.Model): 'stock_stockitem', 'stock_stocklocation', 'report_buildreport', + 'label_buildlinelabel', ], 'purchase_order': [ 'company_company', diff --git a/docs/docs/assets/images/report/label_build_example.png b/docs/docs/assets/images/report/label_build_example.png new file mode 100644 index 0000000000..e0e817f089 Binary files /dev/null and b/docs/docs/assets/images/report/label_build_example.png differ diff --git a/docs/docs/assets/images/report/label_build_print.png b/docs/docs/assets/images/report/label_build_print.png new file mode 100644 index 0000000000..ec8985e02d Binary files /dev/null and b/docs/docs/assets/images/report/label_build_print.png differ diff --git a/docs/docs/report/labels.md b/docs/docs/report/labels.md index c58f082968..5518210559 100644 --- a/docs/docs/report/labels.md +++ b/docs/docs/report/labels.md @@ -11,6 +11,17 @@ Custom labels can be generated using simple HTML templates, with support for QR- Simple (generic) label templates are supplied 'out of the box' with InvenTree - however support is provided for generation of extremely specific custom labels, to meet any particular requirement. +## Label Types + +The following types of labels are available + +| Label Type | Description | +| --- | --- | +| [Part Labels](./labels/part_labels.md) | Print labels for individual parts | +| [Stock Labels](./labels/stock_labels.md) | Print labels for individual stock items | +| [Location Labels](./labels/location_labels.md) | Print labels for individual stock locations +| [Build Labels](./labels/build_labels.md) | Print labels for individual build order line items | + ## Label Templates Label templates are written using a mixture of [HTML](https://www.w3schools.com/html/) and [CSS](https://www.w3schools.com/css). [Weasyprint](https://weasyprint.org/) templates support a *subset* of HTML and CSS features. In addition to supporting HTML and CSS formatting, the label templates support the Django templating engine, allowing conditional formatting of the label data. @@ -189,133 +200,3 @@ To extend this template in a custom uploaded label, simply extend as follows: {% endraw %} ``` - -## Stock Item Labels - -Stock Item label templates are used to generate labels for individual Stock Items. - -### Creating Stock Item Label Templates - -Stock Item label templates are added (and edited) via the admin interface. - -### Printing Stock Item Labels - -Stock Item labels can be printed using the following approaches: - -To print a single stock item from the Stock Item detail view, select the *Print Label* option as shown below: - -{% with id='item_label_single', url='report/label_stock_print_single.png', description='Print single stock item label' %} -{% include 'img.html' %} -{% endwith %} - -To print multiple stock items from the Stock table view, select the *Print Labels* option as shown below: - -{% with id='item_label_multiple', url='report/label_stock_print_multiple.png', description='Print multiple stock item labels' %} -{% include 'img.html' %} -{% endwith %} - -### Context Data - -The following variables are made available to the StockItem label template: - -| Variable | Description | -| -------- | ----------- | -| item | The [StockItem](./context_variables.md#stockitem) object itself | -| part | The [Part](./context_variables.md#part) object which is referenced by the [StockItem](./context_variables.md#stockitem) object | -| name | The `name` field of the associated Part object | -| ipn | The `IPN` field of the associated Part object | -| revision | The `revision` field of the associated Part object | -| quantity | The `quantity` field of the StockItem object | -| serial | The `serial` field of the StockItem object | -| uid | The `uid` field of the StockItem object | -| tests | Dict object of TestResult data associated with the StockItem | -| parameters | Dict object containing the parameters associated with the base Part | - -### URL-style QR code - -Stock Item labels support [QR code](./barcodes.md#qr-code) containing the stock item URL, which can be -scanned and opened directly -on a portable device using the camera or a QR code scanner. To generate a URL-style QR code for stock item in the [label HTML template](./labels.md#label-templates), add the -following HTML tag: - -``` html -{% raw %} - -{% endraw %} -``` - -Make sure to customize the `custom_qr_class` CSS class to define the position of the QR code -on the label. - -## Stock Location Labels - -Stock Location label templates are used to generate labels for individual Stock Locations. - -### Creating Stock Location Label Templates - -Stock Location label templates are added (and edited) via the admin interface. - -### Printing Stock Location Labels - -To print a single label from the Stock Location detail view, select the *Print Label* option. - -### Context Data - -The following variables are made available to the StockLocation label template: - -| Variable | Description | -| -------- | ----------- | -| location | The [StockLocation](./context_variables.md#stocklocation) object itself | - -## Part Labels - -Part label templates are used to generate labels for individual Part instances. - -### Creating Part Label Templates - -Part label templates are added (and edited) via the admin interface. - -### Printing Part Labels - -Part label can be printed using the following approaches: - -To print a single part label from the Part detail view, select the *Print Label* option. - -To print multiple part labels, select multiple parts in the part table and select the *Print Labels* option. - -### Context Data - -The following context variables are made available to the Part label template: - -| Variable | Description | -| -------- | ----------- | -| part | The [Part](./context_variables.md#part) object | -| category | The [Part Category](./context_variables.md#part-category) which contains the Part | -| name | The name of the part | -| description | The description text for the part | -| IPN | Internal part number (IPN) for the part | -| revision | Part revision code | -| qr_data | String data which can be rendered to a QR code | -| parameters | Map (Python dictionary) object containing the parameters associated with the part instance | - -#### Parameters - -The part parameters can be accessed by parameter name lookup in the template, as follows: - -```html -{% raw %} - -Part: {{ part.name }} -Length: {{ parameters.length }} - -{% endraw %} -``` - -Note that for parameters which include a `space` character in their name, lookup using the "dot" notation won't work! In this case, try using the [key lookup](./helpers.md#key-access) method: - -```html -{% raw %} - -Voltage Rating: {% getkey parameters "Voltage Rating" %} -{% endraw %} -``` diff --git a/docs/docs/report/labels/build_labels.md b/docs/docs/report/labels/build_labels.md new file mode 100644 index 0000000000..0a3924a106 --- /dev/null +++ b/docs/docs/report/labels/build_labels.md @@ -0,0 +1,118 @@ +--- +title: Build Labels +--- + +## Build Line Labels + +Build label templates are used to generate labels for individual build order line items. + +### Creating Build Line Label Templates + +Build label templates are added (and edited) via the [admin interface](../../settings/admin.md). + +### Printing Build Line Labels + +Build line labels are printed from the Build Order page, under the *Allocate Stock* tab. Multiple line items can be selected for printing: + +{% with id='print_build_labels', url='report/label_build_print.png', description='Print build line labels' %} +{% include 'img.html' %} +{% endwith %} + +### Context Data + +The following context variables are made available to the Build Line label template: + +| Variable | Description | +| --- | --- | +| build_line | The build_line instance | +| build | The build order to which the build_line is linked | +| bom_item | The bom_item to which the build_line is linked | +| part | The required part for this build_line instance. References bom_item.sub_part | +| quantity | The total quantity required for the build line | +| allocated_quantity | The total quantity which has been allocated against the build line | +| allocations | A queryset containing the allocations made against the build_line | + +## Example + +A simple example template is shown below: + +```html +{% raw %} +{% extends "label/label_base.html" %} +{% load barcode report %} +{% load inventree_extras %} + +{% block style %} + +{{ block.super }} + +.label { + margin: 1mm; +} + +.qr { + height: 28mm; + width: 28mm; + position: relative; + top: 0mm; + right: 0mm; + float: right; +} + +.label-table { + width: 100%; + border-collapse: collapse; + border: 1pt solid black; +} + +.label-table tr { + width: 100%; + border-bottom: 1pt solid black; + padding: 2.5mm; +} + +.label-table td { + padding: 3mm; +} + +{% endblock style %} + +{% block content %} + +
+ + + + + + + + + +
+ Build Order: {{ build.reference }}
+ Build Qty: {% decimal build.quantity %}
+
+ build qr +
+ Part: {{ part.name }}
+ {% if part.IPN %} + IPN: {{ part.IPN }}
+ {% endif %} + Qty / Unit: {% decimal bom_item.quantity %} {% if part.units %}[{{ part.units }}]{% endif %}
+ Qty Total: {% decimal quantity %} {% if part.units %}[{{ part.units }}]{% endif %} +
+ part qr +
+
+ +{% endblock content %} + +{% endraw %} +``` + +Which results in a label like: + +{% with id='build_label_example', url='report/label_build_example.png', description='Example build line labels' %} +{% include 'img.html' %} +{% endwith %} diff --git a/docs/docs/report/labels/location_labels.md b/docs/docs/report/labels/location_labels.md new file mode 100644 index 0000000000..e7af905d75 --- /dev/null +++ b/docs/docs/report/labels/location_labels.md @@ -0,0 +1,24 @@ +--- +title: Location Labels +--- + + +## Stock Location Labels + +Stock Location label templates are used to generate labels for individual Stock Locations. + +### Creating Stock Location Label Templates + +Stock Location label templates are added (and edited) via the admin interface. + +### Printing Stock Location Labels + +To print a single label from the Stock Location detail view, select the *Print Label* option. + +### Context Data + +The following variables are made available to the StockLocation label template: + +| Variable | Description | +| -------- | ----------- | +| location | The [StockLocation](../context_variables.md#stocklocation) object itself | diff --git a/docs/docs/report/labels/part_labels.md b/docs/docs/report/labels/part_labels.md new file mode 100644 index 0000000000..fe5d5cdefb --- /dev/null +++ b/docs/docs/report/labels/part_labels.md @@ -0,0 +1,57 @@ +--- +title: Part Labels +--- + + +## Part Labels + +Part label templates are used to generate labels for individual Part instances. + +### Creating Part Label Templates + +Part label templates are added (and edited) via the admin interface. + +### Printing Part Labels + +Part label can be printed using the following approaches: + +To print a single part label from the Part detail view, select the *Print Label* option. + +To print multiple part labels, select multiple parts in the part table and select the *Print Labels* option. + +### Context Data + +The following context variables are made available to the Part label template: + +| Variable | Description | +| -------- | ----------- | +| part | The [Part](../context_variables.md#part) object | +| category | The [Part Category](../context_variables.md#part-category) which contains the Part | +| name | The name of the part | +| description | The description text for the part | +| IPN | Internal part number (IPN) for the part | +| revision | Part revision code | +| qr_data | String data which can be rendered to a QR code | +| parameters | Map (Python dictionary) object containing the parameters associated with the part instance | + +#### Parameters + +The part parameters can be accessed by parameter name lookup in the template, as follows: + +```html +{% raw %} + +Part: {{ part.name }} +Length: {{ parameters.length }} + +{% endraw %} +``` + +Note that for parameters which include a `space` character in their name, lookup using the "dot" notation won't work! In this case, try using the [key lookup](../helpers.md#key-access) method: + +```html +{% raw %} + +Voltage Rating: {% getkey parameters "Voltage Rating" %} +{% endraw %} +``` diff --git a/docs/docs/report/labels/stock_labels.md b/docs/docs/report/labels/stock_labels.md new file mode 100644 index 0000000000..eb72147284 --- /dev/null +++ b/docs/docs/report/labels/stock_labels.md @@ -0,0 +1,61 @@ +--- +title: Stock Labels +--- + + +## Stock Item Labels + +Stock Item label templates are used to generate labels for individual Stock Items. + +### Creating Stock Item Label Templates + +Stock Item label templates are added (and edited) via the admin interface. + +### Printing Stock Item Labels + +Stock Item labels can be printed using the following approaches: + +To print a single stock item from the Stock Item detail view, select the *Print Label* option as shown below: + +{% with id='item_label_single', url='report/label_stock_print_single.png', description='Print single stock item label' %} +{% include 'img.html' %} +{% endwith %} + +To print multiple stock items from the Stock table view, select the *Print Labels* option as shown below: + +{% with id='item_label_multiple', url='report/label_stock_print_multiple.png', description='Print multiple stock item labels' %} +{% include 'img.html' %} +{% endwith %} + +### Context Data + +The following variables are made available to the StockItem label template: + +| Variable | Description | +| -------- | ----------- | +| item | The [StockItem](../context_variables.md#stockitem) object itself | +| part | The [Part](../context_variables.md#part) object which is referenced by the [StockItem](../context_variables.md#stockitem) object | +| name | The `name` field of the associated Part object | +| ipn | The `IPN` field of the associated Part object | +| revision | The `revision` field of the associated Part object | +| quantity | The `quantity` field of the StockItem object | +| serial | The `serial` field of the StockItem object | +| uid | The `uid` field of the StockItem object | +| tests | Dict object of TestResult data associated with the StockItem | +| parameters | Dict object containing the parameters associated with the base Part | + +### URL-style QR code + +Stock Item labels support [QR code](../barcodes.md#qr-code) containing the stock item URL, which can be +scanned and opened directly +on a portable device using the camera or a QR code scanner. To generate a URL-style QR code for stock item in the [label HTML template](../labels.md#label-templates), add the +following HTML tag: + +``` html +{% raw %} + +{% endraw %} +``` + +Make sure to customize the `custom_qr_class` CSS class to define the position of the QR code +on the label. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 46652d3306..38aef90214 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -138,7 +138,12 @@ nav: - Sales Order: report/sales_order.md - Return Order: report/return_order.md - BOM: report/bom.md - - Labels: report/labels.md + - Labels: + - Custom Labels: report/labels.md + - Part Labels: report/labels/part_labels.md + - Stock Labels: report/labels/stock_labels.md + - Location Labels: report/labels/location_labels.md + - Build Labels: report/labels/build_labels.md - Helper Functions: report/helpers.md - Barcodes: report/barcodes.md - Context Variables: report/context_variables.md