diff --git a/care/facility/api/viewsets/facility_users.py b/care/facility/api/viewsets/facility_users.py index fc8c4ecb86..2fc1e751a5 100644 --- a/care/facility/api/viewsets/facility_users.py +++ b/care/facility/api/viewsets/facility_users.py @@ -1,3 +1,5 @@ +from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Prefetch from django_filters import rest_framework as filters from rest_framework import mixins from rest_framework.exceptions import ValidationError @@ -6,12 +8,14 @@ from care.facility.models.facility import Facility from care.users.api.serializers.user import UserAssignedSerializer -from care.users.models import User +from care.users.models import Skill, User class UserFilter(filters.FilterSet): - user_type = filters.TypedChoiceFilter(choices=[(key, key) for key in User.TYPE_VALUE_MAP.keys()], - coerce=lambda role: User.TYPE_VALUE_MAP[role]) + user_type = filters.TypedChoiceFilter( + choices=[(key, key) for key in User.TYPE_VALUE_MAP.keys()], + coerce=lambda role: User.TYPE_VALUE_MAP[role], + ) class Meta: model = User @@ -21,13 +25,17 @@ class Meta: class FacilityUserViewSet(GenericViewSet, mixins.ListModelMixin): serializer_class = UserAssignedSerializer filterset_class = UserFilter - queryset = User.objects.all() + queryset = User.objects.all().prefetch_related( + Prefetch("skills", queryset=Skill.objects.filter(userskill__deleted=False)) + ) permission_classes = [IsAuthenticated] filter_backends = [filters.DjangoFilterBackend] def get_queryset(self): try: - facility = Facility.objects.get(external_id=self.kwargs.get("facility_external_id")) + facility = Facility.objects.get( + external_id=self.kwargs.get("facility_external_id") + ) return facility.users.filter(deleted=False).order_by("-last_login") - except: + except ObjectDoesNotExist: raise ValidationError({"Facility": "Facility not found"}) diff --git a/care/users/api/serializers/user.py b/care/users/api/serializers/user.py index e3b0edc0db..f3d418af3d 100644 --- a/care/users/api/serializers/user.py +++ b/care/users/api/serializers/user.py @@ -358,11 +358,7 @@ class UserAssignedSerializer(serializers.ModelSerializer): home_facility_object = FacilityBareMinimumSerializer( source="home_facility", read_only=True ) - skills = serializers.SerializerMethodField() - - def get_skills(self, obj): - qs = obj.skills.filter(userskill__deleted=False) - return SkillSerializer(qs, many=True).data + skills = SkillSerializer(many=True, read_only=True) class Meta: model = User