mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-17 12:35:46 +00:00
Virtual part fix (#3265)
* Add 'virtual': False requirement to sales order items * Adds "virtual" filter for part table * Adds extra validation to the SalesOrderLineItem model * Prevent creation of stock items for virtual parts - Add validation check to clean() method of StockItem model - Improve validation message for StockItemSerializer class * Hide "new stock item" button for virtual parts * Hide more buttons for 'virtual' parts
This commit is contained in:
26
InvenTree/order/migrations/0071_auto_20220628_0133.py
Normal file
26
InvenTree/order/migrations/0071_auto_20220628_0133.py
Normal file
@ -0,0 +1,26 @@
|
||||
# Generated by Django 3.2.13 on 2022-06-28 01:33
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('stock', '0077_alter_stockitem_notes'),
|
||||
('part', '0079_alter_part_notes'),
|
||||
('order', '0070_auto_20220620_0728'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='salesorderallocation',
|
||||
name='item',
|
||||
field=models.ForeignKey(help_text='Select stock item to allocate', limit_choices_to={'belongs_to': None, 'part__salable': True, 'part__virtual': False, 'sales_order': None}, on_delete=django.db.models.deletion.CASCADE, related_name='sales_order_allocations', to='stock.stockitem', verbose_name='Item'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='salesorderlineitem',
|
||||
name='part',
|
||||
field=models.ForeignKey(help_text='Part', limit_choices_to={'salable': True, 'virtual': False}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sales_order_line_items', to='part.part', verbose_name='Part'),
|
||||
),
|
||||
]
|
@ -1103,6 +1103,22 @@ class SalesOrderLineItem(OrderLineItem):
|
||||
"""Return the API URL associated with the SalesOrderLineItem model"""
|
||||
return reverse('api-so-line-list')
|
||||
|
||||
def clean(self):
|
||||
"""Perform extra validation steps for this SalesOrderLineItem instance"""
|
||||
|
||||
super().clean()
|
||||
|
||||
if self.part:
|
||||
if self.part.virtual:
|
||||
raise ValidationError({
|
||||
'part': _("Virtual part cannot be assigned to a sales order")
|
||||
})
|
||||
|
||||
if not self.part.salable:
|
||||
raise ValidationError({
|
||||
'part': _("Only salable parts can be assigned to a sales order")
|
||||
})
|
||||
|
||||
order = models.ForeignKey(
|
||||
SalesOrder,
|
||||
on_delete=models.CASCADE,
|
||||
@ -1111,7 +1127,16 @@ class SalesOrderLineItem(OrderLineItem):
|
||||
help_text=_('Sales Order')
|
||||
)
|
||||
|
||||
part = models.ForeignKey('part.Part', on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, verbose_name=_('Part'), help_text=_('Part'), limit_choices_to={'salable': True})
|
||||
part = models.ForeignKey(
|
||||
'part.Part', on_delete=models.SET_NULL,
|
||||
related_name='sales_order_line_items',
|
||||
null=True,
|
||||
verbose_name=_('Part'),
|
||||
help_text=_('Part'),
|
||||
limit_choices_to={
|
||||
'salable': True,
|
||||
'virtual': False,
|
||||
})
|
||||
|
||||
sale_price = InvenTreeModelMoneyField(
|
||||
max_digits=19,
|
||||
@ -1409,6 +1434,7 @@ class SalesOrderAllocation(models.Model):
|
||||
related_name='sales_order_allocations',
|
||||
limit_choices_to={
|
||||
'part__salable': True,
|
||||
'part__virtual': False,
|
||||
'belongs_to': None,
|
||||
'sales_order': None,
|
||||
},
|
||||
|
Reference in New Issue
Block a user