From 31ff3599eb985a83ca6e96ff13a56656abf7d989 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 16 Jun 2023 12:14:17 +1000 Subject: [PATCH] Parameter by name (#5055) * Add method get_parameter - Return a parameter for a part, on name * Add unit test for new method * Adds template tag to retrieve parameter based on name * Update docs --- InvenTree/part/models.py | 25 +++++++++++ InvenTree/part/test_param.py | 14 ++++++ InvenTree/report/templatetags/report.py | 19 ++++++++- .../images/report/label_with_parameters.png | Bin 0 -> 17515 bytes docs/docs/report/helpers.md | 28 ++++++++++++ docs/docs/report/labels/part_labels.md | 40 ++++++++++++++++-- 6 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 docs/docs/assets/images/report/label_with_parameters.png diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index 83c2c63de5..51f0b4d460 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -2176,6 +2176,16 @@ class Part(InvenTreeBarcodeMixin, InvenTreeNotesMixin, MetadataMixin, MPTTModel) return quantity + def get_parameter(self, name): + """Return the parameter with the given name. + + If no matching parameter is found, return None. + """ + try: + return self.parameters.get(template__name=name) + except PartParameter.DoesNotExist: + return None + def get_parameters(self): """Return all parameters for this part, ordered by name.""" return self.parameters.order_by('template__name') @@ -3598,6 +3608,21 @@ class PartParameter(MetadataMixin, models.Model): blank=True, ) + @property + def units(self): + """Return the units associated with the template""" + return self.template.units + + @property + def name(self): + """Return the name of the template""" + return self.template.name + + @property + def description(self): + """Return the description of the template""" + return self.template.description + @classmethod def create(cls, part, template, data, save=False): """Custom save method for the PartParameter class""" diff --git a/InvenTree/part/test_param.py b/InvenTree/part/test_param.py index 91537cbfa3..63a3b4f8d2 100644 --- a/InvenTree/part/test_param.py +++ b/InvenTree/part/test_param.py @@ -63,6 +63,20 @@ class TestParams(TestCase): self.assertEqual(len(p.metadata.keys()), 4) + def test_get_parameter(self): + """Test the Part.get_parameter method""" + + prt = Part.objects.get(pk=3) + + # Check that we can get a parameter by name + for name in ['Length', 'Width', 'Thickness']: + param = prt.get_parameter(name) + self.assertEqual(param.template.name, name) + + # Check that an incorrect name returns None + param = prt.get_parameter('Not a parameter') + self.assertIsNone(param) + class TestCategoryTemplates(TransactionTestCase): """Test class for PartCategoryParameterTemplate model""" diff --git a/InvenTree/report/templatetags/report.py b/InvenTree/report/templatetags/report.py index 5f90ff807f..cb8c8f2105 100644 --- a/InvenTree/report/templatetags/report.py +++ b/InvenTree/report/templatetags/report.py @@ -181,7 +181,7 @@ def encode_svg_image(filename): @register.simple_tag() -def part_image(part): +def part_image(part: Part): """Return a fully-qualified path for a part image. Arguments: @@ -200,6 +200,23 @@ def part_image(part): return uploaded_image(img) +@register.simple_tag() +def part_parameter(part: Part, parameter_name: str): + """Return a PartParameter object for the given part and parameter name + + Arguments: + part: A Part object + parameter_name: The name of the parameter to retrieve + + Returns: + A PartParameter object, or None if not found + """ + if type(part) is Part: + return part.get_parameter(parameter_name) + else: + return None + + @register.simple_tag() def company_image(company): """Return a fully-qualified path for a company image. diff --git a/docs/docs/assets/images/report/label_with_parameters.png b/docs/docs/assets/images/report/label_with_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..b127849f1f8cbd9c89ce1a12eaf71ba0cd671ff6 GIT binary patch literal 17515 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 {% endraw %} ``` + +## Part Parameters + +If you need to load a part parameter for a particular Part, within the context of your template, you can use the `part_parameter` template tag. + +The following example assumes that you have a report or label which contains a valid [Part](../part/part.md) instance: + +``` +{% raw %} +{% load report %} + +{% part_parameter part "length" as length %} + +Part: {{ part.name }}
+Length: {{ length.data }} [{{ length.units }}] + +{% endraw %} +``` + +A [Part Parameter](../part/parameter.md) has the following available attributes: + +| Attribute | Description | +| --- | --- | +| Name | The *name* of the parameter (e.g. "Length") | +| Description | The *description* of the parameter | +| Data | The *value* of the parameter (e.g. "123.4") | +| Units | The *units* of the parameter (e.g. "km") | +| Template | A reference to a [PartParameterTemplate](../part/parameter.md#parameter-templates) | diff --git a/docs/docs/report/labels/part_labels.md b/docs/docs/report/labels/part_labels.md index fe5d5cdefb..7e9e5606b8 100644 --- a/docs/docs/report/labels/part_labels.md +++ b/docs/docs/report/labels/part_labels.md @@ -34,9 +34,9 @@ The following context variables are made available to the Part label template: | 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 +#### Parameter Values -The part parameters can be accessed by parameter name lookup in the template, as follows: +The part parameter *values* can be accessed by parameter name lookup in the template, as follows: ```html {% raw %} @@ -47,7 +47,8 @@ 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: +!!! warning "Spaces" + 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 %} @@ -55,3 +56,36 @@ Note that for parameters which include a `space` character in their name, lookup Voltage Rating: {% getkey parameters "Voltage Rating" %} {% endraw %} ``` + +#### Parameter Data + +If you require access to the parameter data itself, and not just the "value" of a particular parameter, you can use the `part_parameter` [helper function](../helpers.md#part-parameters). + +For example, the following label template can be used to generate a label which contains parameter data in addition to parameter units: + +```html +{% raw %} +{% extends "label/label_base.html" %} + +{% load report %} + +{% block content %} + +{% part_parameter part "Width" as width %} +{% part_parameter part "Length" as length %} + +
+ Part: {{ part.full_name }}
+ Width: {{ width.data }} [{{ width.units }}]
+ Length: {{ length.data }} [{{ length.units }}] +
+ +{% endblock content %} +{% endraw %} +``` + +The following label is produced: + +{% with id="report-parameters", url="report/label_with_parameters.png", description="Label with parameters" %} +{% include 'img.html' %} +{% endwith %}