feat(core):add map file for excel

This commit is contained in:
shahzeydyfah
2026-02-15 22:52:11 +03:30
parent 3061b86524
commit db0cc4007c
4 changed files with 58 additions and 2 deletions
+1 -1
View File
@@ -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()
+31 -1
View File
@@ -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
+1
View File
@@ -81,6 +81,7 @@ class ExportModel(BaseModel):
ot: Optional[OutPutType]
c: Optional[dict]
d: Optional[str]
vk: Optional[dict] = None
class SortModel(BaseModel):
+25
View File
@@ -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: "حذف شده",
},
}