diff --git a/shimatta_kenkyusho/parts/migrations/0015_componenttype_description_template.py b/shimatta_kenkyusho/parts/migrations/0015_componenttype_description_template.py new file mode 100644 index 0000000..0d40d19 --- /dev/null +++ b/shimatta_kenkyusho/parts/migrations/0015_componenttype_description_template.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.3 on 2025-01-31 21:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parts', '0014_storage_expand_sub_storage_stocks'), + ] + + operations = [ + migrations.AddField( + model_name='componenttype', + name='description_template', + field=models.TextField(blank=True), + ), + ] diff --git a/shimatta_kenkyusho/parts/migrations/0016_componentparametertype_interfix.py b/shimatta_kenkyusho/parts/migrations/0016_componentparametertype_interfix.py new file mode 100644 index 0000000..ded8b86 --- /dev/null +++ b/shimatta_kenkyusho/parts/migrations/0016_componentparametertype_interfix.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.3 on 2025-01-31 21:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parts', '0015_componenttype_description_template'), + ] + + operations = [ + migrations.AddField( + model_name='componentparametertype', + name='interfix', + field=models.CharField(blank=True, max_length=10), + ), + ] diff --git a/shimatta_kenkyusho/parts/models.py b/shimatta_kenkyusho/parts/models.py index e1f9e8c..4d537a6 100644 --- a/shimatta_kenkyusho/parts/models.py +++ b/shimatta_kenkyusho/parts/models.py @@ -6,6 +6,7 @@ from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from django.dispatch import receiver from django.core.validators import MinValueValidator, MaxValueValidator +from django.template import engines import os import uuid from shimatta_modules.EngineeringNumberConverter import EngineeringNumberConverter as NumConv @@ -29,6 +30,7 @@ class ComponentParameterType(models.Model): parameter_name = models.CharField(max_length=50, unique=True) parameter_description = models.TextField(null=False, blank=True) unit = models.CharField(max_length=10, null=False, blank=True) + interfix = models.CharField(max_length=10, null=False, blank=True, help_text="char to be used as decimal point in dynamic description eg. 2R2") parameter_type = models.CharField(max_length=1, choices=TYPE_CHOICES, default='N') def __str__(self): @@ -49,6 +51,9 @@ class ComponentType(models.Model): class_name = models.CharField(max_length=50, unique=True) passive = models.BooleanField() possible_parameter = models.ManyToManyField(ComponentParameterType, blank=True) + description_template = models.TextField(blank=True, + help_text="Template to assemble the dynamic description. " + "Use template syntax, access the component with 'object', parameters with 'param_*'.") def __str__(self): return '[' + self.class_name + ']' @@ -268,6 +273,18 @@ class Component(models.Model): if sum is None: sum = 0 return sum + + @property + def dynamic_description(self): + django_engine = engines["django"] + template = django_engine.from_string(self.component_type.description_template) + + parameters = list(ComponentParameter.objects.filter(component=self)) + parameters += list(PackageParameter.objects.filter(package=self.package)) + + context = {f'param_{param.parameter_type.parameter_name}': param for param in parameters} + context.update({'object': self}) + return template.render(context) class AbstractParameter(models.Model): class Meta: @@ -302,6 +319,21 @@ class AbstractParameter(models.Model): elif my_type == 'F': return self.text_value + def resolved_value_as_short_string(self): + my_type = self.parameter_type.parameter_type + + if my_type == 'E' or my_type == 'I': + # Engineering float number + (num, prefix) = NumConv.number_to_engineering(self.value, it_unit=(True if my_type=='I' else False)) + result = f'{num}' + result = result.replace('.', prefix if prefix else self.parameter_type.interfix or '.').upper() + return result + elif my_type == 'N': + # Standard float number + return f'{self.value:g}{self.parameter_type.unit}' + else: + return self.resolved_value_as_string() + class ComponentParameter(AbstractParameter): class Meta: unique_together = ('component', 'parameter_type') diff --git a/shimatta_kenkyusho/templates/parts/stocks-detail.html b/shimatta_kenkyusho/templates/parts/stocks-detail.html index 6a1f25f..89d8efd 100644 --- a/shimatta_kenkyusho/templates/parts/stocks-detail.html +++ b/shimatta_kenkyusho/templates/parts/stocks-detail.html @@ -101,7 +101,10 @@
Lot: {{stock.lot}}
{% endif %} -
+
+
{{ stock.component.dynamic_description }}
+
+
{% qr_from_text stock.get_qr_code size="6" image_format="svg" %}