File size: 1,207 Bytes
7361291
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# api/models.py
from __future__ import annotations
from typing import List, Optional, Literal
from pydantic import BaseModel, Field


class PersonContact(BaseModel):
  name: str = "N/A"
  email: str = ""


class CourseDirectoryItem(BaseModel):
  id: str
  name: str
  instructor: PersonContact = Field(default_factory=PersonContact)
  teachingAssistant: PersonContact = Field(default_factory=PersonContact)


class WorkspaceMember(BaseModel):
  id: str
  name: str
  email: Optional[str] = ""
  role: Optional[Literal["owner", "member"]] = "member"


class WorkspaceCourseRef(BaseModel):
  id: Optional[str] = None
  name: Optional[str] = None
  instructor: Optional[PersonContact] = None
  teachingAssistant: Optional[PersonContact] = None


class Workspace(BaseModel):
  id: str
  type: Literal["individual", "group"]
  category: Optional[Literal["course", "personal"]] = None

  # ✅ Group Name:前端要编辑的 groupName 就用 name
  name: Optional[str] = None

  # ✅ Group #
  groupNo: Optional[int] = None

  # ✅ Members
  members: List[WorkspaceMember] = Field(default_factory=list)

  # ✅ Course binding
  courseId: Optional[str] = None
  courseInfo: Optional[WorkspaceCourseRef] = None