deepfos 1.1.60__py3-none-any.whl → 1.1.78__py3-none-any.whl

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 (68) hide show
  1. deepfos/_version.py +3 -3
  2. deepfos/api/V1_1/models/business_model.py +322 -322
  3. deepfos/api/V1_1/models/dimension.py +1075 -1075
  4. deepfos/api/V1_2/models/dimension.py +1119 -1116
  5. deepfos/api/account.py +1 -0
  6. deepfos/api/app.py +1 -0
  7. deepfos/api/base.py +70 -71
  8. deepfos/api/deep_pipeline.py +1 -1
  9. deepfos/api/deepconnector.py +3 -3
  10. deepfos/api/financial_model.py +12 -0
  11. deepfos/api/models/account.py +130 -130
  12. deepfos/api/models/accounting_engines.py +250 -250
  13. deepfos/api/models/app.py +355 -355
  14. deepfos/api/models/approval_process.py +231 -231
  15. deepfos/api/models/base.py +49 -209
  16. deepfos/api/models/business_model.py +239 -239
  17. deepfos/api/models/consolidation.py +196 -196
  18. deepfos/api/models/consolidation_process.py +31 -31
  19. deepfos/api/models/datatable_mysql.py +78 -78
  20. deepfos/api/models/deep_pipeline.py +20 -9
  21. deepfos/api/models/deepconnector.py +9 -8
  22. deepfos/api/models/deepfos_task.py +118 -118
  23. deepfos/api/models/deepmodel.py +120 -120
  24. deepfos/api/models/dimension.py +613 -610
  25. deepfos/api/models/financial_model.py +691 -663
  26. deepfos/api/models/journal_model.py +120 -120
  27. deepfos/api/models/journal_template.py +185 -185
  28. deepfos/api/models/memory_financial_model.py +131 -131
  29. deepfos/api/models/platform.py +16 -16
  30. deepfos/api/models/python.py +32 -32
  31. deepfos/api/models/reconciliation_engine.py +104 -104
  32. deepfos/api/models/reconciliation_report.py +29 -29
  33. deepfos/api/models/role_strategy.py +213 -213
  34. deepfos/api/models/smartlist.py +86 -86
  35. deepfos/api/models/space.py +312 -312
  36. deepfos/api/models/system.py +299 -297
  37. deepfos/api/models/variable.py +131 -131
  38. deepfos/api/models/workflow.py +290 -270
  39. deepfos/api/platform.py +3 -1
  40. deepfos/api/space.py +1 -0
  41. deepfos/api/system.py +1 -0
  42. deepfos/api/workflow.py +8 -0
  43. deepfos/cache.py +50 -4
  44. deepfos/element/bizmodel.py +2 -2
  45. deepfos/element/deep_pipeline.py +29 -16
  46. deepfos/element/deepconnector.py +36 -1
  47. deepfos/element/deepmodel.py +591 -332
  48. deepfos/element/dimension.py +30 -17
  49. deepfos/element/finmodel.py +542 -101
  50. deepfos/element/journal.py +20 -10
  51. deepfos/element/rolestrategy.py +4 -4
  52. deepfos/element/variable.py +23 -17
  53. deepfos/element/workflow.py +60 -3
  54. deepfos/exceptions/__init__.py +1 -1
  55. deepfos/lib/deepchart.py +14 -13
  56. deepfos/lib/deepux.py +11 -11
  57. deepfos/lib/discovery.py +3 -0
  58. deepfos/lib/filterparser.py +2 -2
  59. deepfos/lib/k8s.py +101 -0
  60. deepfos/lib/msg.py +34 -8
  61. deepfos/lib/serutils.py +34 -9
  62. deepfos/lib/sysutils.py +37 -18
  63. deepfos/lib/utils.py +62 -2
  64. deepfos/options.py +39 -8
  65. {deepfos-1.1.60.dist-info → deepfos-1.1.78.dist-info}/METADATA +7 -7
  66. {deepfos-1.1.60.dist-info → deepfos-1.1.78.dist-info}/RECORD +68 -67
  67. {deepfos-1.1.60.dist-info → deepfos-1.1.78.dist-info}/WHEEL +0 -0
  68. {deepfos-1.1.60.dist-info → deepfos-1.1.78.dist-info}/top_level.txt +0 -0
deepfos/api/account.py CHANGED
@@ -120,6 +120,7 @@ class UserImport(ChildAPI):
120
120
  class AccountAPI(RootAPI):
121
121
  """账户中心"""
