diff --git a/core/utils/te/__init__.py b/core/utils/te/__init__.py index df197ff..6b23d36 100644 --- a/core/utils/te/__init__.py +++ b/core/utils/te/__init__.py @@ -62,7 +62,7 @@ class NewTableEngine: if self.return_query: query = await self.exe() return query - if self.input.e: + if self.input.e and self.input.e.ot: query = await self.exe() return query rows, count = await self.exe() diff --git a/core/utils/te/engines/Mongo.py b/core/utils/te/engines/Mongo.py index 3dfcea2..9d4fd3e 100644 --- a/core/utils/te/engines/Mongo.py +++ b/core/utils/te/engines/Mongo.py @@ -16,6 +16,7 @@ from celery import shared_task from .AbstractEngine import AbstractEngineClass from ..utils.Models import FilterItem, FilterScope, OutPutType +from ..utils.excel_value_maps import EXCEL_VALUE_MAP_REGISTRY # def zero_time_data(date, is_max=False): @@ -290,14 +291,43 @@ class MongoEngine(AbstractEngineClass): for col_index, header in enumerate(headers): worksheet.write(0, col_index, cols[header], bold_format) - # نوشتن داده‌ها + # ساختن value_maps از vk (نام مپ) با استفاده از رجیستری + value_maps = self._build_value_maps() for row_index, item in enumerate(datas, start=1): for col_index, col in enumerate(headers): val = self.get_nested_value(item, col) + val = self._apply_value_map(col, val, value_maps) worksheet.write(row_index, col_index, val) workbook.close() return file_name + def _build_value_maps(self): + """اگر کاربر در e.vk برای ستونی کلید مپ داده (مثلاً design_sts)، مپ از رجیستری برمی‌گردد.""" + value_maps = {} + vk = getattr(self.input.e, "vk", None) or {} + if not isinstance(vk, dict): + return value_maps + for col_key, map_name in vk.items(): + if map_name and map_name in EXCEL_VALUE_MAP_REGISTRY: + value_maps[col_key] = EXCEL_VALUE_MAP_REGISTRY[map_name] + return value_maps + + def _apply_value_map(self, col_key: str, val, value_maps: dict): + """اگر برای این ستون مپ تعریف شده، مقدار را به متن متناظر تبدیل می‌کند.""" + if not value_maps or col_key not in value_maps: + return val + mapping = value_maps[col_key] + if not isinstance(mapping, dict): + return val + if val is None: + return mapping.get(None, val) + key = val if isinstance(val, (int, float)) else (int(val) if isinstance(val, str) and str(val).strip().isdigit() else val) + if key in mapping: + return mapping[key] + if isinstance(key, int) and str(key) in mapping: + return mapping[str(key)] + return val + def get_nested_value(self, data, path, default='-'): """ دریافت مقدار از دیکشنری تو در تو با مسیر dot notation diff --git a/core/utils/te/utils/Models.py b/core/utils/te/utils/Models.py index b83433a..a220294 100644 --- a/core/utils/te/utils/Models.py +++ b/core/utils/te/utils/Models.py @@ -81,6 +81,7 @@ class ExportModel(BaseModel): ot: Optional[OutPutType] c: Optional[dict] d: Optional[str] + vk: Optional[dict] = None class SortModel(BaseModel): diff --git a/core/utils/te/utils/excel_value_maps.py b/core/utils/te/utils/excel_value_maps.py new file mode 100644 index 0000000..30a7f7b --- /dev/null +++ b/core/utils/te/utils/excel_value_maps.py @@ -0,0 +1,25 @@ +""" +رجیستری مپ‌های ازپیش‌تعریف‌شده برای خروجی اکسل. +کلاینت فقط کلید (مثلاً design_sts) را در e.vk می‌فرستد تا به‌جای عدد، متن در اکسل بیاید. +""" + +EXCEL_VALUE_MAP_REGISTRY = { + "design_sts": { + 1: "شروع نشده", + 2: "جاری", + 3: "متوقف", + 4: "خاتمه یافته", + }, + "monitor_sts": { + 1: "شروع نشده", + 2: "جاری", + 3: "متوقف", + 4: "تحویل موقت", + 5: "خاتمه یافته", + }, + + "sts": { + 1: "جاری", + 2: "حذف شده", + }, +}