# database.py - نظام قاعدة البيانات البسيطة للملاحظات import sqlite3 import json import os from datetime import datetime from typing import List, Dict, Optional class NotesDatabase: """قاعدة بيانات بسيطة لحفظ الملاحظات والملخصات""" def __init__(self, db_path: str = "lecture_notes.db"): self.db_path = db_path self.init_database() def init_database(self): """إنشاء قاعدة البيانات والجداول""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() # جدول الملاحظات الرئيسي cursor.execute(''' CREATE TABLE IF NOT EXISTS lecture_notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, original_text TEXT NOT NULL, translated_text TEXT, summary TEXT, key_points TEXT, subject TEXT, date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, date_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP, audio_file_path TEXT, language_detected TEXT, target_language TEXT, markers TEXT ) ''') # جدول الملخصات السريعة cursor.execute(''' CREATE TABLE IF NOT EXISTS quick_summaries ( id INTEGER PRIMARY KEY AUTOINCREMENT, note_id INTEGER, summary_type TEXT, content TEXT, date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (note_id) REFERENCES lecture_notes (id) ) ''') conn.commit() def save_lecture_note(self, data: Dict) -> int: """حفظ ملاحظة محاضرة جديدة""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() cursor.execute(''' INSERT INTO lecture_notes (title, original_text, translated_text, summary, key_points, subject, audio_file_path, language_detected, target_language, markers) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( data.get('title', 'محاضرة جديدة'), data.get('original_text', ''), data.get('translated_text', ''), data.get('summary', ''), data.get('key_points', ''), data.get('subject', ''), data.get('audio_file_path', ''), data.get('language_detected', ''), data.get('target_language', ''), json.dumps(data.get('markers', [])) )) note_id = cursor.lastrowid conn.commit() return note_id def get_all_notes(self, limit: int = 50) -> List[Dict]: """استرجاع جميع الملاحظات""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() cursor.execute(''' SELECT * FROM lecture_notes ORDER BY date_created DESC LIMIT ? ''', (limit,)) columns = [description[0] for description in cursor.description] notes = [] for row in cursor.fetchall(): note = dict(zip(columns, row)) # تحويل markers من JSON string إلى list if note['markers']: try: note['markers'] = json.loads(note['markers']) except: note['markers'] = [] notes.append(note) return notes def get_note_by_id(self, note_id: int) -> Optional[Dict]: """استرجاع ملاحظة محددة بالـ ID""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() cursor.execute('SELECT * FROM lecture_notes WHERE id = ?', (note_id,)) row = cursor.fetchone() if row: columns = [description[0] for description in cursor.description] note = dict(zip(columns, row)) if note['markers']: try: note['markers'] = json.loads(note['markers']) except: note['markers'] = [] return note return None def update_note(self, note_id: int, data: Dict) -> bool: """تحديث ملاحظة موجودة""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() # بناء query التحديث بناءً على البيانات الموجودة update_fields = [] values = [] for field in ['title', 'summary', 'key_points', 'subject']: if field in data: update_fields.append(f"{field} = ?") values.append(data[field]) if not update_fields: return False update_fields.append("date_modified = CURRENT_TIMESTAMP") values.append(note_id) query = f"UPDATE lecture_notes SET {', '.join(update_fields)} WHERE id = ?" cursor.execute(query, values) conn.commit() return cursor.rowcount > 0 def delete_note(self, note_id: int) -> bool: """حذف ملاحظة""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() # حذف الملخصات المرتبطة أولاً cursor.execute('DELETE FROM quick_summaries WHERE note_id = ?', (note_id,)) # ثم حذف الملاحظة cursor.execute('DELETE FROM lecture_notes WHERE id = ?', (note_id,)) conn.commit() return cursor.rowcount > 0 def search_notes(self, query: str) -> List[Dict]: """البحث في الملاحظات""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() search_query = f"%{query}%" cursor.execute(''' SELECT * FROM lecture_notes WHERE title LIKE ? OR original_text LIKE ? OR translated_text LIKE ? OR summary LIKE ? ORDER BY date_created DESC ''', (search_query, search_query, search_query, search_query)) columns = [description[0] for description in cursor.description] notes = [] for row in cursor.fetchall(): note = dict(zip(columns, row)) if note['markers']: try: note['markers'] = json.loads(note['markers']) except: note['markers'] = [] notes.append(note) return notes def get_notes_by_subject(self, subject: str) -> List[Dict]: """استرجاع الملاحظات حسب المادة""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() cursor.execute(''' SELECT * FROM lecture_notes WHERE subject = ? ORDER BY date_created DESC ''', (subject,)) columns = [description[0] for description in cursor.description] notes = [] for row in cursor.fetchall(): note = dict(zip(columns, row)) if note['markers']: try: note['markers'] = json.loads(note['markers']) except: note['markers'] = [] notes.append(note) return notes def get_subjects(self) -> List[str]: """استرجاع قائمة المواد الدراسية""" with sqlite3.connect(self.db_path) as conn: cursor = conn.cursor() cursor.execute(''' SELECT DISTINCT subject FROM lecture_notes WHERE subject IS NOT NULL AND subject != '' ORDER BY subject ''') return [row[0] for row in cursor.fetchall()]