diff --git a/InvenTree/build/migrations/0007_auto_20190429_2255.py b/InvenTree/build/migrations/0007_auto_20190429_2255.py new file mode 100644 index 0000000000..8a01606b84 --- /dev/null +++ b/InvenTree/build/migrations/0007_auto_20190429_2255.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2 on 2019-04-29 12:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0009_auto_20190428_0841'), + ('build', '0006_auto_20190429_2233'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='builditem', + unique_together={('build', 'stock_item')}, + ), + ] diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index d0c3bbee03..2d2ab0e099 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -6,6 +6,7 @@ Build database model definitions from __future__ import unicode_literals from django.utils.translation import ugettext as _ +from django.core.exceptions import ValidationError from django.urls import reverse from django.db import models @@ -128,6 +129,26 @@ class BuildItem(models.Model): quantity: Number of units allocated """ + class Meta: + unique_together = [ + ('build', 'stock_item'), + ] + + def clean(self): + """ Check validity of the BuildItem model. + The following checks are performed: + + - StockItem.part must be in the BOM of the Part object referenced by Build + """ + + if self.stock_item.part not in self.build.part.required_parts(): + print('stock_item:', self.stock_item.part) + for p in self.build.part.bom_items.all(): + print('bom_part:', p) + raise ValidationError( + {'stock_item': _("Selected stock item not found in BOM for part '{p}'".format(p=str(self.build.part)))} + ) + build = models.ForeignKey( Build, on_delete=models.CASCADE, diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index 955a8d59f5..efe4ca6b69 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -6,11 +6,11 @@ JSON serializers for Build API from __future__ import unicode_literals from rest_framework import serializers +from InvenTree.serializers import InvenTreeModelSerializer -from .models import Build +from .models import Build, BuildItem - -class BuildSerializer(serializers.ModelSerializer): +class BuildSerializer(InvenTreeModelSerializer): """ Serializes a Build object """ url = serializers.CharField(source='get_absolute_url', read_only=True) @@ -29,3 +29,15 @@ class BuildSerializer(serializers.ModelSerializer): 'status', 'status_text', 'notes'] + + +class BuildItemSerializer(InvenTreeModelSerializer): + """ Serializes a BuildItem object """ + + class Meta: + model = BuildItem + fields = [ + 'build', + 'stock', + 'quantity' + ]