diff --git a/care/facility/api/serializers/daily_round.py b/care/facility/api/serializers/daily_round.py index f6d350fe8c..dca90222aa 100644 --- a/care/facility/api/serializers/daily_round.py +++ b/care/facility/api/serializers/daily_round.py @@ -7,7 +7,9 @@ from rest_framework.exceptions import ValidationError from rest_framework.generics import get_object_or_404 +from care.facility.api.serializers.bed import BedSerializer from care.facility.models import CATEGORY_CHOICES, PatientRegistration +from care.facility.models.bed import Bed from care.facility.models.daily_round import DailyRound from care.facility.models.notification import Notification from care.facility.models.patient_base import ADMIT_CHOICES, CURRENT_HEALTH_CHOICES, SYMPTOM_CHOICES @@ -52,6 +54,10 @@ class DailyRoundSerializer(serializers.ModelSerializer): last_edited_by = UserBaseMinimumSerializer(read_only=True) created_by = UserBaseMinimumSerializer(read_only=True) + bed_object = BedSerializer(read_only=True) + + bed = serializers.UUIDField(source="bed.external_id", allow_null=True, required=False) + class Meta: model = DailyRound read_only_fields = ( @@ -172,4 +178,13 @@ def validate(self, obj): if validated["review_time"] <= 0: raise ValidationError({"review_time": [f"This field value is must be greater than 0."]}) + if "bed" in validated: + external_id = validated.pop("bed")["external_id"] + if external_id: + # TODO add authorisation checks + bed_object = Bed.objects.filter(external_id=external_id).first() + if not bed_object: + raise ValidationError({"bed": [f"Obeject not found."]}) + validated["bed_id"] = bed_object.id + return validated diff --git a/care/facility/api/viewsets/bed.py b/care/facility/api/viewsets/bed.py index 0ccf04a1fa..6329e8a8d0 100644 --- a/care/facility/api/viewsets/bed.py +++ b/care/facility/api/viewsets/bed.py @@ -49,9 +49,16 @@ def get_queryset(self): return queryset +class AssetBedFilter(filters.FilterSet): + asset = filters.UUIDFilter(field_name="asset__external_id") + bed = filters.UUIDFilter(field_name="bed__external_id") + + class AssetBedViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, GenericViewSet): queryset = AssetBed.objects.all().select_related("asset", "bed").order_by("-created_date") serializer_class = AssetBedSerializer + filter_backends = (filters.DjangoFilterBackend,) + filterset_class = AssetBedFilter def get_queryset(self): user = self.request.user diff --git a/care/facility/migrations/0280_auto_20211210_0038.py b/care/facility/migrations/0280_auto_20211210_0038.py new file mode 100644 index 0000000000..42e25381bd --- /dev/null +++ b/care/facility/migrations/0280_auto_20211210_0038.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.11 on 2021-12-09 19:08 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('facility', '0279_auto_20211122_1138'), + ] + + operations = [ + migrations.RemoveField( + model_name='historicalpatientregistration', + name='bed', + ), + migrations.RemoveField( + model_name='patientregistration', + name='bed', + ), + migrations.AddField( + model_name='dailyround', + name='bed', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='facility.Bed'), + ), + ] diff --git a/care/facility/models/daily_round.py b/care/facility/models/daily_round.py index 038708a2ba..b966feff41 100644 --- a/care/facility/models/daily_round.py +++ b/care/facility/models/daily_round.py @@ -6,6 +6,7 @@ from multiselectfield import MultiSelectField from care.facility.models import CATEGORY_CHOICES, PatientBaseModel +from care.facility.models.bed import Bed from care.facility.models.json_schema.daily_round import ( BLOOD_PRESSURE, FEED, @@ -124,6 +125,9 @@ class InsulinIntakeFrequencyType(enum.Enum): recommend_discharge = models.BooleanField(default=False, verbose_name="Recommend Discharging Patient") other_details = models.TextField(null=True, blank=True) medication_given = JSONField(default=dict) # To be Used Later on + + bed = models.ForeignKey(Bed, on_delete=models.PROTECT, null=True, blank=True) + # admitted_to is set to be deprecated over the next major release admitted_to = models.IntegerField(choices=ADMIT_CHOICES, default=None, null=True, blank=True) last_updated_by_telemedicine = models.BooleanField(default=False) created_by_telemedicine = models.BooleanField(default=False) @@ -168,24 +172,16 @@ class InsulinIntakeFrequencyType(enum.Enum): ) right_pupil_light_reaction_detail = models.TextField(default=None, null=True, blank=True) glasgow_eye_open = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(1), MaxValueValidator(4)], + default=None, null=True, validators=[MinValueValidator(1), MaxValueValidator(4)], ) glasgow_verbal_response = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(1), MaxValueValidator(5)], + default=None, null=True, validators=[MinValueValidator(1), MaxValueValidator(5)], ) glasgow_motor_response = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(1), MaxValueValidator(6)], + default=None, null=True, validators=[MinValueValidator(1), MaxValueValidator(6)], ) glasgow_total_calculated = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(3), MaxValueValidator(15)], + default=None, null=True, validators=[MinValueValidator(3), MaxValueValidator(15)], ) limb_response_upper_extremity_right = models.IntegerField( choices=LimbResponseChoice, default=LimbResponseType.UNKNOWN.value @@ -200,16 +196,8 @@ class InsulinIntakeFrequencyType(enum.Enum): choices=LimbResponseChoice, default=LimbResponseType.UNKNOWN.value ) bp = JSONField(default=dict, validators=[JSONFieldSchemaValidator(BLOOD_PRESSURE)]) - pulse = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(200)], - ) - resp = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(10), MaxValueValidator(70)], - ) + pulse = models.IntegerField(default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(200)],) + resp = models.IntegerField(default=None, null=True, validators=[MinValueValidator(10), MaxValueValidator(70)],) rhythm = models.IntegerField(choices=RythmnChoice, default=RythmnType.UNKNOWN.value) rhythm_detail = models.TextField(default=None, null=True, blank=True) ventilator_interface = models.IntegerField( @@ -225,58 +213,36 @@ class InsulinIntakeFrequencyType(enum.Enum): validators=[MinValueValidator(0), MaxValueValidator(30)], ) ventilator_pip = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(100)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(100)], ) ventilator_mean_airway_pressure = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(40)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(40)], ) ventilator_resp_rate = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(100)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(100)], ) ventilator_pressure_support = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(40)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(40)], ) ventilator_tidal_volume = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(1000)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(1000)], ) ventilator_oxygen_modality = models.IntegerField( choices=VentilatorOxygenModalityChoice, default=VentilatorOxygenModalityType.UNKNOWN.value ) ventilator_oxygen_modality_oxygen_rate = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(50)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(50)], ) ventilator_oxygen_modality_flow_rate = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(70)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(70)], ) ventilator_fi02 = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(21), MaxValueValidator(100)], + default=None, null=True, validators=[MinValueValidator(21), MaxValueValidator(100)], ) ventilator_spo2 = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(100)], - ) - etco2 = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(200)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(100)], ) + etco2 = models.IntegerField(default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(200)],) bilateral_air_entry = models.BooleanField(default=None, null=True, blank=True) ph = models.DecimalField( decimal_places=2, @@ -286,16 +252,8 @@ class InsulinIntakeFrequencyType(enum.Enum): null=True, validators=[MinValueValidator(0), MaxValueValidator(10)], ) - pco2 = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(10), MaxValueValidator(200)], - ) - po2 = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(10), MaxValueValidator(400)], - ) + pco2 = models.IntegerField(default=None, null=True, validators=[MinValueValidator(10), MaxValueValidator(200)],) + po2 = models.IntegerField(default=None, null=True, validators=[MinValueValidator(10), MaxValueValidator(400)],) hco3 = models.DecimalField( decimal_places=2, max_digits=4, @@ -305,9 +263,7 @@ class InsulinIntakeFrequencyType(enum.Enum): validators=[MinValueValidator(5), MaxValueValidator(80)], ) base_excess = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(-20), MaxValueValidator(20)], + default=None, null=True, validators=[MinValueValidator(-20), MaxValueValidator(20)], ) lactate = models.DecimalField( decimal_places=2, @@ -334,9 +290,7 @@ class InsulinIntakeFrequencyType(enum.Enum): validators=[MinValueValidator(1), MaxValueValidator(10)], ) blood_sugar_level = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(700)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(700)], ) insulin_intake_dose = models.DecimalField( decimal_places=2, @@ -356,14 +310,10 @@ class InsulinIntakeFrequencyType(enum.Enum): output = JSONField(default=list, validators=[JSONFieldSchemaValidator(OUTPUT)]) total_output_calculated = models.DecimalField(decimal_places=2, max_digits=6, blank=True, default=None, null=True) dialysis_fluid_balance = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(5000)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(5000)], ) dialysis_net_balance = models.IntegerField( - default=None, - null=True, - validators=[MinValueValidator(0), MaxValueValidator(5000)], + default=None, null=True, validators=[MinValueValidator(0), MaxValueValidator(5000)], ) pressure_sore = JSONField(default=list, validators=[JSONFieldSchemaValidator(PRESSURE_SORE)]) nursing = JSONField(default=list, validators=[JSONFieldSchemaValidator(NURSING_PROCEDURE)]) diff --git a/care/facility/models/patient.py b/care/facility/models/patient.py index bfaa4a44bc..cd2ab25d22 100644 --- a/care/facility/models/patient.py +++ b/care/facility/models/patient.py @@ -19,7 +19,6 @@ Ward, pretty_boolean, ) -from care.facility.models.bed import Bed from care.facility.models.mixins.permissions.facility import FacilityRelatedPermissionMixin from care.facility.models.mixins.permissions.patient import PatientPermissionMixin from care.facility.models.patient_base import ( @@ -255,10 +254,6 @@ class TestTypeEnum(enum.Enum): null=True, blank=True, verbose_name="Date Patient is Declared Positive" ) - # Organization Attributes - - bed = models.ForeignKey(Bed, on_delete=models.PROTECT, null=True, blank=True) - # Permission Scopes assigned_to = models.ForeignKey(