From 8c8b25a0d256c56dad6402bf5896331874abfd6d Mon Sep 17 00:00:00 2001 From: eeintech Date: Wed, 31 Mar 2021 18:04:28 -0400 Subject: [PATCH] Validating API for SupplierPart, not able to spin-off ManufacturerPart from serialized data --- InvenTree/company/models.py | 63 ++++++++++++++++++++++++++++++-- InvenTree/company/serializers.py | 36 +++++++++++++++++- InvenTree/company/views.py | 46 +++++++---------------- 3 files changed, 107 insertions(+), 38 deletions(-) diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 10217d4d0c..1e2fe7d4b2 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -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) diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 164f36a33d..513a07a71b 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -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 """ diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py index 80ebc7512c..08bb6c1305 100644 --- a/InvenTree/company/views.py +++ b/InvenTree/company/views.py @@ -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)