Coverage for apps/kwai-api/src/kwai_api/v1/portal/trainings/schemas.py: 100%

28 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2024-01-01 00:00 +0000

1"""Schemas for the portal trainings API.""" 

2 

3from typing import Annotated, Set, TypeAlias 

4 

5from kwai_core.json_api import Meta, Relationship, RelationshipList, ResourceMeta 

6from pydantic import BaseModel, Field 

7 

8from kwai_api.schemas.resources import ( 

9 TeamResourceIdentifier, 

10 TrainingResourceIdentifier, 

11 TrainingScheduleResourceIdentifier, 

12) 

13 

14 

15class TeamAttributes(BaseModel): 

16 """Attributes for a team JSON:API resource.""" 

17 

18 name: str 

19 

20 

21class TeamResource(TeamResourceIdentifier): 

22 """A JSON:API resource for a team.""" 

23 

24 attributes: TeamAttributes 

25 

26 

27class TeamDocument(BaseModel): 

28 """A JSON:API document for one training team.""" 

29 

30 data: TeamResource 

31 

32 

33class TeamsDocument(BaseModel): 

34 """A JSON:API document for multiple training teams.""" 

35 

36 meta: Meta 

37 data: list[TeamResource] = Field(default_factory=list) 

38 

39 

40class TrainingScheduleAttributes(BaseModel): 

41 """Schema for training schedule attributes linked to a training.""" 

42 

43 name: str 

44 

45 

46class TrainingScheduleResource(TrainingScheduleResourceIdentifier): 

47 """Schema for a training schedule resource linked to a training.""" 

48 

49 attributes: TrainingScheduleAttributes 

50 

51 

52class TrainingScheduleDocument(BaseModel): 

53 """Document for a training schedule linked to a training.""" 

54 

55 data: TrainingScheduleResource 

56 included: set = Field(default_factory=set) 

57 

58 

59class TrainingText(BaseModel): 

60 """Schema for the content of a training.""" 

61 

62 title: str 

63 summary: str 

64 content: str | None 

65 

66 

67class TrainingEvent(BaseModel): 

68 """Schema for the event information of a training.""" 

69 

70 start_date: str 

71 end_date: str 

72 location: str 

73 cancelled: bool 

74 

75 

76class TrainingAttributes(BaseModel): 

77 """Attributes for training JSON:API resource.""" 

78 

79 texts: list[TrainingText] 

80 event: TrainingEvent 

81 remark: str 

82 

83 

84TeamsRelationship: TypeAlias = RelationshipList[TeamResourceIdentifier] 

85TrainingScheduleRelationship: TypeAlias = Relationship[ 

86 TrainingScheduleResourceIdentifier 

87] 

88 

89 

90class TrainingRelationships(BaseModel): 

91 """Relationships of a training JSON:API resource.""" 

92 

93 teams: TeamsRelationship 

94 schedule: TrainingScheduleRelationship 

95 

96 

97class TrainingResource(TrainingResourceIdentifier): 

98 """A JSON:API resource for a training.""" 

99 

100 meta: ResourceMeta | None = None 

101 attributes: TrainingAttributes 

102 relationships: TrainingRelationships 

103 

104 

105TrainingInclude = Annotated[ 

106 TeamResource | TrainingScheduleResource, 

107 Field(discriminator="type"), 

108] 

109 

110 

111class TrainingDocument(BaseModel): 

112 """A JSON:API document for one training resource.""" 

113 

114 data: TrainingResource 

115 included: Set[TrainingInclude] = Field(default_factory=set) 

116 

117 

118class TrainingsDocument(BaseModel): 

119 """A JSON:API document for one or more training resources.""" 

120 

121 meta: Meta = Field(default_factory=Meta) 

122 data: list[TrainingResource] = Field(default_factory=list) 

123 included: Set[TrainingInclude] = Field(default_factory=set)