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.
Files changed (191) hide show
  1. {deepfos-1.1.61 → deepfos-1.1.63}/CHANGELOG.md +15 -0
  2. {deepfos-1.1.61 → deepfos-1.1.63}/PKG-INFO +1 -1
  3. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/_version.py +3 -3
  4. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/workflow.py +15 -6
  5. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/workflow.py +8 -0
  6. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/deepmodel.py +28 -15
  7. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/finmodel.py +34 -25
  8. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/workflow.py +48 -4
  9. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/utils.py +61 -1
  10. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/PKG-INFO +1 -1
  11. {deepfos-1.1.61 → deepfos-1.1.63}/.gitattributes +0 -0
  12. {deepfos-1.1.61 → deepfos-1.1.63}/.gitee/ISSUE_GUIDELINES.md +0 -0
  13. {deepfos-1.1.61 → deepfos-1.1.63}/.gitee/ISSUE_TEMPLATE.md +0 -0
  14. {deepfos-1.1.61 → deepfos-1.1.63}/.gitignore +0 -0
  15. {deepfos-1.1.61 → deepfos-1.1.63}/MANIFEST.in +0 -0
  16. {deepfos-1.1.61 → deepfos-1.1.63}/README.md +0 -0
  17. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/__init__.py +0 -0
  18. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/algo/__init__.py +0 -0
  19. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/algo/graph.py +0 -0
  20. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/__init__.py +0 -0
  21. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/business_model.py +0 -0
  22. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/dimension.py +0 -0
  23. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/models/__init__.py +0 -0
  24. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/models/business_model.py +0 -0
  25. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_1/models/dimension.py +0 -0
  26. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/__init__.py +0 -0
  27. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/dimension.py +0 -0
  28. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/models/__init__.py +0 -0
  29. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/V1_2/models/dimension.py +0 -0
  30. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/__init__.py +0 -0
  31. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/account.py +0 -0
  32. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/accounting_engines.py +0 -0
  33. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/app.py +0 -0
  34. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/approval_process.py +0 -0
  35. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/base.py +0 -0
  36. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/business_model.py +0 -0
  37. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/consolidation.py +0 -0
  38. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/consolidation_process.py +0 -0
  39. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/datatable.py +0 -0
  40. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deep_pipeline.py +0 -0
  41. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deepconnector.py +0 -0
  42. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deepfos_task.py +0 -0
  43. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/deepmodel.py +0 -0
  44. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/dimension.py +0 -0
  45. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/financial_model.py +0 -0
  46. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/journal_model.py +0 -0
  47. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/journal_template.py +0 -0
  48. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/memory_financial_model.py +0 -0
  49. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/__init__.py +0 -0
  50. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/account.py +0 -0
  51. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/accounting_engines.py +0 -0
  52. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/app.py +0 -0
  53. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/approval_process.py +0 -0
  54. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/base.py +0 -0
  55. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/business_model.py +0 -0
  56. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/consolidation.py +0 -0
  57. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/consolidation_process.py +0 -0
  58. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/datatable_mysql.py +0 -0
  59. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deep_pipeline.py +0 -0
  60. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deepconnector.py +0 -0
  61. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deepfos_task.py +0 -0
  62. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/deepmodel.py +0 -0
  63. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/dimension.py +0 -0
  64. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/financial_model.py +0 -0
  65. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/journal_model.py +0 -0
  66. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/journal_template.py +0 -0
  67. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/memory_financial_model.py +0 -0
  68. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/platform.py +0 -0
  69. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/python.py +0 -0
  70. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/reconciliation_engine.py +0 -0
  71. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/reconciliation_report.py +0 -0
  72. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/role_strategy.py +0 -0
  73. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/smartlist.py +0 -0
  74. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/space.py +0 -0
  75. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/system.py +0 -0
  76. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/models/variable.py +0 -0
  77. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/platform.py +0 -0
  78. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/python.py +0 -0
  79. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/reconciliation_engine.py +0 -0
  80. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/reconciliation_report.py +0 -0
  81. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/role_strategy.py +0 -0
  82. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/smartlist.py +0 -0
  83. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/space.py +0 -0
  84. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/system.py +0 -0
  85. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/api/variable.py +0 -0
  86. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/__init__.py +0 -0
  87. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/jstream.c +0 -0
  88. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/jstream.pyx +0 -0
  89. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/pandas.c +0 -0
  90. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/pandas.pyx +0 -0
  91. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/py_jstream.py +0 -0
  92. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/boost/py_pandas.py +0 -0
  93. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/cache.py +0 -0
  94. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/config.py +0 -0
  95. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/__init__.py +0 -0
  96. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/__init__.py +0 -0
  97. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/_base.py +0 -0
  98. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/constants.py +0 -0
  99. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/cube.py +0 -0
  100. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/formula.py +0 -0
  101. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/syscube.py +0 -0
  102. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/typing.py +0 -0
  103. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/cube/utils.py +0 -0
  104. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/__init__.py +0 -0
  105. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/_base.py +0 -0
  106. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimcreator.py +0 -0
  107. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimension.py +0 -0
  108. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimexpr.py +0 -0
  109. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/dimmember.py +0 -0
  110. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/eledimension.py +0 -0
  111. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/filters.py +0 -0
  112. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/dimension/sysdimension.py +0 -0
  113. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/__init__.py +0 -0
  114. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/_cache.py +0 -0
  115. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/_operator.py +0 -0
  116. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/nodemixin.py +0 -0
  117. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/sqlcondition.py +0 -0
  118. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/core/logictable/tablemodel.py +0 -0
  119. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/__init__.py +0 -0
  120. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/cipher.py +0 -0
  121. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/clickhouse.py +0 -0
  122. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/connector.py +0 -0
  123. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/daclickhouse.py +0 -0
  124. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/dameng.py +0 -0
  125. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/damysql.py +0 -0
  126. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/dbkits.py +0 -0
  127. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/deepengine.py +0 -0
  128. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/deepmodel.py +0 -0
  129. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/deepmodel_kingbase.py +0 -0
  130. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/edb.py +0 -0
  131. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/gauss.py +0 -0
  132. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/kingbase.py +0 -0
  133. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/mysql.py +0 -0
  134. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/oracle.py +0 -0
  135. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/postgresql.py +0 -0
  136. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/sqlserver.py +0 -0
  137. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/db/utils.py +0 -0
  138. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/__init__.py +0 -0
  139. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/accounting.py +0 -0
  140. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/apvlprocess.py +0 -0
  141. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/base.py +0 -0
  142. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/bizmodel.py +0 -0
  143. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/datatable.py +0 -0
  144. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/deep_pipeline.py +0 -0
  145. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/deepconnector.py +0 -0
  146. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/dimension.py +0 -0
  147. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/fact_table.py +0 -0
  148. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/journal.py +0 -0
  149. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/journal_template.py +0 -0
  150. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/pyscript.py +0 -0
  151. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/reconciliation.py +0 -0
  152. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/rolestrategy.py +0 -0
  153. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/smartlist.py +0 -0
  154. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/element/variable.py +0 -0
  155. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/exceptions/__init__.py +0 -0
  156. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/exceptions/hook.py +0 -0
  157. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lazy.py +0 -0
  158. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/__init__.py +0 -0
  159. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/_javaobj.py +0 -0
  160. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/asynchronous.py +0 -0
  161. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/concurrency.py +0 -0
  162. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/constant.py +0 -0
  163. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/decorator.py +0 -0
  164. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/deepchart.py +0 -0
  165. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/deepux.py +0 -0
  166. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/discovery.py +0 -0
  167. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/edb_lexer.py +0 -0
  168. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/eureka.py +0 -0
  169. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/filterparser.py +0 -0
  170. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/httpcli.py +0 -0
  171. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/jsonstreamer.py +0 -0
  172. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/msg.py +0 -0
  173. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/nacos.py +0 -0
  174. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/patch.py +0 -0
  175. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/redis.py +0 -0
  176. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/serutils.py +0 -0
  177. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/stopwatch.py +0 -0
  178. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/subtask.py +0 -0
  179. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/lib/sysutils.py +0 -0
  180. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/local.py +0 -0
  181. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/options.py +0 -0
  182. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos/translation.py +0 -0
  183. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/SOURCES.txt +0 -0
  184. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/dependency_links.txt +0 -0
  185. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/not-zip-safe +0 -0
  186. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/requires.txt +0 -0
  187. {deepfos-1.1.61 → deepfos-1.1.63}/deepfos.egg-info/top_level.txt +0 -0
  188. {deepfos-1.1.61 → deepfos-1.1.63}/requirements.txt +0 -0
  189. {deepfos-1.1.61 → deepfos-1.1.63}/setup.cfg +0 -0
  190. {deepfos-1.1.61 → deepfos-1.1.63}/setup.py +0 -0
  191. {deepfos-1.1.61 → deepfos-1.1.63}/versioneer.py +0 -0
