Spaces:
Paused
Paused
| import os | |
| import re | |
| import json | |
| import pandas as pd | |
| from typing import Dict, List, Any, Union, Tuple, Optional | |
| from datetime import datetime | |
| def format_currency(amount: float, currency: str = "ريال") -> str: | |
| """ | |
| تنسيق المبالغ المالية | |
| المعاملات: | |
| ---------- | |
| amount : float | |
| المبلغ | |
| currency : str, optional | |
| العملة (افتراضي: "ريال") | |
| المخرجات: | |
| -------- | |
| str | |
| المبلغ بالتنسيق المناسب | |
| """ | |
| if not amount and amount != 0: | |
| return "غير محدد" | |
| # تنسيق الأرقام بالفواصل الآلاف | |
| formatted = f"{amount:,.2f}".replace(".00", "") | |
| # ترتيب العملة حسب اللغة العربية (يمين) | |
| return f"{formatted} {currency}" | |
| def format_percentage(value: float) -> str: | |
| """ | |
| تنسيق النسب المئوية | |
| المعاملات: | |
| ---------- | |
| value : float | |
| القيمة | |
| المخرجات: | |
| -------- | |
| str | |
| النسبة بالتنسيق المناسب | |
| """ | |
| if not value and value != 0: | |
| return "غير محدد" | |
| return f"{value:.2f}%".replace(".00", "") | |
| def format_date(date_obj: Any) -> str: | |
| """ | |
| تنسيق التواريخ | |
| المعاملات: | |
| ---------- | |
| date_obj : Any | |
| كائن التاريخ | |
| المخرجات: | |
| -------- | |
| str | |
| التاريخ بالتنسيق المناسب | |
| """ | |
| if not date_obj: | |
| return "غير محدد" | |
| # إذا كان التاريخ سلسلة نصية | |
| if isinstance(date_obj, str): | |
| try: | |
| date_obj = datetime.strptime(date_obj, "%Y-%m-%d") | |
| except ValueError: | |
| try: | |
| date_obj = datetime.strptime(date_obj, "%Y-%m-%d %H:%M:%S") | |
| except ValueError: | |
| return date_obj | |
| # تنسيق التاريخ بالطريقة العربية | |
| month_names = [ | |
| "يناير", "فبراير", "مارس", "إبريل", "مايو", "يونيو", | |
| "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر" | |
| ] | |
| return f"{date_obj.day} {month_names[date_obj.month - 1]} {date_obj.year}" | |
| def extract_keywords(text: str, keywords: List[str], context_size: int = 50) -> List[Dict[str, str]]: | |
| """ | |
| استخراج الكلمات المفتاحية من النص مع سياقها | |
| المعاملات: | |
| ---------- | |
| text : str | |
| النص المراد البحث فيه | |
| keywords : List[str] | |
| قائمة الكلمات المفتاحية | |
| context_size : int, optional | |
| حجم السياق بالأحرف قبل وبعد الكلمة (افتراضي: 50) | |
| المخرجات: | |
| -------- | |
| List[Dict[str, str]] | |
| قائمة بالكلمات المفتاحية وسياقها | |
| """ | |
| results = [] | |
| for keyword in keywords: | |
| # البحث عن الكلمة المفتاحية في النص | |
| pattern = re.compile(r'\\b' + re.escape(keyword) + r'\\b', re.IGNORECASE | re.MULTILINE) | |
| matches = pattern.finditer(text) | |
| for match in matches: | |
| start_idx = max(0, match.start() - context_size) | |
| end_idx = min(len(text), match.end() + context_size) | |
| # استخراج السياق | |
| context = text[start_idx:end_idx] | |
| # إضافة النتيجة | |
| results.append({ | |
| "keyword": keyword, | |
| "context": context, | |
| "position": match.start() | |
| }) | |
| # ترتيب النتائج حسب الموقع في النص | |
| results = sorted(results, key=lambda x: x["position"]) | |
| return results | |
| def calculate_progress(current: float, total: float) -> Dict[str, Any]: | |
| """ | |
| حساب نسبة الإنجاز | |
| المعاملات: | |
| ---------- | |
| current : float | |
| القيمة الحالية | |
| total : float | |
| القيمة الإجمالية | |
| المخرجات: | |
| -------- | |
| Dict[str, Any] | |
| معلومات التقدم | |
| """ | |
| if total == 0: | |
| return { | |
| "percentage": 0, | |
| "status": "لم يبدأ", | |
| "color": "gray" | |
| } | |
| percentage = min(100, (current / total) * 100) | |
| if percentage == 0: | |
| status = "لم يبدأ" | |
| color = "gray" | |
| elif percentage < 25: | |
| status = "بداية" | |
| color = "red" | |
| elif percentage < 50: | |
| status = "قيد التنفيذ" | |
| color = "orange" | |
| elif percentage < 75: | |
| status = "متقدم" | |
| color = "blue" | |
| elif percentage < 100: | |
| status = "شبه مكتمل" | |
| color = "teal" | |
| else: | |
| status = "مكتمل" | |
| color = "green" | |
| return { | |
| "percentage": round(percentage, 1), | |
| "status": status, | |
| "color": color | |
| } | |
| def create_directory_structure(base_dir: str, structure: Dict[str, Any]) -> None: | |
| """ | |
| إنشاء هيكل المجلدات | |
| المعاملات: | |
| ---------- | |
| base_dir : str | |
| المجلد الأساسي | |
| structure : Dict[str, Any] | |
| هيكل المجلدات | |
| """ | |
| os.makedirs(base_dir, exist_ok=True) | |
| for key, value in structure.items(): | |
| path = os.path.join(base_dir, key) | |
| if isinstance(value, dict): | |
| # إذا كانت القيمة قاموساً، استمر في إنشاء الهيكل الفرعي | |
| create_directory_structure(path, value) | |
| else: | |
| # إنشاء المجلد | |
| os.makedirs(path, exist_ok=True) | |
| # إذا كانت القيمة قائمة، إنشاء ملفات فارغة | |
| if isinstance(value, list): | |
| for file_name in value: | |
| file_path = os.path.join(path, file_name) | |
| if not os.path.exists(file_path): | |
| with open(file_path, 'w', encoding='utf-8') as f: | |
| # يمكن كتابة محتوى افتراضي هنا | |
| pass | |
| def export_to_excel(data: List[Dict[str, Any]], file_path: str, sheet_name: str = "Sheet1") -> bool: | |
| """ | |
| تصدير البيانات إلى ملف Excel | |
| المعاملات: | |
| ---------- | |
| data : List[Dict[str, Any]] | |
| البيانات المراد تصديرها | |
| file_path : str | |
| مسار الملف | |
| sheet_name : str, optional | |
| اسم ورقة العمل (افتراضي: "Sheet1") | |
| المخرجات: | |
| -------- | |
| bool | |
| نجاح أو فشل العملية | |
| """ | |
| try: | |
| # تحويل البيانات إلى DataFrame | |
| df = pd.DataFrame(data) | |
| # تصدير إلى Excel | |
| df.to_excel(file_path, sheet_name=sheet_name, index=False) | |
| return True | |
| except Exception as e: | |
| print(f"Error exporting to Excel: {str(e)}") | |
| return False | |
| def export_to_json(data: Any, file_path: str) -> bool: | |
| """ | |
| تصدير البيانات إلى ملف JSON | |
| المعاملات: | |
| ---------- | |
| data : Any | |
| البيانات المراد تصديرها | |
| file_path : str | |
| مسار الملف | |
| المخرجات: | |
| -------- | |
| bool | |
| نجاح أو فشل العملية | |
| """ | |
| try: | |
| # إنشاء المجلد إذا لم يكن موجوداً | |
| os.makedirs(os.path.dirname(file_path), exist_ok=True) | |
| # تصدير إلى JSON | |
| with open(file_path, 'w', encoding='utf-8') as f: | |
| json.dump(data, f, ensure_ascii=False, indent=4) | |
| return True | |
| except Exception as e: | |
| print(f"Error exporting to JSON: {str(e)}") | |
| return False | |
| def validate_input(input_data: Dict[str, Any], validation_rules: Dict[str, Dict[str, Any]]) -> Dict[str, List[str]]: | |
| """ | |
| التحقق من صحة البيانات المدخلة | |
| المعاملات: | |
| ---------- | |
| input_data : Dict[str, Any] | |
| البيانات المدخلة | |
| validation_rules : Dict[str, Dict[str, Any]] | |
| قواعد التحقق | |
| المخرجات: | |
| -------- | |
| Dict[str, List[str]] | |
| قائمة بالأخطاء لكل حقل | |
| """ | |
| errors = {} | |
| for field, rules in validation_rules.items(): | |
| field_errors = [] | |
| value = input_data.get(field) | |
| # التحقق من الحقول المطلوبة | |
| if rules.get("required", False) and (value is None or (isinstance(value, str) and value.strip() == "")): | |
| field_errors.append("هذا الحقل مطلوب") | |
| # التحقق من النوع | |
| if value is not None and "type" in rules: | |
| expected_type = rules["type"] | |
| if expected_type == "number" and not (isinstance(value, (int, float)) or (isinstance(value, str) and value.strip().replace(".", "", 1).isdigit())): | |
| field_errors.append("يجب أن يكون هذا الحقل رقماً") | |
| elif expected_type == "email" and not re.match(r'^[\w\.-]+@[\w\.-]+\.\w+$', str(value)): | |
| field_errors.append("يرجى إدخال بريد إلكتروني صحيح") | |
| elif expected_type == "date" and not re.match(r'^\d{4}-\d{2}-\d{2}$', str(value)): | |
| field_errors.append("يرجى إدخال تاريخ صحيح (YYYY-MM-DD)") | |
| # التحقق من الحد الأدنى والأقصى | |
| if value is not None and isinstance(value, (int, float)): | |
| if "min" in rules and value < rules["min"]: | |
| field_errors.append(f"يجب أن يكون هذا الحقل أكبر من أو يساوي {rules['min']}") | |
| if "max" in rules and value > rules["max"]: | |
| field_errors.append(f"يجب أن يكون هذا الحقل أصغر من أو يساوي {rules['max']}") | |
| # التحقق من طول النص | |
| if value is not None and isinstance(value, str): | |
| if "min_length" in rules and len(value) < rules["min_length"]: | |
| field_errors.append(f"يجب أن يحتوي هذا الحقل على {rules['min_length']} أحرف على الأقل") | |
| if "max_length" in rules and len(value) > rules["max_length"]: | |
| field_errors.append(f"يجب أن يحتوي هذا الحقل على {rules['max_length']} أحرف كحد أقصى") | |
| # إضافة الأخطاء إذا وجدت | |
| if field_errors: | |
| errors[field] = field_errors | |
| return errors |