Validating API for SupplierPart, not able to spin-off ManufacturerPart from serialized data

This commit is contained in:
eeintech 2021-03-31 18:04:28 -04:00
parent 9e56bf90c5
commit 8c8b25a0d2
3 changed files with 107 additions and 38 deletions

View File

@ -11,7 +11,9 @@ import math
from django.utils.translation import gettext_lazy as _
from django.core.validators import MinValueValidator
from django.core.exceptions import ValidationError
from django.db import models
from django.db.utils import IntegrityError
from django.db.models import Sum, Q, UniqueConstraint
from django.apps import apps
@ -389,6 +391,58 @@ class SupplierPart(models.Model):
def get_absolute_url(self):
return reverse('supplier-part-detail', kwargs={'pk': self.id})
def save(self, *args, **kwargs):
""" Overriding save method to process the linked ManufacturerPart
"""
if 'manufacturer' in kwargs:
manufacturer_id = kwargs.pop('manufacturer')
try:
manufacturer = Company.objects.get(pk=int(manufacturer_id))
except (ValueError, Company.DoesNotExist):
manufacturer = None
else:
manufacturer = None
if 'MPN' in kwargs:
MPN = kwargs.pop('MPN')
else:
MPN = None
if manufacturer or MPN:
if not self.manufacturer_part:
# Create ManufacturerPart
manufacturer_part = ManufacturerPart.create(part=self.part,
manufacturer=manufacturer,
mpn=MPN,
description=self.description,
link=self.link)
self.manufacturer_part = manufacturer_part
else:
# Update ManufacturerPart (if ID exists)
try:
manufacturer_part_id = self.manufacturer_part.id
except AttributeError:
manufacturer_part_id = None
if manufacturer_part_id:
try:
(manufacturer_part, created) = ManufacturerPart.objects.update_or_create(part=self.part,
manufacturer=manufacturer,
MPN=MPN)
except IntegrityError:
manufacturer_part = None
raise ValidationError(f'ManufacturerPart linked to {self.part} from manufacturer {manufacturer.name}'
f'with part number {MPN} already exists!')
if manufacturer_part:
self.manufacturer_part = manufacturer_part
self.clean()
self.validate_unique()
super().save(*args, **kwargs)
class Meta:
unique_together = ('part', 'supplier', 'SKU')
@ -459,10 +513,11 @@ class SupplierPart(models.Model):
items = []
if self.manufacturer_part.manufacturer:
items.append(self.manufacturer_part.manufacturer.name)
if self.manufacturer_part.MPN:
items.append(self.manufacturer_part.MPN)
if self.manufacturer_part:
if self.manufacturer_part.manufacturer:
items.append(self.manufacturer_part.manufacturer.name)
if self.manufacturer_part.MPN:
items.append(self.manufacturer_part.MPN)
return ' | '.join(items)

View File

@ -158,7 +158,9 @@ class SupplierPartSerializer(InvenTreeModelSerializer):
supplier = serializers.PrimaryKeyRelatedField(queryset=Company.objects.filter(is_supplier=True))
manufacturer = serializers.PrimaryKeyRelatedField(source='manufacturer_part.manufacturer', queryset=Company.objects.filter(is_manufacturer=True))
# manufacturer_part = ManufacturerPartSerializer(many=False, read_only=True)
manufacturer = serializers.PrimaryKeyRelatedField(source='manufacturer_part.manufacturer', read_only=True) # queryset=Company.objects.filter(is_manufacturer=True))
MPN = serializers.StringRelatedField(source='manufacturer_part.MPN', read_only=True)
@ -172,6 +174,7 @@ class SupplierPartSerializer(InvenTreeModelSerializer):
'supplier',
'supplier_detail',
'SKU',
# 'manufacturer_part',
'manufacturer',
'MPN',
'manufacturer_detail',
@ -179,6 +182,37 @@ class SupplierPartSerializer(InvenTreeModelSerializer):
'link',
]
def create(self, validated_data):
""" Extract manufacturer data and process ManufacturerPart """
print(validated_data)
# Create SupplierPart
supplier_part = super().create(validated_data)
# Get ManufacturerPart data
part = validated_data.get('part', None)
manufacturer = validated_data.get('manufacturer', None)
MPN = validated_data.get('MPN', None)
description = validated_data.get('description', None)
link = validated_data.get('link', None)
print(f'{manufacturer} | {MPN}')
if manufacturer or MPN:
# Create ManufacturerPart
manufacturer_part = ManufacturerPart.create(part=part,
manufacturer=manufacturer,
mpn=MPN,
description=description,
link=link)
print(manufacturer_part)
supplier_part.manufacturer_part = manufacturer_part
print(supplier_part.manufacturer_part)
supplier_part.save()
return supplier_part
class SupplierPriceBreakSerializer(InvenTreeModelSerializer):
""" Serializer for SupplierPriceBreak object """

View File

@ -528,24 +528,14 @@ class SupplierPartEdit(AjaxUpdateView):
ajax_form_title = _('Edit Supplier Part')
def save(self, supplier_part, form, **kwargs):
""" Save ManufacturerPart data """
""" Process ManufacturerPart data """
# Save supplier part object
supplier_part = super().save(supplier_part, form)
# Save manufacturer part object
manufacturer_id = form.cleaned_data.get('manufacturer', None)
try:
manufacturer = Company.objects.get(pk=manufacturer_id)
except Company.DoesNotExist:
pass
manufacturer = form.cleaned_data.get('manufacturer', None)
MPN = form.cleaned_data.get('MPN', None)
manufacturer_part = supplier_part.manufacturer_part
manufacturer_part.manufacturer = manufacturer
manufacturer_part.MPN = MPN
manufacturer_part.save()
kwargs = {'manufacturer': manufacturer,
'MPN': MPN,
}
supplier_part.save(**kwargs)
def get_form(self):
form = super().get_form()
@ -618,26 +608,16 @@ class SupplierPartCreate(AjaxCreateView):
If single_pricing is defined, add a price break for quantity=1
"""
# Process manufacturer data
part = form.cleaned_data.get('part', None)
manufacturer_id = form.cleaned_data.get('manufacturer', None)
manufacturer_part = None
if manufacturer_id:
manufacturer = Company.objects.get(pk=manufacturer_id)
MPN = form.cleaned_data.get('MPN', None)
description = form.cleaned_data.get('description', None)
link = form.cleaned_data.get('link', None)
manufacturer_part = ManufacturerPart.create(part=part, manufacturer=manufacturer, mpn=MPN, description=description, link=link)
# Save the supplier part object
supplier_part = super().save(form)
if manufacturer_part:
# Link ManufacturerPart
supplier_part.manufacturer_part = manufacturer_part
supplier_part.save()
# Process manufacturer data
manufacturer = form.cleaned_data.get('manufacturer', None)
MPN = form.cleaned_data.get('MPN', None)
kwargs = {'manufacturer': manufacturer,
'MPN': MPN,
}
supplier_part.save(**kwargs)
single_pricing = form.cleaned_data.get('single_pricing', None)