models 源代码
import json
from typing import List, Dict, Any, Optional
from pydantic import BaseModel, Field
[文档]
class Room(BaseModel):
"""教室信息模型"""
address: str
"""教室地址"""
building: str
"""所在建筑"""
code: str
"""教室代码"""
id: int
"""教室ID"""
latitude: str = Field(default="")
"""纬度"""
longitude: str = Field(default="")
"""经度"""
name: str
"""教室名称"""
[文档]
class LoginResult(BaseModel):
"""登录结果模型"""
success: bool
"""登录是否成功"""
usercode: str
"""学号"""
name: str
"""用户姓名"""
user_token: str
"""用户 Token"""
refresh_token: str
"""刷新 Token"""
dynamic_secret: str
"""动态 Secret"""
dynamic_token: str
"""动态 Token"""
biz_type_id: int
"""业务类型 ID,区分本科生与研究生"""
current_semester_id: int
"""当前学期 ID"""
[文档]
class Teacher(BaseModel):
"""教师信息模型"""
code: str
"""教师代码"""
id: int
"""教师ID"""
name: str
"""教师姓名"""
[文档]
class Course(BaseModel):
"""单个课程信息模型"""
course_code: str
"""课程代码"""
course_name: str
"""课程名称"""
date: str
"""上课日期,格式为YYYY-MM-DD"""
end_time: str
"""下课时间,格式为HH:MM"""
end_unit: int
"""结束节次"""
lesson_id: int
"""课程ID"""
lesson_no: str
"""课程编号"""
rooms: List[Room]
"""教室信息列表"""
start_time: str
"""上课时间,格式为HH:MM"""
start_unit: int
"""开始节次"""
teachclass_std_count: int
"""班级学生数量"""
teachers: List[Teacher]
"""教师信息列表"""
weeks: str
"""周次"""
weekstate: str
"""周状态"""
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(self.model_dump(), ensure_ascii=False, indent=indent)
[文档]
class Courses(BaseModel):
"""课程列表模型"""
courses: List[Course] = Field(default_factory=list, description="课程列表")
def __len__(self) -> int:
return len(self.courses)
def __getitem__(self, index):
return self.courses[index]
def __iter__(self):
return iter(self.courses)
[文档]
@classmethod
def from_list(cls, courses_list: List[Dict[str, Any]]) -> "Courses":
"""从课程列表创建Courses对象"""
return cls(courses=[Course(**course) for course in courses_list])
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(
[course.model_dump() for course in self.courses],
ensure_ascii=False,
indent=indent,
)
[文档]
def group_by_date(self) -> Dict[str, List[Course]]:
"""按日期分组课程"""
result = {}
for course in self.courses:
if course.date not in result:
result[course.date] = []
result[course.date].append(course)
return result
[文档]
class DeviceParams(BaseModel):
"""设备参数模型"""
deviceName: str
"""设备名称"""
deviceId: str
"""设备ID"""
deviceInfo: str
"""设备信息"""
deviceInfos: str
"""设备详细信息"""
userAgentPrecursor: str
"""用户代理前缀"""
[文档]
class OnlineDevice(BaseModel):
"""在线设备信息模型"""
brasid: str
"""BRAS ID"""
downFlow: str
"""下行流量"""
hostName: str = ""
"""主机名"""
ip: str
"""IP地址"""
loginTime: str
"""登录时间,格式为YYYY-MM-DD HH:MM:SS"""
mac: str
"""MAC地址"""
sessionId: str
"""会话ID"""
terminalType: str
"""终端类型"""
upFlow: str
"""上行流量"""
useTime: str
"""使用时间(秒)"""
userId: int
"""用户ID"""
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(self.model_dump(), ensure_ascii=False, indent=indent)
[文档]
class OnlineDevices(BaseModel):
"""在线设备列表模型"""
devices: List[OnlineDevice] = Field(
default_factory=list, description="在线设备列表"
)
def __len__(self) -> int:
return len(self.devices)
def __getitem__(self, index):
return self.devices[index]
def __iter__(self):
return iter(self.devices)
[文档]
@classmethod
def from_list(cls, devices_list: List[Dict[str, Any]]) -> "OnlineDevices":
"""从设备列表创建OnlineDevices对象"""
return cls(devices=[OnlineDevice(**device) for device in devices_list])
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(
[device.model_dump() for device in self.devices],
ensure_ascii=False,
indent=indent,
)
[文档]
class RoomOccupancy(BaseModel):
"""教室占用信息模型"""
building_code: str
"""建筑代码"""
building_name: str
"""建筑名称"""
campus_code: str
"""校区代码"""
campus_name: str
"""校区名称"""
floor: str
"""楼层"""
occupy_units: str
"""占用单元,字符串形式的二进制表示(1表示占用,0表示空闲)"""
room_capacity: int
"""教室容量"""
room_code: str
"""教室代码"""
room_id: str
"""教室ID"""
room_name: str
"""教室名称"""
room_type: str
"""教室类型"""
[文档]
class RoomOccupancyData(BaseModel):
"""教室占用数据模型"""
date: str
"""日期,格式为YYYY-MM-DD"""
max_unit: int
"""最大单元数(一天中的时间段总数)"""
rooms: List[RoomOccupancy]
"""教室占用信息列表"""
def __len__(self) -> int:
return len(self.rooms)
def __getitem__(self, index):
return self.rooms[index]
def __iter__(self):
return iter(self.rooms)
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(self.model_dump(), ensure_ascii=False, indent=indent)
[文档]
def get_available_rooms(self, unit_index: int) -> List[RoomOccupancy]:
"""获取指定时间单元可用的教室列表
:param unit_index: 时间单元索引(从1开始)
:return: 可用教室列表
:rtype: List[RoomOccupancy]
:raises ValueError: 如果时间单元索引超出范围
"""
if unit_index < 1 or unit_index > self.max_unit:
raise ValueError(f"时间单元索引必须在1到{self.max_unit}之间")
available_rooms = []
for room in self.rooms:
# 检查对应位置的字符是否为'0'(表示空闲)
if (
unit_index < len(room.occupy_units)
and room.occupy_units[unit_index - 1] == "0"
):
available_rooms.append(room)
return available_rooms
[文档]
class Semester(BaseModel):
"""学期模型"""
code: str
"""学期号"""
end_date: str
"""学期结束日期"""
id: str
"""学期 ID"""
name: str
"""学期名"""
season: str
"""学期季节"""
start_date: str
"""学期开始日期"""
week_start_day: int
"""学期周起始日"""
year: str
"""学期年份"""
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(self.model_dump(), ensure_ascii=False, indent=indent)
[文档]
class SemesterData(BaseModel):
"""学期数据模型"""
cur_semester_id: int
"""默认学期ID"""
semesters: List[Semester]
"""学期列表"""
def __len__(self) -> int:
return len(self.semesters)
def __getitem__(self, index):
return self.semesters[index]
def __iter__(self):
return iter(self.semesters)
[文档]
def dump_json(self, indent: Optional[int] = None) -> str:
"""格式化为JSON字符串"""
return json.dumps(self.model_dump(), ensure_ascii=False, indent=indent)