Coverage for src/backend/InvenTree/plugin/base/supplier/serializers.py: 94%
49 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1"""Serializer definitions for the supplier plugin base."""
3from typing import Any, Optional
5from rest_framework import serializers
7import part.models as part_models
8from part.serializers import PartSerializer
11class SupplierListSerializer(serializers.Serializer):
12 """Serializer for a supplier plugin."""
14 plugin_slug = serializers.CharField()
15 supplier_slug = serializers.CharField()
16 supplier_name = serializers.CharField()
19class SearchResultSerializer(serializers.Serializer):
20 """Serializer for a search result."""
22 class Meta:
23 """Meta options for the SearchResultSerializer."""
25 fields = [
26 'id',
27 'sku',
28 'name',
29 'exact',
30 'description',
31 'price',
32 'link',
33 'image_url',
34 'existing_part_id',
35 ]
36 read_only_fields = fields
38 id = serializers.CharField()
39 sku = serializers.CharField()
40 name = serializers.CharField()
41 exact = serializers.BooleanField()
42 description = serializers.CharField()
43 price = serializers.CharField()
44 link = serializers.CharField()
45 image_url = serializers.CharField()
46 existing_part_id = serializers.SerializerMethodField()
48 def get_existing_part_id(self, value) -> Optional[int]:
49 """Return the ID of the existing part if available."""
50 return getattr(value.existing_part, 'pk', None)
53class ImportParameterSerializer(serializers.Serializer):
54 """Serializer for a ImportParameter."""
56 class Meta:
57 """Meta options for the ImportParameterSerializer."""
59 fields = ['name', 'value', 'parameter_template', 'on_category']
61 name = serializers.CharField()
62 value = serializers.CharField()
63 parameter_template = serializers.SerializerMethodField()
64 on_category = serializers.BooleanField()
66 def get_parameter_template(self, value) -> Optional[int]:
67 """Return the ID of the parameter template if available."""
68 return getattr(value.parameter_template, 'pk', None)
71class ImportRequestSerializer(serializers.Serializer):
72 """Serializer for the import request."""
74 plugin = serializers.CharField(required=True)
75 supplier = serializers.CharField(required=True)
76 part_import_id = serializers.CharField(required=True)
77 category_id = serializers.PrimaryKeyRelatedField(
78 queryset=part_models.PartCategory.objects.all(),
79 many=False,
80 required=False,
81 allow_null=True,
82 )
83 part_id = serializers.PrimaryKeyRelatedField(
84 queryset=part_models.Part.objects.all(),
85 many=False,
86 required=False,
87 allow_null=True,
88 )
91class ImportResultSerializer(serializers.Serializer):
92 """Serializer for the import result."""
94 class Meta:
95 """Meta options for the ImportResultSerializer."""
97 fields = [
98 'part_id',
99 'part_detail',
100 'manufacturer_part_id',
101 'supplier_part_id',
102 'pricing',
103 'parameters',
104 ]
106 part_id = serializers.IntegerField()
107 part_detail = PartSerializer()
108 manufacturer_part_id = serializers.IntegerField()
109 supplier_part_id = serializers.IntegerField()
110 pricing = serializers.SerializerMethodField()
111 parameters = ImportParameterSerializer(many=True)
113 def get_pricing(self, value: Any) -> list[tuple[float, str]]:
114 """Return the pricing data as a dictionary."""
115 return value['pricing']