Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Medicine Administrations: Add validations to administered_date #1570

Merged
merged 2 commits into from
Sep 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions care/facility/api/serializers/prescription.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.shortcuts import get_object_or_404
from django.utils import timezone
from rest_framework import serializers

from care.facility.models import MedibaseMedicine, MedicineAdministration, Prescription
Expand Down Expand Up @@ -77,6 +78,17 @@ class MedicineAdministrationSerializer(serializers.ModelSerializer):
administered_by = UserBaseMinimumSerializer(read_only=True)
prescription = PrescriptionSerializer(read_only=True)

def validate_administered_date(self, value):
if value > timezone.now():
raise serializers.ValidationError(
"Administered Date cannot be in the future."
)
if self.context["prescription"].created_date > value:
raise serializers.ValidationError(
"Administered Date cannot be before Prescription Date."
)
return value

class Meta:
model = MedicineAdministration
exclude = ("deleted",)
Expand Down
9 changes: 8 additions & 1 deletion care/facility/api/viewsets/prescription.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,14 @@ def discontinue(self, request, *args, **kwargs):
)
def administer(self, request, *args, **kwargs):
prescription_obj = self.get_object()
serializer = MedicineAdministrationSerializer(data=request.data)
if prescription_obj.discontinued:
return Response(
{"error": "Administering discontinued prescriptions is not allowed"},
status=status.HTTP_400_BAD_REQUEST,
)
serializer = MedicineAdministrationSerializer(
data=request.data, context={"prescription": prescription_obj}
)
serializer.is_valid(raise_exception=True)
serializer.save(prescription=prescription_obj, administered_by=request.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)
Expand Down
58 changes: 58 additions & 0 deletions care/facility/tests/test_medicine_administrations_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from django.utils import timezone
from rest_framework import status

from care.facility.models import MedibaseMedicine, Prescription
from care.utils.tests.test_base import TestBase


class MedicineAdministrationsApiTestCase(TestBase):
def setUp(self) -> None:
super().setUp()
self.normal_prescription = self.create_prescription()

def create_prescription(self, **kwargs):
data = {
"consultation": self.create_consultation(),
"medicine": MedibaseMedicine.objects.first(),
"prescription_type": "REGULAR",
"dosage": "1 mg",
"frequency": "OD",
"is_prn": False,
}
return Prescription.objects.create(
**{**data, **kwargs, "prescribed_by": self.user}
)

def test_administer(self):
prescription = self.normal_prescription
res = self.client.post(
f"/api/v1/consultation/{prescription.consultation.external_id}/prescriptions/{prescription.external_id}/administer/",
{"notes": "Test Notes"},
)
self.assertEqual(res.status_code, status.HTTP_201_CREATED)

def test_administer_in_future(self):
prescription = self.normal_prescription
res = self.client.post(
f"/api/v1/consultation/{prescription.consultation.external_id}/prescriptions/{prescription.external_id}/administer/",
{"notes": "Test Notes", "administered_date": "2300-09-01T16:34"},
)
self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)

def test_administer_in_past(self):
prescription = self.normal_prescription
res = self.client.post(
f"/api/v1/consultation/{prescription.consultation.external_id}/prescriptions/{prescription.external_id}/administer/",
{"notes": "Test Notes", "administered_date": "2019-09-01T16:34"},
)
self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)

def test_administer_discontinued(self):
prescription = self.create_prescription(
discontinued=True, discontinued_date=timezone.now()
)
res = self.client.post(
f"/api/v1/consultation/{prescription.consultation.external_id}/prescriptions/{prescription.external_id}/administer/",
{"notes": "Test Notes"},
)
self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
Loading