Spaces:
Running
Running
| # 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() |