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

1"""Serializer definitions for the supplier plugin base.""" 

2 

3from typing import Any, Optional 

4 

5from rest_framework import serializers 

6 

7import part.models as part_models 

8from part.serializers import PartSerializer 

9 

10 

11class SupplierListSerializer(serializers.Serializer): 

12 """Serializer for a supplier plugin.""" 

13 

14 plugin_slug = serializers.CharField() 

15 supplier_slug = serializers.CharField() 

16 supplier_name = serializers.CharField() 

17 

18 

19class SearchResultSerializer(serializers.Serializer): 

20 """Serializer for a search result.""" 

21 

22 class Meta: 

23 """Meta options for the SearchResultSerializer.""" 

24 

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 

37 

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() 

47 

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) 

51 

52 

53class ImportParameterSerializer(serializers.Serializer): 

54 """Serializer for a ImportParameter.""" 

55 

56 class Meta: 

57 """Meta options for the ImportParameterSerializer.""" 

58 

59 fields = ['name', 'value', 'parameter_template', 'on_category'] 

60 

61 name = serializers.CharField() 

62 value = serializers.CharField() 

63 parameter_template = serializers.SerializerMethodField() 

64 on_category = serializers.BooleanField() 

65 

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) 

69 

70 

71class ImportRequestSerializer(serializers.Serializer): 

72 """Serializer for the import request.""" 

73 

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 ) 

89 

90 

91class ImportResultSerializer(serializers.Serializer): 

92 """Serializer for the import result.""" 

93 

94 class Meta: 

95 """Meta options for the ImportResultSerializer.""" 

96 

97 fields = [ 

98 'part_id', 

99 'part_detail', 

100 'manufacturer_part_id', 

101 'supplier_part_id', 

102 'pricing', 

103 'parameters', 

104 ] 

105 

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) 

112 

113 def get_pricing(self, value: Any) -> list[tuple[float, str]]: 

114 """Return the pricing data as a dictionary.""" 

115 return value['pricing']