this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add extension render override

+59 -9
+38
care/emr/extensions/validator.py
··· 1 1 from pydantic import field_validator 2 2 3 + from care.emr.registries.extensions.registry import ExtensionRegistry 4 + 3 5 4 6 def validate_extensions(data, resource_type): 5 7 from care.emr.registries.extensions.registry import ExtensionRegistry ··· 30 32 except Exception as e: 31 33 raise ValueError("Invalid extensions") from e 32 34 return v 35 + 36 + 37 + class ExtensionListRenderer: 38 + extensions: dict = {} 39 + 40 + @classmethod 41 + def serialize_extensions(cls, handler, data, obj): 42 + return handler.deserialize_extensions_list(data, obj) 43 + 44 + @classmethod 45 + def perform_extra_serialization(cls, mapping, obj, *args, **kwargs): 46 + if mapping.get("_extensions_rendered"): 47 + return super().perform_extra_serialization(mapping, obj, *args, **kwargs) 48 + data = {} 49 + for key in obj.extensions: 50 + extension_handler = ExtensionRegistry.get_extension_obj( 51 + cls.___extension_resource_type__.value, key 52 + ) 53 + if extension_handler is None: 54 + # TODO: Once stable, raise error instead 55 + data[key] = obj.extensions[key] 56 + data[key] = cls.serialize_extensions( 57 + extension_handler, obj.extensions[key], obj 58 + ) 59 + 60 + mapping["extensions"] = data 61 + mapping["_extensions_rendered"] = True 62 + return super().perform_extra_serialization(mapping, obj, *args, **kwargs) 63 + 64 + 65 + class ExtensionRetrieveRenderer(ExtensionListRenderer): 66 + extensions: dict = {} 67 + 68 + @classmethod 69 + def serialize_extensions(cls, handler, data, obj): 70 + return handler.deserialize_extensions_retrieve(data, obj)
+3 -2
care/emr/resources/inventory/supply_delivery/delivery_order.py
··· 5 5 from rest_framework.exceptions import ValidationError 6 6 7 7 from care.emr.extensions.base import ExtensionResource 8 - from care.emr.extensions.validator import ExtensionValidator 8 + from care.emr.extensions.validator import ExtensionListRenderer, ExtensionValidator 9 9 from care.emr.models.location import FacilityLocation 10 10 from care.emr.models.organization import Organization 11 11 from care.emr.models.patient import Patient ··· 83 83 return obj 84 84 85 85 86 - class SupplyDeliveryOrderReadSpec(BaseSupplyDeliveryOrderSpec): 86 + class SupplyDeliveryOrderReadSpec(ExtensionListRenderer, BaseSupplyDeliveryOrderSpec): 87 87 origin: dict | None = None 88 88 destination: dict 89 89 supplier: dict | None = None ··· 112 112 if obj.patient_invoice: 113 113 mapping["patient_invoice_id"] = str(obj.patient_invoice.external_id) 114 114 cls.serialize_audit_users(mapping, obj) 115 + return super().perform_extra_serialization(mapping, obj)
+8 -4
care/emr/resources/inventory/supply_delivery/spec.py
··· 5 5 from pydantic import UUID4, Field, model_validator 6 6 7 7 from care.emr.extensions.base import ExtensionResource 8 - from care.emr.extensions.validator import ExtensionValidator 8 + from care.emr.extensions.validator import ( 9 + ExtensionListRenderer, 10 + ExtensionRetrieveRenderer, 11 + ExtensionValidator, 12 + ) 9 13 from care.emr.models.inventory_item import InventoryItem 10 14 from care.emr.models.product import Product 11 15 from care.emr.models.supply_delivery import DeliveryOrder, SupplyDelivery ··· 133 137 return obj 134 138 135 139 136 - class SupplyDeliveryReadSpec(BaseSupplyDeliverySpec): 140 + class SupplyDeliveryReadSpec(ExtensionListRenderer, BaseSupplyDeliverySpec): 137 141 """Supply delivery read specification""" 138 142 139 143 supplied_item_quantity: int ··· 161 165 mapping["supply_request"] = SupplyRequestReadSpec.serialize( 162 166 obj.supply_request 163 167 ).to_json() 164 - 168 + return super().perform_extra_serialization(mapping, obj) 165 169 166 - class SupplyDeliveryRetrieveSpec(SupplyDeliveryReadSpec): 170 + class SupplyDeliveryRetrieveSpec(ExtensionRetrieveRenderer, SupplyDeliveryReadSpec): 167 171 """Supply delivery retrieve specification""" 168 172 169 173 created_by: UserSpec = {}
+10 -3
care/emr/resources/patient/spec.py
··· 8 8 from pydantic import UUID4, BaseModel, Field, field_validator, model_validator 9 9 10 10 from care.emr.extensions.base import ExtensionResource 11 - from care.emr.extensions.validator import ExtensionValidator 11 + from care.emr.extensions.validator import ( 12 + ExtensionListRenderer, 13 + ExtensionRetrieveRenderer, 14 + ExtensionValidator, 15 + ) 12 16 from care.emr.models import Organization 13 17 from care.emr.models.patient import ( 14 18 Patient, ··· 207 211 return identifiers 208 212 209 213 210 - class PatientListSpec(PatientBaseSpec): 214 + class PatientListSpec(ExtensionListRenderer, PatientBaseSpec): 211 215 date_of_birth: datetime.date | None = None 212 216 year_of_birth: datetime.date | None = None 213 217 ··· 225 229 mapping["facility_tags"] = PatientFacilityTagManager( 226 230 kwargs["facility"] 227 231 ).render_tags(obj) 232 + super().perform_extra_serialization(mapping, obj, *args, **kwargs) 228 233 229 234 230 235 class PatientPartialSpec(EMRResource): ··· 247 252 value: str 248 253 249 254 250 - class PatientRetrieveSpec(PatientListSpec, PatientPermissionsMixin): 255 + class PatientRetrieveSpec( 256 + ExtensionRetrieveRenderer, PatientListSpec, PatientPermissionsMixin 257 + ): 251 258 geo_organization: dict = {} 252 259 253 260 created_by: dict | None = None