SA-SAJCOAI / data_storage.py
EGYADMIN's picture
Upload 2 files
79a378b verified
import json
import os
from datetime import datetime
class DataStorage:
"""فئة لإدارة تخزين واسترجاع البيانات"""
def __init__(self, data_dir="./data"):
"""تهيئة مدير التخزين"""
self.data_dir = data_dir
# إنشاء مجلد البيانات إذا لم يكن موجوداً
if not os.path.exists(data_dir):
os.makedirs(data_dir)
# مسارات الملفات
self.projects_file = os.path.join(data_dir, "projects.json")
self.boq_items_file = os.path.join(data_dir, "boq_items.json")
self.pricing_history_file = os.path.join(data_dir, "pricing_history.json")
self.risks_file = os.path.join(data_dir, "risks.json")
# تهيئة الملفات إذا لم تكن موجودة
self._initialize_files()
def _initialize_files(self):
"""تهيئة ملفات البيانات إذا لم تكن موجودة"""
files = [
self.projects_file,
self.boq_items_file,
self.pricing_history_file,
self.risks_file
]
for file in files:
if not os.path.exists(file):
with open(file, 'w', encoding='utf-8') as f:
json.dump([], f, ensure_ascii=False, indent=4)
# وظائف إدارة المشاريع
def load_projects(self):
"""تحميل بيانات المشاريع"""
with open(self.projects_file, 'r', encoding='utf-8') as f:
return json.load(f)
def save_projects(self, projects):
"""حفظ بيانات المشاريع"""
with open(self.projects_file, 'w', encoding='utf-8') as f:
json.dump(projects, f, ensure_ascii=False, indent=4)
def add_project(self, project):
"""إضافة مشروع جديد"""
projects = self.load_projects()
# إضافة طابع زمني للإنشاء والتحديث
project['created_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
project['updated_at'] = project['created_at']
projects.append(project)
self.save_projects(projects)
return project
def update_project(self, project_id, updated_data):
"""تحديث بيانات مشروع"""
projects = self.load_projects()
for i, project in enumerate(projects):
if project['id'] == project_id:
# تحديث البيانات مع الحفاظ على البيانات الأصلية
projects[i].update(updated_data)
# تحديث طابع زمني التحديث
projects[i]['updated_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.save_projects(projects)
return projects[i]
return None # المشروع غير موجود
def delete_project(self, project_id):
"""حذف مشروع"""
projects = self.load_projects()
items = self.load_boq_items()
risks = self.load_risks()
# حذف المشروع
projects = [p for p in projects if p['id'] != project_id]
self.save_projects(projects)
# حذف بنود المشروع
items = [item for item in items if item['project_id'] != project_id]
self.save_boq_items(items)
# حذف مخاطر المشروع
risks = [risk for risk in risks if risk['project_id'] != project_id]
self.save_risks(risks)
return True
# وظائف إدارة بنود جداول الكميات
def load_boq_items(self):
"""تحميل بنود جداول الكميات"""
with open(self.boq_items_file, 'r', encoding='utf-8') as f:
return json.load(f)
def save_boq_items(self, items):
"""حفظ بنود جداول الكميات"""
with open(self.boq_items_file, 'w', encoding='utf-8') as f:
json.dump(items, f, ensure_ascii=False, indent=4)
def add_boq_item(self, item):
"""إضافة بند جديد"""
items = self.load_boq_items()
# إضافة طابع زمني للإنشاء والتحديث
item['created_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
item['updated_at'] = item['created_at']
items.append(item)
self.save_boq_items(items)
return item
def update_boq_item(self, item_id, updated_data):
"""تحديث بيانات بند"""
items = self.load_boq_items()
for i, item in enumerate(items):
if item['id'] == item_id:
# تحديث البيانات مع الحفاظ على البيانات الأصلية
items[i].update(updated_data)
# تحديث طابع زمني التحديث
items[i]['updated_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.save_boq_items(items)
return items[i]
return None # البند غير موجود
def delete_boq_item(self, item_id):
"""حذف بند"""
items = self.load_boq_items()
# حذف البند
items = [item for item in items if item['id'] != item_id]
self.save_boq_items(items)
return True
def get_project_items(self, project_id):
"""الحصول على بنود مشروع معين"""
items = self.load_boq_items()
return [item for item in items if item['project_id'] == project_id]
# وظائف إدارة سجل التسعير
def load_pricing_history(self):
"""تحميل سجل التسعير"""
with open(self.pricing_history_file, 'r', encoding='utf-8') as f:
return json.load(f)
def save_pricing_history(self, history):
"""حفظ سجل التسعير"""
with open(self.pricing_history_file, 'w', encoding='utf-8') as f:
json.dump(history, f, ensure_ascii=False, indent=4)
def save_pricing(self, pricing_data):
"""حفظ تسعير جديد"""
history = self.load_pricing_history()
# إضافة طابع زمني
pricing_data['saved_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
history.append(pricing_data)
self.save_pricing_history(history)
return pricing_data
def get_project_pricing_history(self, project_id):
"""الحصول على سجل تسعير مشروع معين"""
history = self.load_pricing_history()
return [entry for entry in history if entry['project_id'] == project_id]
# وظائف إدارة المخاطر
def load_risks(self):
"""تحميل بيانات المخاطر"""
with open(self.risks_file, 'r', encoding='utf-8') as f:
return json.load(f)
def save_risks(self, risks):
"""حفظ بيانات المخاطر"""
with open(self.risks_file, 'w', encoding='utf-8') as f:
json.dump(risks, f, ensure_ascii=False, indent=4)
def add_risk(self, risk):
"""إضافة مخاطرة جديدة"""
risks = self.load_risks()
# إضافة طابع زمني للإنشاء والتحديث
risk['created_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
risk['updated_at'] = risk['created_at']
risks.append(risk)
self.save_risks(risks)
return risk
def update_risk(self, risk_id, updated_data):
"""تحديث بيانات مخاطرة"""
risks = self.load_risks()
for i, risk in enumerate(risks):
if risk['id'] == risk_id:
# تحديث البيانات مع الحفاظ على البيانات الأصلية
risks[i].update(updated_data)
# تحديث طابع زمني التحديث
risks[i]['updated_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.save_risks(risks)
return risks[i]
return None # المخاطرة غير موجودة
def delete_risk(self, risk_id):
"""حذف مخاطرة"""
risks = self.load_risks()
# حذف المخاطرة
risks = [r for r in risks if r['id'] != risk_id]
self.save_risks(risks)
return True
def get_project_risks(self, project_id):
"""الحصول على مخاطر مشروع معين"""
risks = self.load_risks()
return [risk for risk in risks if risk['project_id'] == project_id]
# وظائف النسخ الاحتياطي
def backup_data(self, backup_dir="./backup"):
"""إنشاء نسخة احتياطية من البيانات"""
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
# نسخ ملفات البيانات
files = {
"projects.json": self.projects_file,
"boq_items.json": self.boq_items_file,
"pricing_history.json": self.pricing_history_file,
"risks.json": self.risks_file
}
for filename, src_file in files.items():
if os.path.exists(src_file):
backup_file = os.path.join(backup_dir, f"{filename.split('.')[0]}_{timestamp}.json")
with open(src_file, 'r', encoding='utf-8') as src:
with open(backup_file, 'w', encoding='utf-8') as dst:
dst.write(src.read())
return timestamp