mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 11:36:44 +00:00
Build line labels (#5034)
* Adds BuildLineLabel model - New type of label for printing against BuildLine objects * Add serializer for new model * Add API endpoints for new label type * Add hooks to BuildLine table * Create default label - Create an example BuildLineLabel object * Add admin integration * Fix js code * Use two-tiered template - Allows base template to be updated * Improve default label * Add docs pages for labels * Update nav * Documentation for new label * Add permission role * Bump API version
This commit is contained in:
parent
a3940cfc41
commit
8d16abcefb
@ -2,11 +2,14 @@
|
|||||||
|
|
||||||
|
|
||||||
# InvenTree API version
|
# 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
|
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
|
v121 -> 2023-06-14 : https://github.com/inventree/InvenTree/pull/4808
|
||||||
- Adds "ProjectCode" link to Build model
|
- 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
|
- Major overhaul of the build order API
|
||||||
- Adds new BuildLine model
|
- 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
|
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
|
- Add Metadata to: Part test templates, Part parameters, Part category parameter templates, BOM item substitute, Related Parts, Stock item test result
|
||||||
|
|
||||||
|
@ -13,3 +13,4 @@ class LabelAdmin(admin.ModelAdmin):
|
|||||||
admin.site.register(label.models.StockItemLabel, LabelAdmin)
|
admin.site.register(label.models.StockItemLabel, LabelAdmin)
|
||||||
admin.site.register(label.models.StockLocationLabel, LabelAdmin)
|
admin.site.register(label.models.StockLocationLabel, LabelAdmin)
|
||||||
admin.site.register(label.models.PartLabel, LabelAdmin)
|
admin.site.register(label.models.PartLabel, LabelAdmin)
|
||||||
|
admin.site.register(label.models.BuildLineLabel, LabelAdmin)
|
||||||
|
@ -10,6 +10,7 @@ from django.views.decorators.cache import cache_page, never_cache
|
|||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
from rest_framework.exceptions import NotFound
|
from rest_framework.exceptions import NotFound
|
||||||
|
|
||||||
|
import build.models
|
||||||
import common.models
|
import common.models
|
||||||
import InvenTree.helpers
|
import InvenTree.helpers
|
||||||
import label.models
|
import label.models
|
||||||
@ -368,6 +369,31 @@ class PartLabelPrint(PartLabelMixin, LabelPrintMixin, RetrieveAPI):
|
|||||||
pass
|
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 = [
|
label_api_urls = [
|
||||||
|
|
||||||
# Stock item labels
|
# Stock item labels
|
||||||
@ -408,4 +434,17 @@ label_api_urls = [
|
|||||||
# List view
|
# List view
|
||||||
re_path(r'^.*$', PartLabelList.as_view(), name='api-part-label-list'),
|
re_path(r'^.*$', PartLabelList.as_view(), name='api-part-label-list'),
|
||||||
])),
|
])),
|
||||||
|
|
||||||
|
# BuildLine labels
|
||||||
|
re_path(r'^buildline/', include([
|
||||||
|
# Detail views
|
||||||
|
path(r'<int:pk>/', 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'),
|
||||||
|
])),
|
||||||
]
|
]
|
||||||
|
@ -46,12 +46,12 @@ class LabelConfig(AppConfig):
|
|||||||
def create_labels(self):
|
def create_labels(self):
|
||||||
"""Create all default templates."""
|
"""Create all default templates."""
|
||||||
# Test if models are ready
|
# Test if models are ready
|
||||||
from .models import PartLabel, StockItemLabel, StockLocationLabel
|
import label.models
|
||||||
assert bool(StockLocationLabel is not None)
|
assert bool(label.models.StockLocationLabel is not None)
|
||||||
|
|
||||||
# Create the categories
|
# Create the categories
|
||||||
self.create_labels_category(
|
self.create_labels_category(
|
||||||
StockItemLabel,
|
label.models.StockItemLabel,
|
||||||
'stockitem',
|
'stockitem',
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@ -65,7 +65,7 @@ class LabelConfig(AppConfig):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.create_labels_category(
|
self.create_labels_category(
|
||||||
StockLocationLabel,
|
label.models.StockLocationLabel,
|
||||||
'stocklocation',
|
'stocklocation',
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@ -86,7 +86,7 @@ class LabelConfig(AppConfig):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.create_labels_category(
|
self.create_labels_category(
|
||||||
PartLabel,
|
label.models.PartLabel,
|
||||||
'part',
|
'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):
|
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 folder and database entries for the default templates, if they do not already exist."""
|
||||||
# Create root dir for templates
|
# Create root dir for templates
|
||||||
|
33
InvenTree/label/migrations/0010_buildlinelabel.py
Normal file
33
InvenTree/label/migrations/0010_buildlinelabel.py
Normal file
@ -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,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
@ -13,6 +13,7 @@ from django.template.loader import render_to_string
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
import build.models
|
||||||
import part.models
|
import part.models
|
||||||
import stock.models
|
import stock.models
|
||||||
from InvenTree.helpers import normalize, validateFilterString
|
from InvenTree.helpers import normalize, validateFilterString
|
||||||
@ -59,6 +60,13 @@ def validate_part_filters(filters):
|
|||||||
return 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 WeasyprintLabelMixin(WeasyTemplateResponseMixin):
|
||||||
"""Class for rendering a label to a PDF."""
|
"""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()),
|
'qr_url': request.build_absolute_uri(part.get_absolute_url()),
|
||||||
'parameters': part.parameters_map(),
|
'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,
|
||||||
|
}
|
||||||
|
@ -52,3 +52,13 @@ class PartLabelSerializer(LabelSerializerBase):
|
|||||||
|
|
||||||
model = label.models.PartLabel
|
model = label.models.PartLabel
|
||||||
fields = LabelSerializerBase.label_fields()
|
fields = LabelSerializerBase.label_fields()
|
||||||
|
|
||||||
|
|
||||||
|
class BuildLineLabelSerializer(LabelSerializerBase):
|
||||||
|
"""Serializes a BuildLineLabel object"""
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Metaclass options."""
|
||||||
|
|
||||||
|
model = label.models.BuildLineLabel
|
||||||
|
fields = LabelSerializerBase.label_fields()
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
{% extends "label/buildline/buildline_label_base.html" %}
|
||||||
|
|
||||||
|
<!-- Refer to the buildline_label_base template for further information -->
|
@ -0,0 +1,74 @@
|
|||||||
|
{% extends "label/label_base.html" %}
|
||||||
|
{% load barcode report %}
|
||||||
|
{% load inventree_extras %}
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This is an example template for printing labels against BuildLine objects.
|
||||||
|
Refer to the documentation for a full list of available template variables.
|
||||||
|
-->
|
||||||
|
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
<div class='label'>
|
||||||
|
<table class='label-table'>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>Build Order:</b> {{ build.reference }}<br>
|
||||||
|
<b>Build Qty:</b> {% decimal build.quantity %}<br>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<img class='qr' alt='build qr' src='{% qrcode build.barcode %}'>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>Part:</b> {{ part.name }}<br>
|
||||||
|
{% if part.IPN %}
|
||||||
|
<b>IPN:</b> {{ part.IPN }}<br>
|
||||||
|
{% endif %}
|
||||||
|
<b>Qty / Unit:</b> {% decimal bom_item.quantity %} {% if part.units %}[{{ part.units }}]{% endif %}<br>
|
||||||
|
<b>Qty Total:</b> {% decimal quantity %} {% if part.units %}[{{ part.units }}]{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<img class='qr' alt='part qr' src='{% qrcode part.barcode %}'>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock content %}
|
@ -2349,8 +2349,17 @@ function loadBuildLineTable(table, build_id, options={}) {
|
|||||||
let filters = loadTableFilters('buildlines', params);
|
let filters = loadTableFilters('buildlines', params);
|
||||||
let filterTarget = options.filterTarget || '#filter-list-buildlines';
|
let filterTarget = options.filterTarget || '#filter-list-buildlines';
|
||||||
|
|
||||||
setupFilterList('buildlines', $(table), filterTarget);
|
// If data is passed directly to this function, do not setup filters
|
||||||
// If data is passed directly to this function, do not request data from the server
|
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 = {
|
let table_options = {
|
||||||
name: name,
|
name: name,
|
||||||
|
@ -136,6 +136,7 @@ class RuleSet(models.Model):
|
|||||||
'stock_stockitem',
|
'stock_stockitem',
|
||||||
'stock_stocklocation',
|
'stock_stocklocation',
|
||||||
'report_buildreport',
|
'report_buildreport',
|
||||||
|
'label_buildlinelabel',
|
||||||
],
|
],
|
||||||
'purchase_order': [
|
'purchase_order': [
|
||||||
'company_company',
|
'company_company',
|
||||||
|
BIN
docs/docs/assets/images/report/label_build_example.png
Normal file
BIN
docs/docs/assets/images/report/label_build_example.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
BIN
docs/docs/assets/images/report/label_build_print.png
Normal file
BIN
docs/docs/assets/images/report/label_build_print.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 536 KiB |
@ -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.
|
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
|
||||||
|
|
||||||
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.
|
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 %}
|
{% 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 %}
|
|
||||||
<img class='custom_qr_class' src='{% qrcode qr_url %}'>
|
|
||||||
{% 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 %}
|
|
||||||
```
|
|
||||||
|
118
docs/docs/report/labels/build_labels.md
Normal file
118
docs/docs/report/labels/build_labels.md
Normal file
@ -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 %}
|
||||||
|
|
||||||
|
<div class='label'>
|
||||||
|
<table class='label-table'>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>Build Order:</b> {{ build.reference }}<br>
|
||||||
|
<b>Build Qty:</b> {% decimal build.quantity %}<br>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<img class='qr' alt='build qr' src='{% qrcode build.barcode %}'>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<b>Part:</b> {{ part.name }}<br>
|
||||||
|
{% if part.IPN %}
|
||||||
|
<b>IPN:</b> {{ part.IPN }}<br>
|
||||||
|
{% endif %}
|
||||||
|
<b>Qty / Unit:</b> {% decimal bom_item.quantity %} {% if part.units %}[{{ part.units }}]{% endif %}<br>
|
||||||
|
<b>Qty Total:</b> {% decimal quantity %} {% if part.units %}[{{ part.units }}]{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<img class='qr' alt='part qr' src='{% qrcode part.barcode %}'>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% 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 %}
|
24
docs/docs/report/labels/location_labels.md
Normal file
24
docs/docs/report/labels/location_labels.md
Normal file
@ -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 |
|
57
docs/docs/report/labels/part_labels.md
Normal file
57
docs/docs/report/labels/part_labels.md
Normal file
@ -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 %}
|
||||||
|
```
|
61
docs/docs/report/labels/stock_labels.md
Normal file
61
docs/docs/report/labels/stock_labels.md
Normal file
@ -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 %}
|
||||||
|
<img class='custom_qr_class' src='{% qrcode qr_url %}'>
|
||||||
|
{% endraw %}
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure to customize the `custom_qr_class` CSS class to define the position of the QR code
|
||||||
|
on the label.
|
@ -138,7 +138,12 @@ nav:
|
|||||||
- Sales Order: report/sales_order.md
|
- Sales Order: report/sales_order.md
|
||||||
- Return Order: report/return_order.md
|
- Return Order: report/return_order.md
|
||||||
- BOM: report/bom.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
|
- Helper Functions: report/helpers.md
|
||||||
- Barcodes: report/barcodes.md
|
- Barcodes: report/barcodes.md
|
||||||
- Context Variables: report/context_variables.md
|
- Context Variables: report/context_variables.md
|
||||||
|
Loading…
x
Reference in New Issue
Block a user