deepfos 1.1.61__tar.gz → 1.1.63__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {deepfos-1.1.61 → deepfos-1.1.63}/CHANGELOG.md +15 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/PKG-INFO +1 -1
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/_version.py +3 -3
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/workflow.py +15 -6
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/workflow.py +8 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/deepmodel.py +28 -15
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/finmodel.py +34 -25
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/workflow.py +48 -4
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/utils.py +61 -1
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/PKG-INFO +1 -1
- {deepfos-1.1.61 → deepfos-1.1.63}/.gitattributes +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/.gitee/ISSUE_GUIDELINES.md +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/.gitee/ISSUE_TEMPLATE.md +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/.gitignore +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/MANIFEST.in +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/README.md +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/models/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/account.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/app.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/base.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/consolidation_process.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deep_pipeline.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deepconnector.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deepfos_task.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deepmodel.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/journal_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/consolidation_process.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deep_pipeline.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deepconnector.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deepmodel.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/financial_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/journal_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/platform.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/python.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/space.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/system.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/cache.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/config.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/sqlcondition.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/tablemodel.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/clickhouse.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/dbkits.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/deepengine.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/deepmodel.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/deepmodel_kingbase.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/edb.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/mysql.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/oracle.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/postgresql.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/sqlserver.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/utils.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/apvlprocess.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/base.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/bizmodel.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/datatable.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/deep_pipeline.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/deepconnector.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/dimension.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/journal.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/pyscript.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/exceptions/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lazy.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/constant.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/decorator.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/deepchart.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/deepux.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/discovery.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/edb_lexer.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/eureka.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/msg.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/nacos.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/redis.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/serutils.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/subtask.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/sysutils.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/local.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/options.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/translation.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/SOURCES.txt +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/requires.txt +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/requirements.txt +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/setup.cfg +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/setup.py +0 -0
- {deepfos-1.1.61 → deepfos-1.1.63}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-07-01T03:16:02+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
14
|
+
"full-revisionid": "ee27ae20cda4c8955b87eabb5b3b1c73e528e8e3",
|
|
15
|
+
"version": "1.1.63"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -10,6 +10,7 @@ generated by model_code_gen.py
|
|
|
10
10
|
from deepfos.api.models.base import BaseModel
|
|
11
11
|
from typing import List, Optional, Union, Any, Dict
|
|
12
12
|
from pydantic import Field
|
|
13
|
+
from deepfos.api.models.platform import FileUplodRes
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
__all__ = [
|
|
@@ -57,6 +58,7 @@ __all__ = [
|
|
|
57
58
|
'SendMessageParam',
|
|
58
59
|
'FlowQueryResp',
|
|
59
60
|
'TaskCompleteParam',
|
|
61
|
+
'OutComeDto',
|
|
60
62
|
]
|
|
61
63
|
|
|
62
64
|
|
|
@@ -555,12 +557,6 @@ class TaskCompleteParam(BaseModel):
|
|
|
555
557
|
value: Any
|
|
556
558
|
|
|
557
559
|
|
|
558
|
-
class TaskCompleteParam(BaseModel):
|
|
559
|
-
"""任务完成参数"""
|
|
560
|
-
name: str
|
|
561
|
-
value: Any
|
|
562
|
-
|
|
563
|
-
|
|
564
560
|
class TaskCompleteInstance(BaseModel):
|
|
565
561
|
"""任务完成实体
|
|
566
562
|
|
|
@@ -579,6 +575,10 @@ class TaskCompleteInstance(BaseModel):
|
|
|
579
575
|
taskId: Optional[str] = None
|
|
580
576
|
#: 完成参数
|
|
581
577
|
extraResParams: Optional[List[TaskCompleteParam]] = None
|
|
578
|
+
#: 按钮id
|
|
579
|
+
actionId: Optional[str] = None
|
|
580
|
+
#: 附件文件
|
|
581
|
+
attachments: Optional[List[FileUplodRes]]
|
|
582
582
|
|
|
583
583
|
|
|
584
584
|
class TaskReqDto(BaseModel):
|
|
@@ -954,4 +954,13 @@ class FlowQueryResp(BaseModel):
|
|
|
954
954
|
versionStatus: Optional[str] = None
|
|
955
955
|
|
|
956
956
|
|
|
957
|
+
class OutComeDto(BaseModel):
|
|
958
|
+
"""获取用户任务outcome
|
|
957
959
|
|
|
960
|
+
.. admonition:: 引用接口
|
|
961
|
+
|
|
962
|
+
- **GET** ``/process/task/outcomes`` (Response: 200)
|
|
963
|
+
"""
|
|
964
|
+
code: Optional[str] = None
|
|
965
|
+
id: Optional[str] = None
|
|
966
|
+
name: Optional[Any] = None
|
|
@@ -188,6 +188,14 @@ class ProcessTask(ChildAPI):
|
|
|
188
188
|
"""
|
|
189
189
|
return {'body': userTaskQueryDTO}
|
|
190
190
|
|
|
191
|
+
@get('outcomes')
|
|
192
|
+
def outcomes(self, taskId: str) -> Union[List[OutComeDto], Awaitable[List[OutComeDto]]]:
|
|
193
|
+
"""
|
|
194
|
+
获取用户任务outcome
|
|
195
|
+
|
|
196
|
+
"""
|
|
197
|
+
return {'param': {'taskId': taskId}}
|
|
198
|
+
|
|
191
199
|
|
|
192
200
|
class Version(ChildAPI):
|
|
193
201
|
endpoint = '/version'
|
|
@@ -35,7 +35,9 @@ from deepfos.exceptions import (
|
|
|
35
35
|
from deepfos.lib import serutils
|
|
36
36
|
from deepfos.lib.asynchronous import future_property, evloop
|
|
37
37
|
from deepfos.lib.decorator import flagmethod, cached_property, lru_cache
|
|
38
|
-
from deepfos.lib.utils import
|
|
38
|
+
from deepfos.lib.utils import (
|
|
39
|
+
AliasGenerator, to_version_tuple, ChunkAlert, split_dataframe_alert
|
|
40
|
+
)
|
|
39
41
|
|
|
40
42
|
__all__ = ['AsyncDeepModel', 'DeepModel', 'to_fields', 'QueryWithArgs']
|
|
41
43
|
|
|
@@ -786,7 +788,13 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
786
788
|
"""
|
|
787
789
|
__mangle_docs__ = False
|
|
788
790
|
|
|
789
|
-
def __init__(
|
|
791
|
+
def __init__(
|
|
792
|
+
self,
|
|
793
|
+
direct_access: bool = True,
|
|
794
|
+
pg_dsn: str = None,
|
|
795
|
+
before_chunk: ChunkAlert = None,
|
|
796
|
+
after_chunk: ChunkAlert = None,
|
|
797
|
+
):
|
|
790
798
|
self._txn_ = ContextVar('QLTXN')
|
|
791
799
|
self.appmodule = f"app{OPTION.api.header['app']}"
|
|
792
800
|
self.spacemodule = f"space{OPTION.api.header['space']}"
|
|
@@ -796,6 +804,8 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
796
804
|
self.alias = AliasGenerator()
|
|
797
805
|
self.pg_dsn = pg_dsn
|
|
798
806
|
self._globals = {}
|
|
807
|
+
self.before_chunk = before_chunk
|
|
808
|
+
self.after_chunk = after_chunk
|
|
799
809
|
|
|
800
810
|
@future_property
|
|
801
811
|
async def client(self):
|
|
@@ -1288,19 +1298,22 @@ class AsyncDeepModel(ElementBase[DeepModelAPI]):
|
|
|
1288
1298
|
qls: List[QueryWithArgs]
|
|
1289
1299
|
):
|
|
1290
1300
|
self._ensure_client()
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1301
|
+
|
|
1302
|
+
for part, alert in split_dataframe_alert(
|
|
1303
|
+
data, chunksize, self.before_chunk, self.after_chunk
|
|
1304
|
+
):
|
|
1305
|
+
with alert:
|
|
1306
|
+
kw_name = self.alias.get(BATCH_INSERT_KW)
|
|
1307
|
+
qls.append(QueryWithArgs(
|
|
1308
|
+
commands=ql.replace(
|
|
1309
|
+
f'${BATCH_INSERT_KW}', f'${kw_name}'
|
|
1310
|
+
),
|
|
1311
|
+
kwargs={kw_name: part.to_json(
|
|
1312
|
+
orient='records', double_precision=15,
|
|
1313
|
+
force_ascii=False, default_handler=str
|
|
1314
|
+
)},
|
|
1315
|
+
globals=self._globals
|
|
1316
|
+
))
|
|
1304
1317
|
|
|
1305
1318
|
@staticmethod
|
|
1306
1319
|
def _split_self_link(data, relation, structure, bkey):
|
|
@@ -25,7 +25,8 @@ from deepfos.api.app import AppAPI
|
|
|
25
25
|
from deepfos.lib.asynchronous import future_property
|
|
26
26
|
from deepfos.lib.utils import (
|
|
27
27
|
unpack_expr, dict_to_expr, LazyDict, expr_to_dict,
|
|
28
|
-
dict_to_sql,
|
|
28
|
+
dict_to_sql, find_str, concat_url, CIEnumMeta, ChunkAlert,
|
|
29
|
+
split_dataframe_alert,
|
|
29
30
|
)
|
|
30
31
|
from deepfos.lib.sysutils import complete_cartesian_product
|
|
31
32
|
from deepfos.lib.constant import (
|
|
@@ -180,11 +181,15 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
|
|
|
180
181
|
entry_object='python',
|
|
181
182
|
entry_mode=1,
|
|
182
183
|
server_name: Optional[str] = None,
|
|
184
|
+
before_chunk: ChunkAlert = None,
|
|
185
|
+
after_chunk: ChunkAlert = None,
|
|
183
186
|
):
|
|
184
187
|
full_name = OPTION.general.task_info.get('script_name', 'python')
|
|
185
188
|
self.entry_object = entry_object.format(script_name=full_name.split('.')[-1],
|
|
186
189
|
full_name=full_name)
|
|
187
190
|
self.entry_mode = entry_mode
|
|
191
|
+
self.before_chunk = before_chunk
|
|
192
|
+
self.after_chunk = after_chunk
|
|
188
193
|
super().__init__(element_name, folder_id, path, server_name)
|
|
189
194
|
|
|
190
195
|
@future_property(on_demand=True)
|
|
@@ -813,30 +818,34 @@ class AsyncFinancialCube(ElementBase[FinancialModelAPI]):
|
|
|
813
818
|
|
|
814
819
|
# save data
|
|
815
820
|
resp = []
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
821
|
+
|
|
822
|
+
for batch_data, alert in split_dataframe_alert(
|
|
823
|
+
data, chunksize, self.before_chunk, self.after_chunk
|
|
824
|
+
):
|
|
825
|
+
with alert:
|
|
826
|
+
row_data = [
|
|
827
|
+
{"columnDimensionMemberMap": row}
|
|
828
|
+
for row in bp.dataframe_to_dict(batch_data)
|
|
829
|
+
]
|
|
830
|
+
payload = ReactSpreadsheetSaveForm(
|
|
831
|
+
entryObject=self.entry_object,
|
|
832
|
+
sheetDatas=[SpreadsheetSingleData(
|
|
833
|
+
cubeName=self.element_info.elementName,
|
|
834
|
+
cubeFolderId=self.element_info.folderId,
|
|
835
|
+
rowDatas=row_data,
|
|
836
|
+
commonMember=pov,
|
|
837
|
+
)],
|
|
838
|
+
needCheck=need_check,
|
|
839
|
+
dataAuditSwitch=data_audit,
|
|
840
|
+
entryMode=self.entry_mode,
|
|
841
|
+
validateDimensionMember=need_check,
|
|
842
|
+
callback=callback,
|
|
843
|
+
saveDataAuthMode=auth_mode
|
|
844
|
+
)
|
|
845
|
+
r = await self.async_api.reactspreadsheet.save(
|
|
846
|
+
payload.dict(exclude_unset=True)
|
|
847
|
+
)
|
|
848
|
+
resp.append(r)
|
|
840
849
|
return resp
|
|
841
850
|
|
|
842
851
|
async def delete_with_mdx(
|
|
@@ -4,6 +4,7 @@ from typing import *
|
|
|
4
4
|
import pandas as pd
|
|
5
5
|
|
|
6
6
|
from deepfos.api.models import compat_parse_obj_as as parse_obj_as
|
|
7
|
+
from deepfos.api.models.platform import FileUplodRes
|
|
7
8
|
from deepfos.api.models.workflow import *
|
|
8
9
|
from deepfos.api.workflow import WorkFlowAPI
|
|
9
10
|
from deepfos.element.base import ElementBase, SyncMeta
|
|
@@ -295,31 +296,73 @@ class AsyncWorkFlow(ElementBase[WorkFlowAPI]):
|
|
|
295
296
|
comment: str = None,
|
|
296
297
|
file_path: str = None,
|
|
297
298
|
outcome: str = None,
|
|
298
|
-
extra_res_params: Dict[str, Any] = None
|
|
299
|
+
extra_res_params: Dict[str, Any] = None,
|
|
300
|
+
attachments: List[Union[Dict[str, str], FileUplodRes]] = None,
|
|
299
301
|
) -> bool:
|
|
300
302
|
"""完成任务实例
|
|
301
303
|
|
|
302
304
|
Args:
|
|
303
305
|
task_id: 任务实例id
|
|
304
306
|
comment: 备注
|
|
305
|
-
file_path: 附件路径
|
|
307
|
+
file_path: 附件路径(工作流版本在V3.0.4.0后弃用,后续版本请使用attachments参数)
|
|
306
308
|
outcome: 结果选项,在任务可选结果不唯一时,必须提供
|
|
307
309
|
extra_res_params: 完成参数
|
|
310
|
+
attachments: 附件信息列表,
|
|
311
|
+
内容一般来自文件管理的/files/upload或/files/upload/content响应值
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
.. admonition:: 示例
|
|
315
|
+
|
|
316
|
+
.. code-block:: python
|
|
317
|
+
from deepfos.api.platform import PlatformAPI
|
|
318
|
+
from deepfos.element.workflow import WorkFlow
|
|
319
|
+
|
|
320
|
+
# 上传附件't.txt'
|
|
321
|
+
upload_resp = PlatformAPI().file.upload(
|
|
322
|
+
file_type='DL', file_name='t.txt', file='some text'
|
|
323
|
+
)
|
|
324
|
+
# 以动作approve,参数{"a": 1, "b": "42"}完成任务实例,
|
|
325
|
+
# 并提供附件信息为上传的't.txt'文件,备注为"Completed by SDK"
|
|
326
|
+
test_task = WorkFlow('test_task')
|
|
327
|
+
test_task.complete_task_by_id(
|
|
328
|
+
task_id='fd94f6a7-3467-47f9-8a3c-ff626e68dcf5',
|
|
329
|
+
outcome='approve',
|
|
330
|
+
extra_res_params={'a': 1, 'b': '42'},
|
|
331
|
+
comment='Completed by SDK',
|
|
332
|
+
attachments=[upload_resp]
|
|
333
|
+
)
|
|
308
334
|
|
|
309
335
|
Returns:
|
|
310
336
|
True: 成功
|
|
311
337
|
False: 失败
|
|
312
338
|
|
|
313
339
|
"""
|
|
340
|
+
action_id = None
|
|
341
|
+
if outcome is not None:
|
|
342
|
+
outcomes = await self.async_api.task.outcomes(task_id)
|
|
343
|
+
for o in outcomes:
|
|
344
|
+
if o.code == outcome:
|
|
345
|
+
action_id = o.id
|
|
346
|
+
break
|
|
347
|
+
|
|
314
348
|
if extra_res_params is None:
|
|
315
349
|
extra_res_params = {}
|
|
350
|
+
if not isinstance(extra_res_params, dict):
|
|
351
|
+
raise TypeError('extra_res_params参数应为字典类型')
|
|
352
|
+
|
|
353
|
+
if attachments is not None:
|
|
354
|
+
attachments = parse_obj_as(List[FileUplodRes], attachments)
|
|
355
|
+
else:
|
|
356
|
+
attachments = []
|
|
316
357
|
return await self.async_api.task.express_complete(
|
|
317
358
|
TaskCompleteInstance(
|
|
318
359
|
comment=comment, filePath=file_path, outcome=outcome, taskId=task_id,
|
|
319
360
|
extraResParams=[
|
|
320
361
|
TaskCompleteParam(name=k, value=v)
|
|
321
362
|
for k, v in extra_res_params.items()
|
|
322
|
-
]
|
|
363
|
+
],
|
|
364
|
+
actionId=action_id,
|
|
365
|
+
attachments=attachments
|
|
323
366
|
)
|
|
324
367
|
)
|
|
325
368
|
|
|
@@ -546,7 +589,8 @@ class WorkFlow(AsyncWorkFlow, metaclass=SyncMeta):
|
|
|
546
589
|
comment: str = None,
|
|
547
590
|
file_path: str = None,
|
|
548
591
|
outcome: str = None,
|
|
549
|
-
extra_res_params: Dict[str, Any] = None
|
|
592
|
+
extra_res_params: Dict[str, Any] = None,
|
|
593
|
+
attachments: List[Union[Dict[str, str], FileUplodRes]] = None,
|
|
550
594
|
) -> bool:
|
|
551
595
|
...
|
|
552
596
|
|
|
@@ -7,13 +7,14 @@ import sys
|
|
|
7
7
|
import time
|
|
8
8
|
import weakref
|
|
9
9
|
from collections import UserList, UserDict, defaultdict
|
|
10
|
+
from contextlib import contextmanager, nullcontext
|
|
10
11
|
from enum import EnumMeta, Enum
|
|
11
12
|
import random
|
|
12
13
|
from typing import (
|
|
13
14
|
Tuple, Optional, Dict,
|
|
14
15
|
List, Union, Callable, Any,
|
|
15
16
|
TypeVar, MutableMapping, Container,
|
|
16
|
-
Iterator, Iterable, DefaultDict
|
|
17
|
+
Iterator, Iterable, DefaultDict,
|
|
17
18
|
)
|
|
18
19
|
from itertools import groupby, count
|
|
19
20
|
|
|
@@ -867,6 +868,38 @@ def dict_to_sql(
|
|
|
867
868
|
return sql
|
|
868
869
|
|
|
869
870
|
|
|
871
|
+
class ChunkAlert:
|
|
872
|
+
def __call__(self, start: int, end: int, exc: Exception = None) -> None: ...
|
|
873
|
+
|
|
874
|
+
|
|
875
|
+
@contextmanager
|
|
876
|
+
def chunk_alert(
|
|
877
|
+
start: int, end: int,
|
|
878
|
+
before: ChunkAlert = None,
|
|
879
|
+
after: ChunkAlert = None,
|
|
880
|
+
):
|
|
881
|
+
try:
|
|
882
|
+
if before is not None:
|
|
883
|
+
try:
|
|
884
|
+
before(start, end)
|
|
885
|
+
except Exception:
|
|
886
|
+
logger.warning('Error occurs while calling before_chunk.')
|
|
887
|
+
yield
|
|
888
|
+
except Exception as e:
|
|
889
|
+
if after is not None:
|
|
890
|
+
try:
|
|
891
|
+
after(start, end, e)
|
|
892
|
+
except Exception:
|
|
893
|
+
logger.warning('Error occurs while calling after_chunk.')
|
|
894
|
+
raise
|
|
895
|
+
else:
|
|
896
|
+
if after is not None:
|
|
897
|
+
try:
|
|
898
|
+
after(start, end)
|
|
899
|
+
except Exception:
|
|
900
|
+
logger.warning('Error occurs while calling after_chunk.')
|
|
901
|
+
|
|
902
|
+
|
|
870
903
|
def split_dataframe(data: pd.DataFrame, chunksize: int = None):
|
|
871
904
|
nrows = len(data)
|
|
872
905
|
if chunksize is None or chunksize > nrows:
|
|
@@ -878,6 +911,33 @@ def split_dataframe(data: pd.DataFrame, chunksize: int = None):
|
|
|
878
911
|
yield data.iloc[i: i + chunksize]
|
|
879
912
|
|
|
880
913
|
|
|
914
|
+
def split_dataframe_alert(
|
|
915
|
+
data: pd.DataFrame,
|
|
916
|
+
chunksize: int = None,
|
|
917
|
+
before_chunk: ChunkAlert = None,
|
|
918
|
+
after_chunk: ChunkAlert = None,
|
|
919
|
+
):
|
|
920
|
+
no_alert = before_chunk is None and after_chunk is None
|
|
921
|
+
|
|
922
|
+
nrows = len(data)
|
|
923
|
+
if chunksize is None or chunksize > nrows:
|
|
924
|
+
if no_alert:
|
|
925
|
+
yield data, nullcontext()
|
|
926
|
+
else:
|
|
927
|
+
yield data, chunk_alert(0, nrows, before_chunk, after_chunk)
|
|
928
|
+
elif chunksize <= 0:
|
|
929
|
+
raise ValueError("chunksize must be greater than 0.")
|
|
930
|
+
else:
|
|
931
|
+
for i in range(0, nrows, chunksize):
|
|
932
|
+
if no_alert:
|
|
933
|
+
yield data.iloc[i: i + chunksize], nullcontext()
|
|
934
|
+
else:
|
|
935
|
+
yield (
|
|
936
|
+
data.iloc[i: i + chunksize],
|
|
937
|
+
chunk_alert(i, min(i + chunksize, nrows), before_chunk, after_chunk)
|
|
938
|
+
)
|
|
939
|
+
|
|
940
|
+
|
|
881
941
|
def find_str(
|
|
882
942
|
target: str,
|
|
883
943
|
candidates: Iterable[str],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|