rewrited logic structure
This commit is contained in:
136
group_system/storage/admin.py
Normal file
136
group_system/storage/admin.py
Normal file
@@ -0,0 +1,136 @@
|
||||
"""教师端班级和分组管理。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlite3
|
||||
|
||||
|
||||
class TeacherGroupAdminMixin:
|
||||
|
||||
def switch_class(self, class_name: str) -> tuple[bool, str]:
|
||||
with self.lock:
|
||||
row = self.connection.execute(
|
||||
"SELECT COUNT(*) AS n FROM students WHERE class_name=?", (class_name,)
|
||||
).fetchone()
|
||||
if row["n"] == 0:
|
||||
return False, "班级不存在"
|
||||
self.set_setting("active_class", class_name)
|
||||
return True, f"已切换到 {class_name} 班,仅该班学生可登录"
|
||||
|
||||
def set_locked(self, class_name: str, locked: bool) -> tuple[bool, str]:
|
||||
with self.lock:
|
||||
exists = self.connection.execute(
|
||||
"SELECT 1 FROM students WHERE class_name=? LIMIT 1", (class_name,)
|
||||
).fetchone()
|
||||
if not exists:
|
||||
return False, "班级不存在"
|
||||
with self.lock, self.connection:
|
||||
self.connection.execute(
|
||||
"""INSERT INTO class_controls(class_name,locked) VALUES(?,?)
|
||||
ON CONFLICT(class_name) DO UPDATE SET locked=excluded.locked""",
|
||||
(class_name, int(locked)),
|
||||
)
|
||||
return True, ("已停止学生操作" if locked else "已恢复学生操作")
|
||||
|
||||
def _require_teacher_group(self, class_name: str) -> tuple[bool, str, sqlite3.Row | None]:
|
||||
if not any(item["class_name"] == class_name for item in self.class_list()):
|
||||
return False, "班级不存在", None
|
||||
return True, "", None
|
||||
|
||||
def teacher_create_group(self, class_name: str, name: str) -> tuple[bool, str]:
|
||||
if not self._require_teacher_group(class_name)[0]:
|
||||
return False, "班级不存在"
|
||||
name = name.strip() or "未命名小组"
|
||||
with self.lock, self.connection:
|
||||
self.connection.execute(
|
||||
"INSERT INTO groups(class_name,name,leader_student_id) VALUES(?,?,NULL)",
|
||||
(class_name, name),
|
||||
)
|
||||
return True, f"小组“{name}”已创建"
|
||||
|
||||
def teacher_rename_group(self, group_id: int, name: str) -> tuple[bool, str]:
|
||||
name = name.strip()
|
||||
if not name:
|
||||
return False, "组名不能为空"
|
||||
with self.lock, self.connection:
|
||||
cursor = self.connection.execute("UPDATE groups SET name=? WHERE id=?", (name, group_id))
|
||||
if cursor.rowcount == 0:
|
||||
return False, "小组不存在"
|
||||
return True, "组名已保存"
|
||||
|
||||
def teacher_set_leader(self, group_id: int, student_id: int | None) -> tuple[bool, str]:
|
||||
with self.lock, self.connection:
|
||||
group = self.connection.execute("SELECT * FROM groups WHERE id=?", (group_id,)).fetchone()
|
||||
if group is None:
|
||||
return False, "小组不存在"
|
||||
if student_id is None:
|
||||
self.connection.execute(
|
||||
"UPDATE groups SET leader_student_id=NULL WHERE id=?", (group_id,)
|
||||
)
|
||||
return True, "已取消组长"
|
||||
member = self.connection.execute(
|
||||
"SELECT 1 FROM group_members WHERE group_id=? AND student_id=?",
|
||||
(group_id, student_id),
|
||||
).fetchone()
|
||||
if not member:
|
||||
return False, "组长必须是该组成员"
|
||||
self.connection.execute(
|
||||
"UPDATE groups SET leader_student_id=? WHERE id=?", (student_id, group_id)
|
||||
)
|
||||
return True, "组长已设置"
|
||||
|
||||
def teacher_add_member(self, group_id: int, student_id: int) -> tuple[bool, str]:
|
||||
with self.lock, self.connection:
|
||||
group = self.connection.execute("SELECT * FROM groups WHERE id=?", (group_id,)).fetchone()
|
||||
student = self.connection.execute("SELECT * FROM students WHERE id=?", (student_id,)).fetchone()
|
||||
if group is None or student is None:
|
||||
return False, "小组或学生不存在"
|
||||
if group["class_name"] != student["class_name"]:
|
||||
return False, "不能跨班调整"
|
||||
current_group = self.connection.execute(
|
||||
"SELECT group_id FROM group_members WHERE student_id=?", (student_id,)
|
||||
).fetchone()
|
||||
if current_group and current_group["group_id"] == group_id:
|
||||
return False, "学生已在该组"
|
||||
count = self.connection.execute(
|
||||
"SELECT COUNT(*) AS n FROM group_members WHERE group_id=?", (group_id,)
|
||||
).fetchone()["n"]
|
||||
group_limit = self.group_limit()
|
||||
if count >= group_limit:
|
||||
return False, f"该组已有 {group_limit} 人;请先移出一人"
|
||||
if current_group:
|
||||
self.connection.execute(
|
||||
"DELETE FROM group_members WHERE student_id=?", (student_id,)
|
||||
)
|
||||
self.connection.execute(
|
||||
"UPDATE groups SET leader_student_id=NULL WHERE id=? AND leader_student_id=?",
|
||||
(current_group["group_id"], student_id),
|
||||
)
|
||||
self.connection.execute(
|
||||
"INSERT INTO group_members(group_id,student_id) VALUES(?,?)",
|
||||
(group_id, student_id),
|
||||
)
|
||||
return True, "已加入小组"
|
||||
|
||||
def teacher_remove_member(self, student_id: int) -> tuple[bool, str]:
|
||||
with self.lock, self.connection:
|
||||
membership = self.connection.execute(
|
||||
"SELECT * FROM group_members WHERE student_id=?", (student_id,)
|
||||
).fetchone()
|
||||
if not membership:
|
||||
return False, "学生当前未分组"
|
||||
self.connection.execute(
|
||||
"DELETE FROM group_members WHERE student_id=?", (student_id,)
|
||||
)
|
||||
self.connection.execute(
|
||||
"""UPDATE groups SET leader_student_id=NULL
|
||||
WHERE leader_student_id=?""", (student_id,)
|
||||
)
|
||||
return True, "已移出小组"
|
||||
|
||||
def teacher_disband_group(self, group_id: int) -> tuple[bool, str]:
|
||||
with self.lock, self.connection:
|
||||
cursor = self.connection.execute("DELETE FROM groups WHERE id=?", (group_id,))
|
||||
if cursor.rowcount == 0:
|
||||
return False, "小组不存在"
|
||||
return True, "小组已解散"
|
||||
Reference in New Issue
Block a user