mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-30 04:26:44 +00:00
Update "reference" field for shipment model
- Must be unique - Auto-incrementing default value - Updated migrations
This commit is contained in:
parent
e7c25126a4
commit
c90c224ed2
@ -3,6 +3,9 @@
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
import order.models
|
||||||
|
|
||||||
import markdownx.models
|
import markdownx.models
|
||||||
|
|
||||||
|
|
||||||
@ -19,7 +22,7 @@ class Migration(migrations.Migration):
|
|||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('shipment_date', models.DateField(blank=True, help_text='Date of shipment', null=True, verbose_name='Shipment Date')),
|
('shipment_date', models.DateField(blank=True, help_text='Date of shipment', null=True, verbose_name='Shipment Date')),
|
||||||
('reference', models.CharField(blank=True, help_text='Shipment reference', max_length=100, verbose_name='Reference')),
|
('reference', models.CharField(default=order.models.get_next_shipment_number, unique=True, help_text='Shipment reference', max_length=100, verbose_name='Reference')),
|
||||||
('notes', markdownx.models.MarkdownxField(blank=True, help_text='Shipment notes', verbose_name='Notes')),
|
('notes', markdownx.models.MarkdownxField(blank=True, help_text='Shipment notes', verbose_name='Notes')),
|
||||||
('checked_by', models.ForeignKey(blank=True, help_text='User who checked this shipment', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Checked By')),
|
('checked_by', models.ForeignKey(blank=True, help_text='User who checked this shipment', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Checked By')),
|
||||||
('order', models.ForeignKey(help_text='Sales Order', on_delete=django.db.models.deletion.CASCADE, related_name='shipments', to='order.salesorder', verbose_name='Order')),
|
('order', models.ForeignKey(help_text='Sales Order', on_delete=django.db.models.deletion.CASCADE, related_name='shipments', to='order.salesorder', verbose_name='Order')),
|
||||||
|
@ -37,7 +37,7 @@ def get_next_po_number():
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if PurchaseOrder.objects.count() == 0:
|
if PurchaseOrder.objects.count() == 0:
|
||||||
return
|
return "001"
|
||||||
|
|
||||||
order = PurchaseOrder.objects.exclude(reference=None).last()
|
order = PurchaseOrder.objects.exclude(reference=None).last()
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ def get_next_so_number():
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if SalesOrder.objects.count() == 0:
|
if SalesOrder.objects.count() == 0:
|
||||||
return
|
return "001"
|
||||||
|
|
||||||
order = SalesOrder.objects.exclude(reference=None).last()
|
order = SalesOrder.objects.exclude(reference=None).last()
|
||||||
|
|
||||||
@ -107,45 +107,6 @@ class Order(ReferenceIndexingMixin):
|
|||||||
responsible: User (or group) responsible for managing the order
|
responsible: User (or group) responsible for managing the order
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def getNextOrderNumber(cls):
|
|
||||||
"""
|
|
||||||
Try to predict the next order-number
|
|
||||||
"""
|
|
||||||
|
|
||||||
if cls.objects.count() == 0:
|
|
||||||
return None
|
|
||||||
|
|
||||||
# We will assume that the latest pk has the highest PO number
|
|
||||||
order = cls.objects.last()
|
|
||||||
ref = order.reference
|
|
||||||
|
|
||||||
if not ref:
|
|
||||||
return None
|
|
||||||
|
|
||||||
tries = set()
|
|
||||||
|
|
||||||
tries.add(ref)
|
|
||||||
|
|
||||||
while 1:
|
|
||||||
new_ref = increment(ref)
|
|
||||||
|
|
||||||
print("Reference:", new_ref)
|
|
||||||
|
|
||||||
if new_ref in tries:
|
|
||||||
# We are in a looping situation - simply return the original one
|
|
||||||
return ref
|
|
||||||
|
|
||||||
# Check that the new ref does not exist in the database
|
|
||||||
if cls.objects.filter(reference=new_ref).exists():
|
|
||||||
tries.add(new_ref)
|
|
||||||
new_ref = increment(new_ref)
|
|
||||||
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
return new_ref
|
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
|
||||||
self.rebuild_reference_field()
|
self.rebuild_reference_field()
|
||||||
@ -903,6 +864,35 @@ class SalesOrderLineItem(OrderLineItem):
|
|||||||
return self.allocated_quantity() > self.quantity
|
return self.allocated_quantity() > self.quantity
|
||||||
|
|
||||||
|
|
||||||
|
def get_next_shipment_number():
|
||||||
|
"""
|
||||||
|
Returns the next available SalesOrderShipment reference number"
|
||||||
|
"""
|
||||||
|
|
||||||
|
if SalesOrderShipment.objects.count() == 0:
|
||||||
|
return "001"
|
||||||
|
|
||||||
|
shipment = SalesOrderShipment.objects.exclude(reference=None).last()
|
||||||
|
|
||||||
|
attempts = set([shipment.reference])
|
||||||
|
|
||||||
|
reference = shipment.reference
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
reference = increment(reference)
|
||||||
|
|
||||||
|
if reference in attempts:
|
||||||
|
# Escape infinite recursion
|
||||||
|
return reference
|
||||||
|
|
||||||
|
if SalesOrderShipment.objects.filter(reference=reference).exists():
|
||||||
|
attempts.add(reference)
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
return reference
|
||||||
|
|
||||||
|
|
||||||
class SalesOrderShipment(models.Model):
|
class SalesOrderShipment(models.Model):
|
||||||
"""
|
"""
|
||||||
The SalesOrderShipment model represents a physical shipment made against a SalesOrder.
|
The SalesOrderShipment model represents a physical shipment made against a SalesOrder.
|
||||||
@ -946,9 +936,11 @@ class SalesOrderShipment(models.Model):
|
|||||||
|
|
||||||
reference = models.CharField(
|
reference = models.CharField(
|
||||||
max_length=100,
|
max_length=100,
|
||||||
blank=True,
|
blank=False,
|
||||||
|
unique=True,
|
||||||
verbose_name=('Reference'),
|
verbose_name=('Reference'),
|
||||||
help_text=_('Shipment reference'),
|
help_text=_('Shipment reference'),
|
||||||
|
default=get_next_shipment_number,
|
||||||
)
|
)
|
||||||
|
|
||||||
notes = MarkdownxField(
|
notes = MarkdownxField(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user