mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Add 'has_variants' and 'variant_of' field for Part
- StockItem cannot point to a part which is a template part
This commit is contained in:
parent
1ac1c472c7
commit
1a2fb9e170
24
InvenTree/part/migrations/0003_auto_20190525_2226.py
Normal file
24
InvenTree/part/migrations/0003_auto_20190525_2226.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 2.2 on 2019-05-25 12:26
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('part', '0002_auto_20190520_2204'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='part',
|
||||||
|
name='has_variants',
|
||||||
|
field=models.BooleanField(default=False, help_text='Is this part a template part?'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='part',
|
||||||
|
name='variant_of',
|
||||||
|
field=models.ForeignKey(blank=True, help_text='Is this part a variant of another part?', limit_choices_to={'active': True, 'has_variants': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='variants', to='part.Part'),
|
||||||
|
),
|
||||||
|
]
|
@ -192,6 +192,7 @@ class Part(models.Model):
|
|||||||
description: Longer form description of the part
|
description: Longer form description of the part
|
||||||
keywords: Optional keywords for improving part search results
|
keywords: Optional keywords for improving part search results
|
||||||
IPN: Internal part number (optional)
|
IPN: Internal part number (optional)
|
||||||
|
has_variants: If True, this part is a 'template' part and cannot be instantiated as a StockItem
|
||||||
URL: Link to an external page with more information about this part (e.g. internal Wiki)
|
URL: Link to an external page with more information about this part (e.g. internal Wiki)
|
||||||
image: Image of this part
|
image: Image of this part
|
||||||
default_location: Where the item is normally stored (may be null)
|
default_location: Where the item is normally stored (may be null)
|
||||||
@ -258,6 +259,17 @@ class Part(models.Model):
|
|||||||
|
|
||||||
variant = models.CharField(max_length=32, blank=True, help_text='Part variant or revision code')
|
variant = models.CharField(max_length=32, blank=True, help_text='Part variant or revision code')
|
||||||
|
|
||||||
|
has_variants = models.BooleanField(default=False, help_text='Is this part a template part?')
|
||||||
|
|
||||||
|
variant_of = models.ForeignKey('part.Part', related_name='variants',
|
||||||
|
null=True, blank=True,
|
||||||
|
limit_choices_to={
|
||||||
|
'has_variants': True,
|
||||||
|
'active': True,
|
||||||
|
},
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
help_text='Is this part a variant of another part?')
|
||||||
|
|
||||||
description = models.CharField(max_length=250, blank=False, help_text='Part description')
|
description = models.CharField(max_length=250, blank=False, help_text='Part description')
|
||||||
|
|
||||||
keywords = models.CharField(max_length=250, blank=True, help_text='Part keywords to improve visibility in search results')
|
keywords = models.CharField(max_length=250, blank=True, help_text='Part keywords to improve visibility in search results')
|
||||||
|
19
InvenTree/stock/migrations/0002_auto_20190525_2226.py
Normal file
19
InvenTree/stock/migrations/0002_auto_20190525_2226.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Generated by Django 2.2 on 2019-05-25 12:26
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('stock', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='part',
|
||||||
|
field=models.ForeignKey(help_text='Base part', limit_choices_to={'active': True, 'has_variants': True}, on_delete=django.db.models.deletion.CASCADE, related_name='stock_items', to='part.Part'),
|
||||||
|
),
|
||||||
|
]
|
@ -135,11 +135,18 @@ class StockItem(models.Model):
|
|||||||
})
|
})
|
||||||
|
|
||||||
if self.part is not None:
|
if self.part is not None:
|
||||||
|
# A trackable part must have a serial number
|
||||||
if self.part.trackable and not self.serial:
|
if self.part.trackable and not self.serial:
|
||||||
raise ValidationError({
|
raise ValidationError({
|
||||||
'serial': _('Serial number must be set for trackable items')
|
'serial': _('Serial number must be set for trackable items')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# A template part cannot be instantiated as a StockItem
|
||||||
|
if self.part.has_variants:
|
||||||
|
raise ValidationError({
|
||||||
|
'part': _('Stock item cannot be created for a template Part')
|
||||||
|
})
|
||||||
|
|
||||||
except Part.DoesNotExist:
|
except Part.DoesNotExist:
|
||||||
# This gets thrown if self.supplier_part is null
|
# This gets thrown if self.supplier_part is null
|
||||||
# TODO - Find a test than can be perfomed...
|
# TODO - Find a test than can be perfomed...
|
||||||
@ -186,7 +193,12 @@ class StockItem(models.Model):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
part = models.ForeignKey('part.Part', on_delete=models.CASCADE, related_name='stock_items', help_text='Base part')
|
part = models.ForeignKey('part.Part', on_delete=models.CASCADE,
|
||||||
|
related_name='stock_items', help_text='Base part',
|
||||||
|
limit_choices_to={
|
||||||
|
'has_variants': True,
|
||||||
|
'active': True,
|
||||||
|
})
|
||||||
|
|
||||||
supplier_part = models.ForeignKey('company.SupplierPart', blank=True, null=True, on_delete=models.SET_NULL,
|
supplier_part = models.ForeignKey('company.SupplierPart', blank=True, null=True, on_delete=models.SET_NULL,
|
||||||
help_text='Select a matching supplier part for this stock item')
|
help_text='Select a matching supplier part for this stock item')
|
||||||
|
Loading…
Reference in New Issue
Block a user