diff --git a/py/src/core/Proxy.py b/py/src/core/Proxy.py index 0d5c6fa6ebba511a6298b32c05764f784bb6cec3..d904fbb9b93bde858c014f62d1e7af476bac21d8 100644 --- a/py/src/core/Proxy.py +++ b/py/src/core/Proxy.py @@ -109,11 +109,15 @@ class ProxyManager(object): self.df_proxy = CallerProxy() self.pd_read_proxy = CallerProxy() self.source_cache: pd.DataFrame = None + self.last_df_cache = None def _get_all_proxys(self) -> Iterable[CallerProxy]: yield self.pd_read_proxy yield self.df_proxy + def get_last_df_cache(self): + return self.last_df_cache + @staticmethod def add_read_kws_for_excel(file_ext, kws): if file_ext in ProxyManager.s_engine_map: @@ -151,6 +155,8 @@ df.columns=cols''') ret = self.df_proxy.run('df') self.df_proxy.cmdManager.clear_all_var() self.df_proxy.set_obj_to_var('pd', pd) + + self.last_df_cache = ret return ret def query(self, query_str: str): diff --git a/py/src/core/__init__.py b/py/src/core/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..65619441657c766a12d0980be06825a86475a149 100644 --- a/py/src/core/__init__.py +++ b/py/src/core/__init__.py @@ -0,0 +1,4 @@ + + + +from .Proxy import ProxyManager \ No newline at end of file diff --git a/py/src/cusFuns/__init__.py b/py/src/cusFuns/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/py/src/cusFuns/core/Args.py b/py/src/cusFuns/core/Args.py index b48356a282ea34b206eb6605f8ecc0479586a69c..8cd130d8859d25d749307616f0879cef21e387b5 100644 --- a/py/src/cusFuns/core/Args.py +++ b/py/src/cusFuns/core/Args.py @@ -1,6 +1,8 @@ -from typing import Iterable +import pandas as pd +from ...core import Proxy +from typing import Callable, Iterable from .UIModl import Content @@ -10,11 +12,12 @@ class AbcArgs(object): """ pass - def __init__(self, title, default=None, required=True) -> None: + def __init__(self, title, default=None, required=True, to_content_overwrite: Callable = None) -> None: self.title = title self.default = default self.required = required self.var_name: str = None + self.to_content_overwrite = to_content_overwrite def set_var_name(self, var_name) -> 'AbcArgs': self.var_name = var_name @@ -23,6 +26,9 @@ class AbcArgs(object): def to_content(self) -> Content: raise NotImplementedError + def to_rule(self): + raise NotImplementedError + class ColumnSelect(AbcArgs): @@ -34,6 +40,9 @@ class ColumnSelect(AbcArgs): source='data_columns', defaultValue=self.default) return ct + def to_rule(self): + return [{'required': self.required, 'message': '必需选择一列', 'trigger': 'change'}] + class Input(AbcArgs): @@ -42,10 +51,16 @@ class Input(AbcArgs): self.placeholder = placeholder def to_content(self) -> Content: + if self.to_content_overwrite: + return self.to_content_overwrite() + ct = Content(self.title, 'input', self.var_name, defaultValue=self.default) return ct + def to_rule(self): + return [{'required': self.required, 'message': '请输入内容', 'trigger': 'blur'}] + class Select(AbcArgs): @@ -58,10 +73,41 @@ class Select(AbcArgs): self.source = source def to_content(self) -> Content: + if self.to_content_overwrite: + return self.to_content_overwrite() + ct = Content(self.title, 'select', self.var_name, source=self.source, defaultValue=self.default) return ct + def to_rule(self): + return [{'required': self.required, 'message': '必需选择一项', 'trigger': 'change'}] + + +class ColumnWithTypeSelect(AbcArgs): + + def __init__(self, title, default=None, required=True) -> None: + super().__init__(title, default=default, required=required) + + def get_value(self, index: int): + df: pd.DataFrame = Proxy.ProxyManager.get().get_last_df_cache() + col = str(df.columns[index]) + return col + + def to_content(self) -> Content: + df: pd.DataFrame = Proxy.ProxyManager.get().get_last_df_cache() + cols = [f'{name}({t})' for name, t in zip(df.columns, df.dtypes)] + + source = [{'value': i, 'text': str(v)} + for i, v in enumerate(cols)] + + ct = Content(self.title, 'select', self.var_name, + source=source, defaultValue=self.default) + return ct + + def to_rule(self): + return [{'required': self.required, 'message': '请输入内容', 'trigger': 'blur'}] + class Switch(AbcArgs): @@ -69,6 +115,12 @@ class Switch(AbcArgs): super().__init__(title, default=default, required=required) def to_content(self) -> Content: + if self.to_content_overwrite: + return self.to_content_overwrite() + ct = Content(self.title, 'switch', self.var_name, defaultValue=self.default) return ct + + def to_rule(self): + return [{'required': self.required, 'message': '请选中一项', 'trigger': 'change'}] diff --git a/py/src/cusFuns/core/DecoratorFuns.py b/py/src/cusFuns/core/DecoratorFuns.py index 4a0677951fa59332b8fb3175374662a91e51d58b..36d49d4712c12fb6178ee4b33b6b6785873a8eec 100644 --- a/py/src/cusFuns/core/DecoratorFuns.py +++ b/py/src/cusFuns/core/DecoratorFuns.py @@ -34,9 +34,11 @@ class HandleWrapper(CusFunsWrapper): def _ui_json_func() -> FunModel: fm = FunModel(self.fun_name) + rules = {a.var_name: a.to_rule() for a in self.args} for a in self.args: fm.add_content(a.to_content()) + fm.rules = rules return fm self.ui_json_func = _ui_json_func diff --git a/py/src/cusFuns/core/FunsPool.py b/py/src/cusFuns/core/FunsPool.py index 86b106aac047d50727f4024dd6f75e7fbfcb774a..d813fc9bd529d28eeedd8c3032bb35b865add191 100644 --- a/py/src/cusFuns/core/FunsPool.py +++ b/py/src/cusFuns/core/FunsPool.py @@ -77,13 +77,13 @@ class FunsPool(object): return self._mapping[uid] def get_all_desc(self): - def _to_dict(fm: FunModel): + def _to_dict(fm: CusFunc): return { - 'function_name': fm.function_name, + 'function_name': fm.fun_name, 'uid': fm.uid } - models = (cf.get_ui_json_model() for cf in self._mapping.values()) + models = (cf for cf in self._mapping.values()) ret = [_to_dict(f) for f in models] diff --git a/py/src/cusFuns/core/UIModl.py b/py/src/cusFuns/core/UIModl.py index 4e27f8a106e075a86debb81f79c0db31f99bec87..bd08218368248bb5c231669df32cbd7b103e618c 100644 --- a/py/src/cusFuns/core/UIModl.py +++ b/py/src/cusFuns/core/UIModl.py @@ -20,6 +20,7 @@ class FunModel(CanJson): self.uid: str = None self.function_name = fun_name self.contents: List[Content] = [] + self.rules = {} def add_content(self, content: Content): self.contents.append(content) diff --git a/py/src/cusFuns/core/__init__.py b/py/src/cusFuns/core/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/py/src/cusFuns/typeChanger/index.py b/py/src/cusFuns/typeChanger/index.py new file mode 100644 index 0000000000000000000000000000000000000000..18503d4214abd798a0e7ffeea364ca8df35c7b6d --- /dev/null +++ b/py/src/cusFuns/typeChanger/index.py @@ -0,0 +1,21 @@ +from ..core.DecoratorFuns import dt_handle_func, dt_args, dt_source_code +from ..core import Args as ty +import pandas as pd + + +m_types_select = ['str', 'int'] +m_col_with_type_select = ty.ColumnWithTypeSelect('列:') + + +def generate_code(*args, **kwargs): + col = f"'{m_col_with_type_select.get_value(kwargs['col'])}'" + type_value = f"'{m_types_select[kwargs['type']]}'" + return f'''df[{col}] = df[{col}].astype({type_value})''' + + +@dt_source_code(generate_code) +@dt_handle_func('列类型转换') +@dt_args(col=m_col_with_type_select, type=ty.Select('类型:', source=m_types_select)) +def change_column_type(df: pd.DataFrame, col: str, type: str): + df[col] = df[col].astype(type) + return df