diff --git a/InvenTree/part/admin.py b/InvenTree/part/admin.py index 02b7ea8c2b..4de8278bec 100644 --- a/InvenTree/part/admin.py +++ b/InvenTree/part/admin.py @@ -4,7 +4,7 @@ from import_export.admin import ImportExportModelAdmin from .models import PartCategory, Part from .models import PartAttachment, PartStar from .models import BomItem -from .models import PartParameter +from .models import PartParameterTemplate, PartParameter class PartAdmin(ImportExportModelAdmin): @@ -31,13 +31,12 @@ class BomItemAdmin(ImportExportModelAdmin): list_display = ('part', 'sub_part', 'quantity') -""" class ParameterTemplateAdmin(admin.ModelAdmin): - list_display = ('name', 'units', 'format') -""" + list_display = ('name', 'units') + class ParameterAdmin(admin.ModelAdmin): - list_display = ('part', 'name', 'data') + list_display = ('part', 'template', 'data') admin.site.register(Part, PartAdmin) @@ -45,4 +44,5 @@ admin.site.register(PartCategory, PartCategoryAdmin) admin.site.register(PartAttachment, PartAttachmentAdmin) admin.site.register(PartStar, PartStarAdmin) admin.site.register(BomItem, BomItemAdmin) +admin.site.register(PartParameterTemplate, ParameterTemplateAdmin) admin.site.register(PartParameter, ParameterAdmin) diff --git a/InvenTree/part/migrations/0015_auto_20190820_0251.py b/InvenTree/part/migrations/0015_auto_20190820_0251.py new file mode 100644 index 0000000000..b981358519 --- /dev/null +++ b/InvenTree/part/migrations/0015_auto_20190820_0251.py @@ -0,0 +1,37 @@ +# Generated by Django 2.2.4 on 2019-08-20 02:51 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0014_partparameter'), + ] + + operations = [ + migrations.CreateModel( + name='PartParameterTemplate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Parameter Name', max_length=100)), + ('units', models.CharField(blank=True, help_text='Parameter Units', max_length=25)), + ], + ), + migrations.RemoveField( + model_name='partparameter', + name='name', + ), + migrations.AlterField( + model_name='partparameter', + name='data', + field=models.CharField(help_text='Parameter Value', max_length=500), + ), + migrations.AddField( + model_name='partparameter', + name='template', + field=models.ForeignKey(default=1, help_text='Parameter Template', on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='part.PartParameterTemplate'), + preserve_default=False, + ), + ] diff --git a/InvenTree/part/migrations/0016_auto_20190820_0257.py b/InvenTree/part/migrations/0016_auto_20190820_0257.py new file mode 100644 index 0000000000..0399129078 --- /dev/null +++ b/InvenTree/part/migrations/0016_auto_20190820_0257.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.4 on 2019-08-20 02:57 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('part', '0015_auto_20190820_0251'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='partparameter', + unique_together={('part', 'template')}, + ), + ] diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index f1e78f502d..0e234400f4 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -1033,26 +1033,61 @@ class PartStar(models.Model): unique_together = ['part', 'user'] -class PartParameter(models.Model): - """ A PartParameter provides key:value pairs for extra +class PartParameterTemplate(models.Model): + """ A PartParameterTemplate provides a template for key:value pairs for extra parameters fields/values to be added to a Part. This allows users to arbitrarily assign data fields to a Part beyond the built-in attributes. Attributes: - part: Link to a Part object name: The name (key) of the Parameter [string] + units: The units of the Parameter [string] + """ + + def __str__(self): + s = str(self.name) + if self.units: + s += " ({units})".format(units=self.units) + return s + + + name = models.CharField(max_length=100, help_text='Parameter Name') + + units = models.CharField(max_length=25, help_text='Parameter Units', blank=True) + + +class PartParameter(models.Model): + """ A PartParameter is a specific instance of a PartParameterTemplate. + + Attributes: + part: Reference to a single Part object + template: Reference to a single PartParameterTemplate object data: The data (value) of the Parameter [string] """ + def __str__(self): + return "{part} : {param} = {data}{units}".format( + part=str(self.part), + param=str(self.template.name), + data=str(self.data), + units=str(self.template.units) + ) + + class Meta: + # Prevent multiple instances of a parameter for a single part + unique_together = ('part', 'template') + part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='parameters', help_text='Parent Part', ) - name = models.CharField(max_length=100, help_text='Parameter Name') + template = models.ForeignKey(PartParameterTemplate, on_delete=models.CASCADE, + related_name='instances', + help_text='Parameter Template' + ) - data = models.CharField(max_length=100, help_text='Parameter Value') + data = models.CharField(max_length=500, help_text='Parameter Value') class BomItem(models.Model):