Coverage for apps/products/serializers.py: 99%

53 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2024-04-30 13:30 -0600

1from djmoney.serializers import MoneyField 

2from rest_framework import serializers 

3from rest_polymorphic.serializers import PolymorphicSerializer 

4 

5from base.mixins import ToRepresentationMixin 

6 

7from .models import ( 

8 ConsultationProduct, 

9 HospitalizationProduct, 

10 ProcedureProduct, 

11 Product, 

12 ProductOrganizationPrice, 

13 SellableProduct, 

14 SurgicalProduct, 

15) 

16 

17BASE_PRODUCT_READ_ONLY_FIELDS = ["random_slug", "created_at"] 

18BASE_PRODUCT_FIELDS = ["practitioner", "name", "is_active", "ordering"] 

19 

20 

21class BasicProductSerializer(serializers.ModelSerializer): 

22 """ 

23 Serializer for Product with minimum data 

24 """ 

25 

26 class Meta: 

27 model = Product 

28 read_only_fields = ["random_slug", "name"] 

29 fields = read_only_fields + [] 

30 

31 

32class ProductOrganizationPriceSerializer(ToRepresentationMixin): 

33 """ 

34 Serializer for Porduct Organization Price 

35 """ 

36 

37 REPRESENTATION_FIELDS = [["product", BasicProductSerializer, False]] 

38 

39 price = MoneyField(max_digits=14, decimal_places=2) 

40 hard_cost = MoneyField(max_digits=14, decimal_places=2) 

41 shared_cost = MoneyField(max_digits=14, decimal_places=2) 

42 

43 class Meta: 

44 model = ProductOrganizationPrice 

45 read_only_fields = ["random_slug", "created_at"] 

46 fields = read_only_fields + [ 

47 "product", 

48 "organization", 

49 "price", 

50 "price_currency", 

51 "hard_cost", 

52 "hard_cost_currency", 

53 "shared_cost", 

54 "shared_cost_currency", 

55 "is_active", 

56 ] 

57 extra_kwargs = {"product": {"write_only": True}} 

58 

59 

60class BaseProductSerializer(ToRepresentationMixin): 

61 """ 

62 Base model serializer for Product 

63 """ 

64 

65 REPRESENTATION_FIELDS = [["prices", ProductOrganizationPriceSerializer, True]] 

66 

67 class Meta: 

68 read_only_fields = BASE_PRODUCT_READ_ONLY_FIELDS 

69 fields = read_only_fields + BASE_PRODUCT_FIELDS 

70 

71 def create(self, validated_data): 

72 

73 """ 

74 # Validate for free practitioners 

75 practitioner = validated_data.get("practitioner", None) 

76 if not practitioner.is_paid: 

77 products = Product.objects.filter( 

78 practitioner=practitioner, 

79 ) 

80 if products.count() > 0: 

81 raise serializers.ValidationError("Free user usage limit exceded (more than 1 product on dataabase)") 

82 """ 

83 

84 return super().create(validated_data) 

85 

86 

87class ConsultationProductSerializer(BaseProductSerializer): 

88 class Meta(BaseProductSerializer.Meta): 

89 model = ConsultationProduct 

90 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS + ["duration"] 

91 

92 

93class ProcedureProductSerializer(BaseProductSerializer): 

94 class Meta(BaseProductSerializer.Meta): 

95 model = ProcedureProduct 

96 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS 

97 

98 

99class SellableProductSerializer(BaseProductSerializer): 

100 class Meta(BaseProductSerializer.Meta): 

101 model = SellableProduct 

102 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS 

103 

104 

105class SurgicalProductSerializer(BaseProductSerializer): 

106 class Meta(BaseProductSerializer.Meta): 

107 model = SurgicalProduct 

108 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS 

109 

110 

111class HospitalizationProductSerializer(BaseProductSerializer): 

112 class Meta(BaseProductSerializer.Meta): 

113 model = HospitalizationProduct 

114 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS 

115 

116 

117class PolymorphicProductSerializer(PolymorphicSerializer): 

118 class Meta: 

119 model = Product 

120 

121 model_serializer_mapping = { 

122 ConsultationProduct: ConsultationProductSerializer, 

123 ProcedureProduct: ProcedureProductSerializer, 

124 SellableProduct: SellableProductSerializer, 

125 SurgicalProduct: SurgicalProductSerializer, 

126 HospitalizationProduct: HospitalizationProductSerializer, 

127 }