diff --git a/api/serializers/__init__.py b/api/serializers/__init__.py index 64d601cd..ae159ba6 100644 --- a/api/serializers/__init__.py +++ b/api/serializers/__init__.py @@ -10,6 +10,7 @@ OfficeWorkspaceSerializer, TeamDetailedSerializer, TeamSerializer, + OfficeWorkspaceDetailSerializer, ) from .assets import ( # noqa: F401 # isort:skip AllocationsSerializer, diff --git a/api/serializers/andela_centres.py b/api/serializers/andela_centres.py index dce0bcca..020bf24f 100644 --- a/api/serializers/andela_centres.py +++ b/api/serializers/andela_centres.py @@ -109,6 +109,35 @@ def get_long_name(self, obj): return long_name +class OfficeWorkspaceDetailSerializer(serializers.ModelSerializer): + assets_assigned = serializers.SerializerMethodField() + + class Meta: + model = models.OfficeWorkspace + fields = ("id", "name", "floor", "block", "workspaces", "assets_assigned") + + def get_assets_assigned(self, obj): + """This method returns assets assigned to a particuluar workspace + Args: + obj (object): current object instance being fetched + Returns: + json : serialized assets belonging to the specified workspace + """ + + from api.serializers.assets import WorkspaceAssetSerializer + + workspace_assigned = models.AssetAssignee.objects.filter( + asset_location_id=obj.id + ).first() + assets = models.Asset.objects.filter(assigned_to=workspace_assigned) + page = self.context["view"].paginate_queryset(assets) + serialized_assets = WorkspaceAssetSerializer(page, many=True) + paginated_assets = self.context["view"].get_paginated_response( + serialized_assets.data + ) + return paginated_assets.data + + class DepartmentSerializer(serializers.ModelSerializer): number_of_assets = serializers.SerializerMethodField() @@ -204,7 +233,7 @@ class Meta: class TeamSerializer(serializers.ModelSerializer): class Meta: model = models.DepartmentalTeam - fields = ('name', 'description', 'department') + fields = ("name", "description", "department") class TeamDetailedSerializer(serializers.ModelSerializer): @@ -214,7 +243,7 @@ class TeamDetailedSerializer(serializers.ModelSerializer): class Meta: model = models.DepartmentalTeam - fields = ('name', 'description', 'department', 'members', 'assets_assigned') + fields = ("name", "description", "department", "members", "assets_assigned") def get_assets_assigned(self, obj): """ diff --git a/api/serializers/assets.py b/api/serializers/assets.py index 443f7ef8..8fb6f2bc 100644 --- a/api/serializers/assets.py +++ b/api/serializers/assets.py @@ -577,3 +577,11 @@ class Meta: "incident_report_state", "asset_state_from_report", ) + + +class WorkspaceAssetSerializer(serializers.ModelSerializer): + asset_type = serializers.ReadOnlyField() + + class Meta: + model = models.Asset + fields = ("uuid", "asset_category", "serial_number", "asset_code", "asset_type") diff --git a/api/urls.py b/api/urls.py index 865c4300..41096d00 100644 --- a/api/urls.py +++ b/api/urls.py @@ -36,6 +36,7 @@ OfficeBlockViewSet, OfficeFloorSectionViewSet, OfficeFloorViewSet, + OfficeWorkspaceDetailViewSet, OfficeWorkspaceViewSet, SecurityUserViewSet, StateTransitionViewset, @@ -86,6 +87,7 @@ def __init__(self, trailing_slash="/?"): router.register("asset-types", AssetTypeViewSet, "asset-types") router.register("incidence-reports", AssetIncidentReportViewSet, "incidence-reports") router.register("manage-assets", ManageAssetViewSet, "manage-assets") +router.register("workspace-detail", OfficeWorkspaceDetailViewSet, "workspace-detail") router.register( "slack-incidence-reports", AssetSlackIncidentReportViewSet, diff --git a/api/views/andela_centres.py b/api/views/andela_centres.py index 580b9ee0..ab3015d0 100644 --- a/api/views/andela_centres.py +++ b/api/views/andela_centres.py @@ -21,6 +21,7 @@ OfficeFloorSectionDetailSerializer, OfficeFloorSectionSerializer, OfficeFloorSerializer, + OfficeWorkspaceDetailSerializer, OfficeWorkspaceSerializer, ) from api.serializers.andela_centres import TeamDetailedSerializer, TeamSerializer @@ -128,6 +129,11 @@ class OfficeWorkspaceViewSet(ModelViewSet): permission_classes = [IsAuthenticated, IsAdminUser] authentication_classes = [FirebaseTokenAuthentication] + def get_serializer_class(self): + if self.action == "retrieve": + return OfficeWorkspaceDetailSerializer + return OfficeWorkspaceSerializer + def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) @@ -162,3 +168,13 @@ def get_serializer_class(self): if self.action == "retrieve": return TeamDetailedSerializer return TeamSerializer + + +class OfficeWorkspaceDetailViewSet(ModelViewSet): + serializer_class = OfficeWorkspaceDetailSerializer + queryset = models.OfficeWorkspace.objects.all() + permission_classes = [IsAuthenticated, IsAdminUser] + authentication_classes = [FirebaseTokenAuthentication] + + def get_serializer_class(self): + return OfficeWorkspaceDetailSerializer