Spaces:
Sleeping
Sleeping
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 | |