divid_teacher / admin_manager.py
Asem75's picture
Create admin_manager.py
7089d56 verified
Raw
History Blame Contribute Delete
11 kB
# admin_manager.py
"""
admin_manager.py
مدير مكتب الإدارة في منصة Divid Teacher
مسؤول عن:
- إدارة التوجيه العام
- إدارة المواد الأساسية والثانوية
- إدارة المسارات والتخصصات
- إدارة الاستراتيجيات
- إدارة إعدادات Pomodoro
- تجهيز ملخص إداري للنظام
"""
import json
from pathlib import Path
from datetime import datetime
from curriculum_manager import CurriculumManager
from strategy_manager import StrategyManager
try:
from language_manager import LanguageManager
except Exception:
LanguageManager = None
try:
from config import SYSTEM_FOLDER
except Exception:
SYSTEM_FOLDER = "system"
class AdminManager:
def __init__(self):
self.system_folder = Path(SYSTEM_FOLDER)
self.system_folder.mkdir(parents=True, exist_ok=True)
self.general_instruction_file = self.system_folder / "general_instruction.txt"
self.admin_notes_file = self.system_folder / "admin_notes.json"
self.curriculum_manager = CurriculumManager()
self.strategy_manager = StrategyManager()
self.language_manager = None
if LanguageManager is not None:
try:
self.language_manager = LanguageManager()
except Exception:
self.language_manager = None
if not self.general_instruction_file.exists():
self.save_general_instruction(self.default_general_instruction())
if not self.admin_notes_file.exists():
self.save_admin_notes([])
def now(self):
return datetime.utcnow().isoformat()
def default_general_instruction(self):
return """
التوجيه العام لمنصة Divid Teacher:
- لا تشرح للطالب دفعة واحدة.
- قسّم الدرس إلى أجزاء قصيرة.
- اسأل الطالب قبل بداية الحصة.
- اسأل الطالب بعد كل جزء.
- لا تنتقل إلى الجزء التالي حتى يجيب الطالب.
- استخدم الخطة A للدرس الرئيسي.
- استخدم الخطة B لتقليص الفجوة التعليمية عند الحاجة.
- لا تخبر الطالب أنه ضعيف.
- استخدم أسلوبًا مناسبًا لعمر الطالب.
- إذا خرج الطالب عن الموضوع، أعده بهدوء.
- إذا ظهرت فجوة في مهارة أساسية، اربطها بوسام إتقان مناسب.
""".strip()
def load_general_instruction(self):
try:
with open(self.general_instruction_file, "r", encoding="utf-8") as f:
return f.read()
except Exception:
text = self.default_general_instruction()
self.save_general_instruction(text)
return text
def save_general_instruction(self, text):
text = str(text or "").strip()
with open(self.general_instruction_file, "w", encoding="utf-8") as f:
f.write(text)
return {
"success": True,
"message": "تم حفظ التوجيه العام.",
"text": text
}
def append_general_instruction(self, extra_text):
current = self.load_general_instruction()
extra_text = str(extra_text or "").strip()
if not extra_text:
return {
"success": False,
"message": "لا يوجد نص لإضافته.",
"text": current
}
new_text = current + "\n\n" + extra_text
return self.save_general_instruction(new_text)
def load_admin_notes(self):
try:
with open(self.admin_notes_file, "r", encoding="utf-8") as f:
return json.load(f)
except Exception:
self.save_admin_notes([])
return []
def save_admin_notes(self, notes):
with open(self.admin_notes_file, "w", encoding="utf-8") as f:
json.dump(
notes,
f,
ensure_ascii=False,
indent=4
)
return True
def add_admin_note(self, title, text, category="general"):
notes = self.load_admin_notes()
note = {
"id": f"note_{len(notes) + 1}",
"title": str(title or "").strip(),
"text": str(text or "").strip(),
"category": str(category or "general").strip(),
"created_at": self.now()
}
notes.append(note)
self.save_admin_notes(notes)
return note
def curriculum_summary(self):
return self.curriculum_manager.summary_for_admin()
def add_track(self, grade, track_name):
result = self.curriculum_manager.add_track(
grade=grade,
track_name=track_name
)
return {
"success": result,
"message": "تمت إضافة المسار." if result else "فشل إضافة المسار."
}
def remove_track(self, grade, track_name):
result = self.curriculum_manager.remove_track(
grade=grade,
track_name=track_name
)
return {
"success": result,
"message": "تم حذف المسار." if result else "فشل حذف المسار."
}
def add_subject(self, grade, subject, subject_type="core"):
result = self.curriculum_manager.add_subject(
grade=grade,
subject=subject,
subject_type=subject_type
)
if subject_type == "secondary":
message = "تمت إضافة المادة كمادة ثانوية."
else:
message = "تمت إضافة المادة كمادة أساسية."
return {
"success": result,
"message": message if result else "فشل إضافة المادة."
}
def remove_subject(self, grade, subject):
result = self.curriculum_manager.remove_subject(
grade=grade,
subject=subject
)
return {
"success": result,
"message": "تم حذف المادة." if result else "فشل حذف المادة."
}
def change_subject_type(self, grade, subject, new_type):
result = self.curriculum_manager.change_subject_type(
grade=grade,
subject=subject,
new_type=new_type
)
return {
"success": result,
"message": "تم تغيير نوع المادة." if result else "فشل تغيير نوع المادة."
}
def get_subject_route(self, grade, subject):
return self.curriculum_manager.decide_subject_route(
grade=grade,
subject=subject
)
def strategy_summary(self):
return self.strategy_manager.summary()
def add_subject_strategy(
self,
subject,
strategy_name,
steps_text,
methods_text="",
pomodoro_recommended=True
):
steps = [
line.strip()
for line in str(steps_text or "").splitlines()
if line.strip()
]
methods = [
line.strip()
for line in str(methods_text or "").splitlines()
if line.strip()
]
if not steps:
return {
"success": False,
"message": "يجب إدخال خطوات الاستراتيجية."
}
result = self.strategy_manager.add_subject_strategy(
subject=subject,
strategy_name=strategy_name,
steps=steps,
methods=methods,
pomodoro_recommended=pomodoro_recommended
)
return {
"success": result,
"message": "تم حفظ استراتيجية المادة." if result else "فشل حفظ الاستراتيجية."
}
def update_pomodoro_settings(
self,
study_minutes=25,
short_break_minutes=5,
long_break_minutes=15,
long_break_after_sessions=4,
enabled=True
):
settings = self.strategy_manager.update_pomodoro_settings(
study_minutes=study_minutes,
short_break_minutes=short_break_minutes,
long_break_minutes=long_break_minutes,
long_break_after_sessions=long_break_after_sessions,
enabled=enabled
)
return {
"success": True,
"message": "تم تحديث إعدادات Pomodoro.",
"settings": settings
}
def choose_current_strategy(
self,
student,
subject,
plan_type="A",
lesson_title="",
gap_skill=""
):
return self.strategy_manager.choose_strategy(
student=student,
subject=subject,
plan_type=plan_type,
lesson_title=lesson_title,
gap_skill=gap_skill
)
def language_summary(self):
if self.language_manager is None:
return "مدير اللغات غير متوفر حاليًا."
return self.language_manager.summary()
def add_language(self, code, name, direction="ltr", enabled=True):
if self.language_manager is None:
return {
"success": False,
"message": "مدير اللغات غير متوفر."
}
result = self.language_manager.add_supported_language(
code=code,
name=name,
direction=direction,
enabled=enabled
)
return {
"success": result,
"message": "تمت إضافة اللغة." if result else "فشل إضافة اللغة."
}
def system_snapshot(self):
snapshot = {
"created_at": self.now(),
"general_instruction": self.load_general_instruction(),
"curriculum": self.curriculum_manager.load_config(),
"strategies": self.strategy_manager.load_general_strategies(),
"admin_notes": self.load_admin_notes()
}
if self.language_manager is not None:
snapshot["languages"] = self.language_manager.load_config()
else:
snapshot["languages"] = {}
return snapshot
def format_admin_dashboard(self):
text = "# مكتب الإدارة\n\n"
text += "## التوجيه العام\n\n"
text += self.load_general_instruction()
text += "\n\n---\n\n"
text += "## المنهج والمواد\n\n"
text += self.curriculum_summary()
text += "\n\n---\n\n"
text += "## الاستراتيجيات\n\n"
text += self.strategy_summary()
text += "\n\n---\n\n"
text += "## اللغات\n\n"
text += self.language_summary()
return text.strip()