feat(core):add map file for excel
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -81,6 +81,7 @@ class ExportModel(BaseModel):
|
||||
ot: Optional[OutPutType]
|
||||
c: Optional[dict]
|
||||
d: Optional[str]
|
||||
vk: Optional[dict] = None
|
||||
|
||||
|
||||
class SortModel(BaseModel):
|
||||
|
||||
@@ -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: "حذف شده",
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user