···11+from django_filters import rest_framework as filters
12from rest_framework.exceptions import PermissionDenied
33+from rest_framework.generics import get_object_or_404
2435from care.emr.api.viewsets.base import (
46 EMRBaseViewSet,
···1315 ObservationDefinitionCreateSpec,
1416 ObservationDefinitionReadSpec,
1517)
1818+from care.facility.models import Facility
1919+from care.security.authorization import AuthorizationController
2020+2121+2222+class ObservationDefinitionFilters(filters.FilterSet):
2323+ facility = filters.UUIDFilter(field_name="facility__external_id")
162417251826class ObservationViewSet(
···2230 pydantic_model = ObservationDefinitionCreateSpec
2331 pydantic_update_model = BaseObservationDefinitionSpec
2432 pydantic_read_model = ObservationDefinitionReadSpec
3333+ filterset_class = ObservationDefinitionFilters
3434+ filter_backends = [filters.DjangoFilterBackend]
25352636 def authorize_create(self, instance):
2727- if not self.request.user.is_superuser:
3737+ """
3838+ Only superusers can create observation definitions that are not facility-specific.
3939+ The user must have permission to create the observation definition in the facility.
4040+ """
4141+ if not instance.facility and not self.request.user.is_superuser:
4242+ raise PermissionDenied("Access Denied to Observation Definition")
4343+ if instance.facility and not AuthorizationController.call(
4444+ "can_write_facility_observation_definition",
4545+ self.request.user,
4646+ instance.facility,
4747+ ):
2848 raise PermissionDenied("Access Denied to Observation Definition")
29493030- def authorize_update(self, instance):
3131- if not self.request.user.is_superuser:
5050+ def authorize_update(self, request_obj, model_instance):
5151+ """
5252+ Only superusers can update observation definitions that are not facility-specific.
5353+ The user must have permission to update the observation definition in the facility.
5454+ """
5555+ if not model_instance.facility and not self.request.user.is_superuser:
5656+ raise PermissionDenied("Access Denied to Observation Definition")
5757+5858+ if model_instance.facility and not AuthorizationController.call(
5959+ "can_write_facility_observation_definition",
6060+ self.request.user,
6161+ model_instance.facility,
6262+ ):
3263 raise PermissionDenied("Access Denied to Observation Definition")
33643465 def get_queryset(self):
3535- if self.request.user.is_superuser:
3636- return self.database_model.objects.all()
3737- return self.database_model.objects.none()
6666+ """
6767+ If no facility filters are applied, all objects must be returned without a facility filter.
6868+ If facility filter is applied, check for read permission and return all inside facility.
6969+ """
7070+ base_queryset = self.database_model.objects.all()
7171+ if "facility" in self.request.GET:
7272+ facility_id = self.request.GET["facility"]
7373+ facility_obj = get_object_or_404(Facility, external_id=facility_id)
7474+ if not AuthorizationController.call(
7575+ "can_list_facility_observation_definition",
7676+ self.request.user,
7777+ facility_obj,
7878+ ):
7979+ raise PermissionDenied("Access Denied to Observation Definition")
8080+ return base_queryset.filter(facility=facility_obj)
8181+ return base_queryset.filter(facility__is_null=True)