From 68c710f3195a6ae4a40e02c09c5da1528dfcb706 Mon Sep 17 00:00:00 2001 From: carson_git <543983849@qq.com> Date: Fri, 8 Jan 2021 16:48:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=B1=A0-=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py/src/core/Proxy.py | 6 +++++ py/src/core/__init__.py | 4 +++ py/src/cusFuns/__init__.py | 0 py/src/cusFuns/core/Args.py | 38 +++++++++++++++++++++++++++-- py/src/cusFuns/core/__init__.py | 0 py/src/cusFuns/typeChanger/index.py | 21 ++++++++++++++++ 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 py/src/cusFuns/__init__.py create mode 100644 py/src/cusFuns/core/__init__.py create mode 100644 py/src/cusFuns/typeChanger/index.py diff --git a/py/src/core/Proxy.py b/py/src/core/Proxy.py index 0d5c6fa..d904fbb 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 e69de29..6561944 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 0000000..e69de29 diff --git a/py/src/cusFuns/core/Args.py b/py/src/cusFuns/core/Args.py index b48356a..70717aa 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 @@ -42,6 +45,9 @@ 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 @@ -58,17 +64,45 @@ 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 +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 + + class Switch(AbcArgs): def __init__(self, title, default=None, required=True) -> None: 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 diff --git a/py/src/cusFuns/core/__init__.py b/py/src/cusFuns/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/py/src/cusFuns/typeChanger/index.py b/py/src/cusFuns/typeChanger/index.py new file mode 100644 index 0000000..18503d4 --- /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 -- Gitee From 8cc021168e17fb3c7dde18aa322beda262c2c0d7 Mon Sep 17 00:00:00 2001 From: carson_git <543983849@qq.com> Date: Fri, 8 Jan 2021 20:15:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=89=93=E5=BC=80?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=B1=A0=E9=A1=B5=E9=9D=A2=EF=BC=8C=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=8A=A0=E8=BD=BD=E6=AF=8F=E4=B8=AA=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E7=9A=84uijson=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- py/src/cusFuns/core/Args.py | 18 ++++++++++++++++++ py/src/cusFuns/core/DecoratorFuns.py | 2 ++ py/src/cusFuns/core/FunsPool.py | 6 +++--- py/src/cusFuns/core/UIModl.py | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/py/src/cusFuns/core/Args.py b/py/src/cusFuns/core/Args.py index 70717aa..8cd130d 100644 --- a/py/src/cusFuns/core/Args.py +++ b/py/src/cusFuns/core/Args.py @@ -26,6 +26,9 @@ class AbcArgs(object): def to_content(self) -> Content: raise NotImplementedError + def to_rule(self): + raise NotImplementedError + class ColumnSelect(AbcArgs): @@ -37,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): @@ -52,6 +58,9 @@ class Input(AbcArgs): defaultValue=self.default) return ct + def to_rule(self): + return [{'required': self.required, 'message': '请输入内容', 'trigger': 'blur'}] + class Select(AbcArgs): @@ -71,6 +80,9 @@ class Select(AbcArgs): source=self.source, defaultValue=self.default) return ct + def to_rule(self): + return [{'required': self.required, 'message': '必需选择一项', 'trigger': 'change'}] + class ColumnWithTypeSelect(AbcArgs): @@ -93,6 +105,9 @@ class ColumnWithTypeSelect(AbcArgs): source=source, defaultValue=self.default) return ct + def to_rule(self): + return [{'required': self.required, 'message': '请输入内容', 'trigger': 'blur'}] + class Switch(AbcArgs): @@ -106,3 +121,6 @@ class Switch(AbcArgs): 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 4a06779..36d49d4 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 86b106a..d813fc9 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 4e27f8a..bd08218 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) -- Gitee