|
""" |
|
ملف الإعدادات لنظام إدارة المناقصات |
|
""" |
|
|
|
import os |
|
import json |
|
from pathlib import Path |
|
|
|
class AppConfig: |
|
"""فئة إعدادات التطبيق""" |
|
|
|
def __init__(self): |
|
"""تهيئة الإعدادات""" |
|
|
|
self.app_dir = os.path.dirname(os.path.abspath(__file__)) |
|
self.assets_dir = os.path.join(self.app_dir, "assets") |
|
self.data_dir = os.path.join(self.app_dir, "data") |
|
|
|
|
|
Path(self.assets_dir).mkdir(parents=True, exist_ok=True) |
|
Path(self.data_dir).mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
self.icons_dir = os.path.join(self.assets_dir, "icons") |
|
self.images_dir = os.path.join(self.assets_dir, "images") |
|
self.fonts_dir = os.path.join(self.assets_dir, "fonts") |
|
|
|
|
|
Path(self.icons_dir).mkdir(parents=True, exist_ok=True) |
|
Path(self.images_dir).mkdir(parents=True, exist_ok=True) |
|
Path(self.fonts_dir).mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
self.database_file = os.path.join(self.data_dir, "database.db") |
|
self.settings_file = os.path.join(self.data_dir, "settings.json") |
|
self.charts_dir = os.path.join(self.data_dir, "charts") |
|
|
|
|
|
Path(self.charts_dir).mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
self.settings = self._load_settings() |
|
|
|
def _load_settings(self): |
|
"""تحميل الإعدادات من ملف JSON""" |
|
default_settings = { |
|
"app": { |
|
"name": "نظام إدارة المناقصات", |
|
"version": "1.0.0", |
|
"language": "ar", |
|
"theme": "light", |
|
"font": "Cairo", |
|
"font_size": 12 |
|
}, |
|
"database": { |
|
"type": "sqlite", |
|
"path": self.database_file |
|
}, |
|
"ui": { |
|
"window_width": 1200, |
|
"window_height": 800, |
|
"sidebar_width": 250 |
|
}, |
|
"notifications": { |
|
"enabled": True, |
|
"email_enabled": True, |
|
"email_server": "smtp.example.com", |
|
"email_port": 587, |
|
"email_username": "", |
|
"email_password": "" |
|
}, |
|
"reports": { |
|
"default_format": "pdf", |
|
"default_path": os.path.join(self.data_dir, "reports") |
|
}, |
|
"backup": { |
|
"auto_backup": True, |
|
"backup_frequency": "weekly", |
|
"backup_path": os.path.join(self.data_dir, "backups"), |
|
"max_backups": 10 |
|
} |
|
} |
|
|
|
|
|
if os.path.exists(self.settings_file): |
|
try: |
|
with open(self.settings_file, "r", encoding="utf-8") as f: |
|
settings = json.load(f) |
|
|
|
|
|
self._merge_settings(default_settings, settings) |
|
return default_settings |
|
except Exception as e: |
|
print(f"خطأ في تحميل الإعدادات: {str(e)}") |
|
return default_settings |
|
else: |
|
|
|
self._save_settings(default_settings) |
|
return default_settings |
|
|
|
def _merge_settings(self, default_settings, loaded_settings): |
|
"""دمج الإعدادات المحملة مع الإعدادات الافتراضية""" |
|
for key, value in loaded_settings.items(): |
|
if key in default_settings: |
|
if isinstance(value, dict) and isinstance(default_settings[key], dict): |
|
self._merge_settings(default_settings[key], value) |
|
else: |
|
default_settings[key] = value |
|
|
|
def _save_settings(self, settings=None): |
|
"""حفظ الإعدادات إلى ملف JSON""" |
|
if settings is None: |
|
settings = self.settings |
|
|
|
try: |
|
with open(self.settings_file, "w", encoding="utf-8") as f: |
|
json.dump(settings, f, ensure_ascii=False, indent=4) |
|
return True |
|
except Exception as e: |
|
print(f"خطأ في حفظ الإعدادات: {str(e)}") |
|
return False |
|
|
|
def get_setting(self, section, key, default=None): |
|
"""الحصول على قيمة إعداد معين""" |
|
try: |
|
return self.settings[section][key] |
|
except KeyError: |
|
return default |
|
|
|
def set_setting(self, section, key, value): |
|
"""تعيين قيمة إعداد معين""" |
|
if section not in self.settings: |
|
self.settings[section] = {} |
|
|
|
self.settings[section][key] = value |
|
self._save_settings() |
|
|
|
def get_app_name(self): |
|
"""الحصول على اسم التطبيق""" |
|
return self.get_setting("app", "name", "نظام إدارة المناقصات") |
|
|
|
def get_app_version(self): |
|
"""الحصول على إصدار التطبيق""" |
|
return self.get_setting("app", "version", "1.0.0") |
|
|
|
def get_language(self): |
|
"""الحصول على لغة التطبيق""" |
|
return self.get_setting("app", "language", "ar") |
|
|
|
def set_language(self, language): |
|
"""تعيين لغة التطبيق""" |
|
self.set_setting("app", "language", language) |
|
|
|
def get_theme(self): |
|
"""الحصول على نمط التطبيق""" |
|
return self.get_setting("app", "theme", "light") |
|
|
|
def set_theme(self, theme): |
|
"""تعيين نمط التطبيق""" |
|
self.set_setting("app", "theme", theme) |
|
|
|
def get_font(self): |
|
"""الحصول على خط التطبيق""" |
|
return self.get_setting("app", "font", "Cairo") |
|
|
|
def set_font(self, font): |
|
"""تعيين خط التطبيق""" |
|
self.set_setting("app", "font", font) |
|
|
|
def get_font_size(self): |
|
"""الحصول على حجم خط التطبيق""" |
|
return self.get_setting("app", "font_size", 12) |
|
|
|
def set_font_size(self, font_size): |
|
"""تعيين حجم خط التطبيق""" |
|
self.set_setting("app", "font_size", font_size) |
|
|
|
def get_window_size(self): |
|
"""الحصول على حجم نافذة التطبيق""" |
|
width = self.get_setting("ui", "window_width", 1200) |
|
height = self.get_setting("ui", "window_height", 800) |
|
return (width, height) |
|
|
|
def set_window_size(self, width, height): |
|
"""تعيين حجم نافذة التطبيق""" |
|
self.set_setting("ui", "window_width", width) |
|
self.set_setting("ui", "window_height", height) |
|
|
|
def get_sidebar_width(self): |
|
"""الحصول على عرض الشريط الجانبي""" |
|
return self.get_setting("ui", "sidebar_width", 250) |
|
|
|
def set_sidebar_width(self, width): |
|
"""تعيين عرض الشريط الجانبي""" |
|
self.set_setting("ui", "sidebar_width", width) |
|
|
|
def get_database_config(self): |
|
"""الحصول على إعدادات قاعدة البيانات""" |
|
return self.settings.get("database", { |
|
"type": "sqlite", |
|
"path": self.database_file |
|
}) |
|
|
|
def get_notifications_config(self): |
|
"""الحصول على إعدادات الإشعارات""" |
|
return self.settings.get("notifications", { |
|
"enabled": True, |
|
"email_enabled": True, |
|
"email_server": "smtp.example.com", |
|
"email_port": 587, |
|
"email_username": "", |
|
"email_password": "" |
|
}) |
|
|
|
def get_reports_config(self): |
|
"""الحصول على إعدادات التقارير""" |
|
return self.settings.get("reports", { |
|
"default_format": "pdf", |
|
"default_path": os.path.join(self.data_dir, "reports") |
|
}) |
|
|
|
def get_backup_config(self): |
|
"""الحصول على إعدادات النسخ الاحتياطي""" |
|
return self.settings.get("backup", { |
|
"auto_backup": True, |
|
"backup_frequency": "weekly", |
|
"backup_path": os.path.join(self.data_dir, "backups"), |
|
"max_backups": 10 |
|
}) |
|
|