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
« 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
5from base.mixins import ToRepresentationMixin
7from .models import (
8 ConsultationProduct,
9 HospitalizationProduct,
10 ProcedureProduct,
11 Product,
12 ProductOrganizationPrice,
13 SellableProduct,
14 SurgicalProduct,
15)
17BASE_PRODUCT_READ_ONLY_FIELDS = ["random_slug", "created_at"]
18BASE_PRODUCT_FIELDS = ["practitioner", "name", "is_active", "ordering"]
21class BasicProductSerializer(serializers.ModelSerializer):
22 """
23 Serializer for Product with minimum data
24 """
26 class Meta:
27 model = Product
28 read_only_fields = ["random_slug", "name"]
29 fields = read_only_fields + []
32class ProductOrganizationPriceSerializer(ToRepresentationMixin):
33 """
34 Serializer for Porduct Organization Price
35 """
37 REPRESENTATION_FIELDS = [["product", BasicProductSerializer, False]]
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)
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}}
60class BaseProductSerializer(ToRepresentationMixin):
61 """
62 Base model serializer for Product
63 """
65 REPRESENTATION_FIELDS = [["prices", ProductOrganizationPriceSerializer, True]]
67 class Meta:
68 read_only_fields = BASE_PRODUCT_READ_ONLY_FIELDS
69 fields = read_only_fields + BASE_PRODUCT_FIELDS
71 def create(self, validated_data):
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 """
84 return super().create(validated_data)
87class ConsultationProductSerializer(BaseProductSerializer):
88 class Meta(BaseProductSerializer.Meta):
89 model = ConsultationProduct
90 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS + ["duration"]
93class ProcedureProductSerializer(BaseProductSerializer):
94 class Meta(BaseProductSerializer.Meta):
95 model = ProcedureProduct
96 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS
99class SellableProductSerializer(BaseProductSerializer):
100 class Meta(BaseProductSerializer.Meta):
101 model = SellableProduct
102 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS
105class SurgicalProductSerializer(BaseProductSerializer):
106 class Meta(BaseProductSerializer.Meta):
107 model = SurgicalProduct
108 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS
111class HospitalizationProductSerializer(BaseProductSerializer):
112 class Meta(BaseProductSerializer.Meta):
113 model = HospitalizationProduct
114 fields = BaseProductSerializer.Meta.read_only_fields + BASE_PRODUCT_FIELDS
117class PolymorphicProductSerializer(PolymorphicSerializer):
118 class Meta:
119 model = Product
121 model_serializer_mapping = {
122 ConsultationProduct: ConsultationProductSerializer,
123 ProcedureProduct: ProcedureProductSerializer,
124 SellableProduct: SellableProductSerializer,
125 SurgicalProduct: SurgicalProductSerializer,
126 HospitalizationProduct: HospitalizationProductSerializer,
127 }