# 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()