Files
JITToolBox/module/schema.py
2025-05-20 02:59:58 +08:00

127 lines
3.3 KiB
Python

import random
from typing import Optional
from openpyxl.reader.excel import load_workbook
class Question:
def __init__(self, no: str, topic: str):
self._no: str = no
self._topic: str = topic
def __str__(self):
return f"Question<No: {self._no}, Topic: {self._topic}>"
def __repr__(self):
return self.__str__()
@staticmethod
def load_from_csv(path: Optional[str] = None) -> list['Question']:
questions = []
with open(path if path else '../files/questions.csv', encoding='gbk') as f:
for line in f.readlines():
questions.append(Question(*line.strip('\n').split(',')))
return questions
@staticmethod
def load_from_xls(path: str) -> list['Question']:
questions = []
wb = load_workbook(path, read_only=True)
ws = wb.active
for row in ws.iter_rows(min_col=2, max_col=3, min_row=2, values_only=True):
if row[0] is None and row[1] is None:
break
questions.append(Question(*row))
return questions
@property
def no(self) -> str:
return self._no
@property
def topic(self) -> str:
return self._topic
class Student:
def __init__(self, no: str, so: str, name: str, major: str, class_name: str):
self._no: str = no
self._so: str = so
self._name: str = name
self._major: str = major
self._class_name: str = class_name
self._picked_questions: list[Question] = []
def __str__(self):
return f"Student<No: {self._no}, SO: {self._so}, Name: {self._name}, Major: {self._major}, Class: {self._class_name}>"
def __repr__(self):
return self.__str__()
@staticmethod
def load_from_xls(path: str) -> list['Student']:
wb = load_workbook(path, read_only=True)
ws = wb.active
students = []
for row in ws.iter_rows(min_row=6, max_col=5, values_only=True):
students.append(Student(*row))
return [x for x in students if x.valid]
@property
def valid(self) -> bool:
return bool(self._no and self._so and self._name and self._major and self._class_name)
@property
def picked_questions(self) -> list[Question]:
return self._picked_questions
@property
def no(self) -> str:
return self._no
@property
def so(self) -> str:
return self._so
@property
def name(self) -> str:
return self._name
@property
def major(self) -> str:
return self._major
@property
def class_name(self) -> str:
return self._class_name
def pick_question(self, questions: list[Question], num: int = 3) -> None:
if len(questions) < num:
raise ValueError("Not enough questions to pick from.")
self._picked_questions = random.sample(questions, num)
class Course:
def __init__(self, name: str):
self._name = name
def __str__(self):
return f"Course<Name: {self._name}>"
def __repr__(self):
return self.__str__()
@staticmethod
def load_from_xls(path: str) -> 'Course':
wb = load_workbook(path, read_only=True)
ws = wb.active
name: str = ws['E3'].value
return Course(name[5:])
@property
def name(self) -> str:
return self._name
if __name__ == '__main__':
...