@@ -1,3 +1,18 @@
1
+ ## [1.1.63] - 2025-07-01
2
+
3
+ ### 更新
4
+
5
+ * 工作流完成任务实例方法增加附件列表
6
+ * 财务模型和DeepModel批量操作支持批次前后alert
7
+
8
+
9
+ ## [1.1.62] - 2025-06-12
10
+
11
+ ### 更新
12
+
13
+ * 工作流完成任务实例方法增加提供动作类型参数
14
+
15
+
1
16
  ## [1.1.61] - 2025-06-10
2
17
 
3
18
  ### 新增
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.61
3
+ Version: 1.1.63
4
4
  Summary: Collecions of useful and handy tools for deepfos platform
5
5
  Home-page: http://py.deepfos.com
6
6
  Author: deepfos-python-team
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-06-10T07:11:51+0000",
11
+ "date": "2025-07-01T03:16:02+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "c3eecd62c64b23523634efd7f51fdb7fbaf967ac",
15
- "version": "1.1.61"
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 AliasGenerator, to_version_tuple
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__(self, direct_access: bool = True, pg_dsn: str = None): # noqa
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
- for i in range(0, len(data), chunksize):
1292
- part = data.iloc[i: i + chunksize]
1293
- kw_name = self.alias.get(BATCH_INSERT_KW)
1294
- qls.append(QueryWithArgs(
1295
- commands=ql.replace(
1296
- f'${BATCH_INSERT_KW}', f'${kw_name}'
1297
- ),
1298
- kwargs={kw_name: part.to_json(
1299
- orient='records', double_precision=15,
1300
- force_ascii=False, default_handler=str
1301
- )},
1302
- globals=self._globals
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, split_dataframe, find_str, concat_url, CIEnumMeta
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
- for batch_data in split_dataframe(data, chunksize):
817
- row_data = [
818
- {"columnDimensionMemberMap": row}
819
- for row in bp.dataframe_to_dict(batch_data)
820
- ]
821
- payload = ReactSpreadsheetSaveForm(
822
- entryObject=self.entry_object,
823
- sheetDatas=[SpreadsheetSingleData(
824
- cubeName=self.element_info.elementName,
825
- cubeFolderId=self.element_info.folderId,
826
- rowDatas=row_data,
827
- commonMember=pov,
828
- )],
829
- needCheck=need_check,
830
- dataAuditSwitch=data_audit,
831
- entryMode=self.entry_mode,
832
- validateDimensionMember=need_check,
833
- callback=callback,
834
- saveDataAuthMode=auth_mode
835
- )
836
- r = await self.async_api.reactspreadsheet.save(
837
- payload.dict(exclude_unset=True)
838
- )
839
- resp.append(r)
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],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepfos
3
- Version: 1.1.61
3
+ Version: 1.1.63
4
4
  Summary: Collecions of useful and handy tools for deepfos platform
5
5
  Home-page: http://py.deepfos.com
6
6
  Author: deepfos-python-team
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