# What this PR does Fixes calculating number of oncall users per team for `team` api endpoint ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required)
59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
import typing
|
|
|
|
from rest_framework import serializers
|
|
|
|
from apps.schedules.ical_utils import SchedulesOnCallUsers
|
|
from apps.user_management.models import Team
|
|
|
|
|
|
class TeamSerializerContext(typing.TypedDict):
|
|
schedules_with_oncall_users: SchedulesOnCallUsers
|
|
|
|
|
|
class FastTeamSerializer(serializers.ModelSerializer):
|
|
id = serializers.CharField(read_only=True, source="public_primary_key")
|
|
|
|
class Meta:
|
|
model = Team
|
|
fields = ["id", "name", "email", "avatar_url"]
|
|
|
|
|
|
class TeamSerializer(serializers.ModelSerializer):
|
|
id = serializers.CharField(read_only=True, source="public_primary_key")
|
|
|
|
class Meta:
|
|
model = Team
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"email",
|
|
"avatar_url",
|
|
"is_sharing_resources_to_all",
|
|
]
|
|
|
|
read_only_fields = [
|
|
"id",
|
|
"name",
|
|
"email",
|
|
"avatar_url",
|
|
]
|
|
|
|
|
|
class TeamLongSerializer(TeamSerializer):
|
|
context: TeamSerializerContext
|
|
|
|
number_of_users_currently_oncall = serializers.SerializerMethodField()
|
|
|
|
class Meta(TeamSerializer.Meta):
|
|
fields = TeamSerializer.Meta.fields + [
|
|
"number_of_users_currently_oncall",
|
|
]
|
|
|
|
def get_number_of_users_currently_oncall(self, obj: Team) -> int:
|
|
oncall_users = set()
|
|
|
|
for schedule, users in self.context["schedules_with_oncall_users"].items():
|
|
if schedule.team == obj:
|
|
oncall_users |= set(users)
|
|
|
|
return len(oncall_users)
|