122
122
  prefix = lambda: OPTION.server.account
123
+ server_name = "seepln-account"
123
124
 
124
125
  def __init__(self, *args, **kwargs):
125
126
  super(self.__class__.__base__, self).__init__(*args, **kwargs)
deepfos/api/app.py CHANGED
@@ -580,6 +580,7 @@ class PermissionAPI(ChildAPI):
580
580
  class AppAPI(RootAPI):
581
581
  """应用服务接口"""
582
582
  prefix = lambda: OPTION.server.app
583
+ server_name = "app-server"
583
584
 
584
585
  @cached_property
585
586
  def element_info(self) -> AppElementInfoAPI:
deepfos/api/base.py CHANGED
@@ -1,7 +1,6 @@
1
1
  import enum
2
2
  import json
3
3
  import re
4
- import weakref
5
4
  from importlib import import_module
6
5
  from shlex import quote
7
6
  from typing import (
@@ -14,11 +13,12 @@ from urllib.parse import urlencode
14
13
  from reprlib import repr
15
14
 
16
15
  from requests.utils import CaseInsensitiveDict, to_key_val_list
17
- from pydantic import parse_obj_as, BaseModel as PydanticBaseModel
16
+ from pydantic import BaseModel as PydanticBaseModel
18
17
  from cachetools import TTLCache
19
18
  from loguru import logger
20
19
 
21
20
  from deepfos.cache import Manager, AppSeperatedLRUCache
21
+ from deepfos.api.models import compat_parse_obj_as as parse_obj_as
22
22
  from deepfos.lib.httpcli import AioHttpCli
23
23
  from deepfos.lib.utils import concat_url, retry, to_version_tuple, repr_version, trim_text
24
24
  from deepfos.lib.asynchronous import evloop
@@ -365,7 +365,8 @@ class Route:
365
365
 
366
366
  # ---------------------------------------------------------------------
367
367
  # get request info
368
- req = RequestInfo(url=concat_url(ins.base_url, endpoint), method=method)
368
+ base_url = await ins.get_base_url()
369
+ req = RequestInfo(url=concat_url(base_url, endpoint), method=method)
369
370
  req.update_default(func(ins, *args, **kwargs))
370
371
  url, body, ext_header = req.url, req.body, req.header
371
372
  raw_result = model is None
@@ -532,6 +533,7 @@ post = DummyDeco(method='post')
532
533
 
533
534
  class APIBase:
534
535
  endpoint = '/'
536
+ server_name: str = None
535
537
 
536
538
  def __init__(
537
539
  self,
@@ -552,14 +554,27 @@ class APIBase:
552
554
  else:
553
555
  self.header = header
554
556
 
555
- if mat := RE_SYS_SERVER_PARSER.match(prefix):
556
- self.base_url = concat_url(OPTION.server.base, mat.group(1), self.endpoint)
557
- else:
558
- self.base_url = concat_url(prefix, self.endpoint)
557
+ self.prefix = prefix
559
558
  self.header.update({
560
559
  "Content-Type": "application/json;charset=UTF8",
561
560
  "Connection": "close",
562
561
  })
562
+ self.base_url = None
563
+
564
+ async def get_base_url(self):
565
+ if self.base_url is None:
566
+ if (
567
+ OPTION.discovery.enabled
568
+ and OPTION.discovery.take_over
569
+ and self.server_name is not None
570
+ ):
571
+ discovery = ServiceDiscovery.instantiate()
572
+ self.base_url = await discovery.get_url(self.server_name)
573
+ elif mat := RE_SYS_SERVER_PARSER.match(self.prefix):
574
+ self.base_url = concat_url(OPTION.server.base, mat.group(1))
575
+ else:
576
+ self.base_url = self.prefix
577
+ return self.base_url
563
578
 
564
579
 
565
580
  class APIMeta(type):
@@ -595,9 +610,11 @@ class SyncAPIBase(APIBase, metaclass=APIMeta):
595
610
 
596
611
  # noinspection PyUnresolvedReferences
597
612
  class _DynamicAPIMixin:
613
+ module_id: str
598
614
  server_cache = TTLCache(maxsize=128, ttl=3600)
599
615
  module_type: str = UNSET
600
- server_known = False
616
+ server_name: str = None
617
+ base_url: str = None
601
618
  version = None
602
619
 
603
620
  def get_module_id(self, version: Union[float, str], module_id: str):
@@ -618,16 +635,30 @@ class _DynamicAPIMixin:
618
635
  self.server_cache[self.module_id] = server_name
619
636
  return server_name
620
637
 
621
- def get_server_name(self):
622
- return NotImplemented
623
-
624
- # noinspection PyAttributeOutsideInit
625
- def set_url(self, server_name):
626
- self.base_url = concat_url(OPTION.server.base, server_name, self.base_url)
627
- self.server_known = True
638
+ async def get_server_name(self):
639
+ if self.server_name is None:
640
+ if self.module_id in self.server_cache:
641
+ self.server_name = self.server_cache[self.module_id]
642
+ else:
643
+ from .space import SpaceAPI
644
+ api = SpaceAPI(self.header, sync=False)
645
+ server_meta = await api.module.detail(self.module_id) # noqa
646
+ self.server_name = self._add_to_memo(server_meta)
647
+ return self.server_name
648
+
649
+ async def get_base_url(self):
650
+ if self.base_url is None:
651
+ server_name = await self.get_server_name()
652
+ if OPTION.discovery.enabled: # pragma: no cover
653
+ discovery = ServiceDiscovery.instantiate()
654
+ base_url = await discovery.get_url(server_name)
655
+ self.base_url = concat_url(base_url)
656
+ else:
657
+ self.base_url = concat_url(OPTION.server.base, server_name)
658
+ return self.base_url
628
659
 
629
660
 
630
- class DynamicAPIBase(SyncAPIBase, _DynamicAPIMixin):
661
+ class DynamicAPIBase(_DynamicAPIMixin, SyncAPIBase):
631
662
  def __init__(
632
663
  self,
633
664
  version: Union[float, str] = None,
@@ -636,33 +667,16 @@ class DynamicAPIBase(SyncAPIBase, _DynamicAPIMixin):
636
667
  lazy: bool = False
637
668
  ):
638
669
  super().__init__(header)
639
- self.module_id = module_id = self.get_module_id(version, module_id)
640
- # lazy = True means called from element/base, will be set url in ElementBase
641
- if module_id is not None and not lazy:
642
- if module_id in self.server_cache:
643
- logger.debug(f'Find server name for module: {module_id} from cache.')
644
- server_name = self.server_cache[module_id]
645
- else:
646
- server_name = self.get_server_name()
647
- self.set_url(server_name)
648
-
649
- def get_server_name(self):
650
- from .space import SpaceAPI
651
- api = SpaceAPI(self.header, sync=True)
652
- server_meta = api.module.detail(self.module_id)
653
- return self._add_to_memo(server_meta)
654
-
655
- def set_url(self, server_name):
656
- if OPTION.discovery.enabled: # pragma: no cover
657
- discovery = ServiceDiscovery.instantiate()
658
- base_url = discovery.sync_get_url(server_name)
659
- self.base_url = concat_url(base_url, self.endpoint)
660
- self.server_known = True
661
- else:
662
- super().set_url(server_name)
670
+ self.module_id = self.get_module_id(version, module_id)
663
671
 
672
+ def set_server_name(self, server_name):
673
+ self.server_name = server_name
664
674
 
665
- class ADynamicAPIBase(AsyncAPIBase, _DynamicAPIMixin):
675
+ # backward compatibility
676
+ set_url = set_server_name
677
+
678
+
679
+ class ADynamicAPIBase(_DynamicAPIMixin, AsyncAPIBase):
666
680
  def __init__(
667
681
  self,
668
682
  version: Union[float, str] = None,
@@ -677,32 +691,14 @@ class ADynamicAPIBase(AsyncAPIBase, _DynamicAPIMixin):
677
691
  def __await__(self):
678
692
  return self.init().__await__()
679
693
 
680
- async def get_server_name(self):
681
- from .space import SpaceAPI
682
- api = SpaceAPI(self.header, sync=False)
683
- server_meta = await api.module.detail(self.module_id) # noqa
684
- return self._add_to_memo(server_meta)
685
-
686
694
  async def init(self):
687
- if self.module_id is None:
688
- return self
689
- # lazy = True means called from element/base, will be set url in ElementBase
690
- if not self.lazy:
691
- if self.module_id in self.server_cache:
692
- server_name = self.server_cache[self.module_id]
693
- else:
694
- server_name = await self.get_server_name()
695
- await self.set_url(server_name)
696
695
  return self
697
696
 
698
- async def set_url(self, server_name):
699
- if OPTION.discovery.enabled: # pragma: no cover
700
- discovery = ServiceDiscovery.instantiate()
701
- base_url = await discovery.get_url(server_name)
702
- self.base_url = concat_url(base_url, self.endpoint)
703
- self.server_known = True
704
- else:
705
- super().set_url(server_name)
697
+ async def set_server_name(self, server_name):
698
+ self.server_name = server_name
699
+
700
+ # backward compatibility
701
+ set_url = set_server_name
706
702
 
707
703
 
708
704
  class RootAPI:
@@ -721,6 +717,7 @@ class RootAPI:
721
717
  api_version = None
722
718
  cls_name = None
723
719
  module_name = None
720
+ server_name = None
724
721
  builtin = True
725
722
 
726
723
  if TYPE_CHECKING: # pragma: no cover
@@ -880,17 +877,19 @@ class ChildAPI(RootAPI):
880
877
  def __new__(cls, root: RootAPI):
881
878
  clz = cls.resolve_cls(
882
879
  root.sync, (SyncAPIBase, _ChildAPI), (AsyncAPIBase, _ChildAPI),
883
- extra={'root': cls.root}
880
+ extra={'get_base_url': cls.get_base_url}
884
881
  )
885
- ins = clz(header=root.header, prefix=root.base_url)
882
+ ins = clz(header=root.header, prefix=root.prefix)
886
883
  if root.url_need_format:
887
- ins.base_url = ins.base_url.format(**root.header)
888
- ins.__root = weakref.ref(root)
884
+ ins.endpoint = ins.endpoint.format(**root.header)
885
+ ins.root = root
889
886
  return ins
890
887
 
891
- @property
892
- def root(self):
893
- return self.__root()
888
+ async def get_base_url(self):
889
+ if self.base_url is None:
890
+ base_url = await self.root.get_base_url()
891
+ self.base_url = concat_url(base_url, self.endpoint)
892
+ return self.base_url
894
893
 
895
894
 
896
895
  class DynamicRootAPI(RootAPI):
@@ -12,7 +12,7 @@ class RunAPI(ChildAPI):
12
12
  endpoint = '/'
13
13
 
14
14
  @post('run')
15
- def run_async(self, run_info: RunInfo) -> Union[str, Awaitable[str]]:
15
+ def run_async(self, run_info: Union[RunInfo, RunInfoWithParam]) -> Union[str, Awaitable[str]]:
16
16
  """
17
17
  异步执行数据流
18
18
  异步执行数据流,返回任务id
@@ -3,7 +3,7 @@ from typing import Union, Awaitable
3
3
  from deepfos.element.base import T_ElementInfoWithServer
4
4
  from deepfos.lib.decorator import cached_property
5
5
 
6
- from .base import ChildAPI, get, RootAPI
6
+ from .base import ChildAPI, RootAPI, post
7
7
  from .models.deepconnector import *
8
8
 
9
9
 
@@ -14,10 +14,10 @@ class DataSourceAPI(ChildAPI):
14
14
  """连接信息相关接口"""
15
15
  endpoint = '/apis/v3/ds/spaces/{space}/apps/{app}'
16
16
 
17
- @get('connection-info', data_wrapped=False)
17
+ @post('connection-info/query', data_wrapped=False)
18
18
  def connection_info(self, element_info: T_ElementInfoWithServer) -> Union[ConnectionInfoVo, Awaitable[ConnectionInfoVo]]:
19
19
  return {
20
- 'param': {
20
+ 'body': {
21
21
  'elementName': element_info.elementName,
22
22
  'folderId': element_info.folderId
23
23
  }
@@ -53,6 +53,10 @@ class Extra(ChildAPI):
53
53
  """
54
54
  return {'body': calculateDTO}
55
55
 
56
+ @get('git-version')
57
+ def git_version(self) -> Union[str, Awaitable[str]]:
58
+ return {}
59
+
56
60
 
57
61
  class CubeDataAPI(ChildAPI):
58
62
  endpoint = '/cube-data'
@@ -163,6 +167,14 @@ class CubeCalculateAPI(ChildAPI):
163
167
  """
164
168
  return {'body': clearDataDTO}
165
169
 
170
+ @post('/sync/clearData')
171
+ def clear_data_ex(self, clearDataDTO: SyncClearDataDto) -> Union[Any, Awaitable[Any]]:
172
+ """
173
+ 根据财务数据模型名称 所在文件夹Id 维度表达式 清除相关的数据
174
+
175
+ """
176
+ return {'body': clearDataDTO}
177
+
166
178
 
167
179
  class ReactSpreadsheet(ChildAPI):
168
180
  endpoint = '/react/spreadsheet'