Skip to content

Commit 324f75e

Browse files
feat: BI-6252 propagate schema op_mode into US entries; skip excess validation in file conn import (#1024)
* feat: BI-6252 propagate schema op_mode into US entries; skip excessive validation during file conn imports * move OperationsMode into dl_constants * fix more imports * fix more imports x2 * include op_mode in update_object as well
1 parent 43c733b commit 324f75e

11 files changed

Lines changed: 87 additions & 61 deletions

File tree

lib/dl_api_connector/dl_api_connector/api_schema/extras.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
import enum
43
from typing import (
54
Optional,
65
Sequence,
@@ -10,27 +9,7 @@
109

1110
import attr
1211

13-
14-
class OperationsMode(enum.Enum):
15-
pass
16-
17-
18-
class CreateMode(OperationsMode):
19-
create = enum.auto()
20-
test = enum.auto()
21-
22-
23-
class ImportMode(OperationsMode):
24-
create_from_import = enum.auto()
25-
26-
27-
class EditMode(OperationsMode):
28-
edit = enum.auto()
29-
test = enum.auto()
30-
31-
32-
class ExportMode(OperationsMode):
33-
export = enum.auto()
12+
from dl_constants.enums import OperationsMode
3413

3514

3615
class SchemaKWArgs(TypedDict):

lib/dl_api_connector/dl_api_connector/api_schema/top_level.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828
from marshmallow import fields as ma_fields
2929

3030
from dl_api_connector.api_schema.extras import (
31+
FieldExtra,
32+
SchemaKWArgs,
33+
)
34+
from dl_constants.enums import (
3135
CreateMode,
3236
EditMode,
3337
ExportMode,
34-
FieldExtra,
3538
ImportMode,
3639
OperationsMode,
37-
SchemaKWArgs,
3840
)
3941
from dl_core import exc as bi_core_exc
4042
from dl_core.base_models import (
@@ -355,13 +357,16 @@ def create_object(self, data: dict[str, Any]) -> _US_ENTRY_TV:
355357

356358
obj = self.TARGET_CLS.create_from_dict( # type: ignore # TODO: fix
357359
data_dict=self.create_data_model(data_attributes),
360+
entry_op_mode=self.operations_mode,
358361
**self.default_create_from_dict_kwargs(data),
359362
)
360363
self.validate_object(obj)
361364
return obj
362365

363366
@final
364367
def update_object(self, obj: _US_ENTRY_TV, data: dict[str, Any]) -> _US_ENTRY_TV:
368+
obj.entry_op_mode = self.operations_mode
369+
365370
# Assumed that only data of USEntry can be modified with schema
366371
assert not (data.keys() - {"data"})
367372

lib/dl_api_connector/dl_api_connector_tests/unit/test_schemas_base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
)
1313
import pytest
1414

15-
from dl_api_connector.api_schema.extras import (
15+
from dl_api_connector.api_schema.extras import FieldExtra
16+
from dl_api_connector.api_schema.top_level import BaseTopLevelSchema
17+
from dl_constants.enums import (
1618
CreateMode,
1719
EditMode,
18-
FieldExtra,
1920
)
20-
from dl_api_connector.api_schema.top_level import BaseTopLevelSchema
2121
from dl_testing.utils import get_log_record
2222

2323

lib/dl_api_lib/dl_api_lib/app/control_api/resources/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
from dl_api_commons.base_models import RequestContextInfo
1515
from dl_api_commons.flask.middlewares.commit_rci_middleware import ReqCtxInfoMiddleware
1616
from dl_api_commons.flask.required_resources import RequiredResourceCommon
17-
from dl_api_connector.api_schema.extras import OperationsMode
1817
from dl_api_lib import api_decorators
1918
from dl_api_lib.schemas.tools import prepare_schema_context
2019
from dl_api_lib.service_registry.service_registry import ApiServiceRegistry
20+
from dl_constants.enums import OperationsMode
2121
from dl_core.flask_utils.us_manager_middleware import USManagerFlaskMiddleware
2222
from dl_core.us_manager.us_manager_sync import SyncUSManager
2323

lib/dl_api_lib/dl_api_lib/app/control_api/resources/connections.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,6 @@
1515
from dl_api_commons.flask.middlewares.logging_context import put_to_request_context
1616
from dl_api_commons.flask.required_resources import RequiredResourceCommon
1717
from dl_api_connector.api_schema.connection_base import ConnectionOptionsSchema
18-
from dl_api_connector.api_schema.extras import (
19-
CreateMode,
20-
EditMode,
21-
ExportMode,
22-
ImportMode,
23-
)
2418
from dl_api_lib import exc
2519
from dl_api_lib.api_decorators import schematic_request
2620
from dl_api_lib.app.control_api.resources import API
@@ -38,7 +32,13 @@
3832
)
3933
from dl_api_lib.schemas.main import ImportResponseSchema
4034
from dl_api_lib.utils import need_permission_on_entry
41-
from dl_constants.enums import ConnectionType
35+
from dl_constants.enums import (
36+
ConnectionType,
37+
CreateMode,
38+
EditMode,
39+
ExportMode,
40+
ImportMode,
41+
)
4242
from dl_constants.exc import DLBaseException
4343
from dl_core.data_source.type_mapping import get_data_source_class
4444
from dl_core.data_source_merge_tools import make_spec_from_dict

lib/dl_api_lib/dl_api_lib/schemas/tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
Optional,
77
)
88

9-
from dl_api_connector.api_schema.extras import OperationsMode
109
from dl_api_connector.api_schema.top_level import (
1110
BaseTopLevelSchema,
1211
USEntryBaseSchema,
1312
)
13+
from dl_constants.enums import OperationsMode
1414
from dl_core.us_manager.us_manager import USManagerBase
1515

1616

lib/dl_connector_bundle_chs3/dl_connector_bundle_chs3/chs3_base/api/api_schema/source.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,15 @@
1717
pre_load,
1818
)
1919

20-
from dl_api_connector.api_schema.extras import (
21-
CreateMode,
22-
FieldExtra,
23-
ImportMode,
24-
)
20+
from dl_api_connector.api_schema.extras import FieldExtra
2521
from dl_api_connector.api_schema.source_base import (
2622
SQLDataSourceSchema,
2723
SQLDataSourceTemplateSchema,
2824
)
2925
from dl_constants.enums import (
26+
CreateMode,
3027
FileProcessingStatus,
28+
ImportMode,
3129
UserDataType,
3230
)
3331
from dl_model_tools.schema.base import BaseSchema

lib/dl_connector_bundle_chs3/dl_connector_bundle_chs3/chs3_base/core/us_connection.py

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from dl_constants.enums import (
1717
DataSourceRole,
1818
FileProcessingStatus,
19+
ImportMode,
1920
)
2021
from dl_core import (
2122
connection_models,
@@ -261,6 +262,28 @@ def validate(self) -> None:
261262

262263
_saved_sources: Optional[list[FileDataSource]] = None
263264

265+
async def _update_added_sources(self, sources_to_add: set[str]) -> None:
266+
"""enriches freshly added or replaced sources with info from respective DataFiles from file-uploader-api"""
267+
268+
fu_client_factory = self.us_manager.get_services_registry().get_file_uploader_client_factory()
269+
270+
sources_desc = []
271+
for src_id in sources_to_add:
272+
src = self.get_file_source_by_id(src_id)
273+
sources_desc.append(src.get_desc())
274+
275+
if sources_desc:
276+
async with fu_client_factory.get_client() as fu_client:
277+
internal_params = await fu_client.get_internal_params_batch(sources_desc)
278+
279+
for src_order, src_id in enumerate(sources_to_add):
280+
self.update_data_source(
281+
src_id,
282+
role=DataSourceRole.origin,
283+
raw_schema=internal_params[src_order].raw_schema,
284+
preview_id=internal_params[src_order].preview_id,
285+
)
286+
264287
async def validate_new_data(
265288
self,
266289
services_registry: ServicesRegistry,
@@ -269,7 +292,7 @@ async def validate_new_data(
269292
) -> None:
270293
assert isinstance(original_version, (type(self), type(None)))
271294
if original_version is None:
272-
saved_sources = set()
295+
saved_sources: set[str] = set()
273296
else:
274297
saved_sources = set(src.id for src in original_version.data.sources)
275298

@@ -303,28 +326,16 @@ async def validate_new_data(
303326
# Restore original internal source properties
304327
self.restore_source_params_from_orig(src_id, original_version)
305328

306-
fu_client_factory = self.us_manager.get_services_registry().get_file_uploader_client_factory()
307-
308-
sources_desc = []
309-
for src_id in sources_to_add:
310-
src = self.get_file_source_by_id(src_id)
311-
sources_desc.append(src.get_desc())
312-
313-
if sources_desc:
314-
async with fu_client_factory.get_client() as fu_client:
315-
internal_params = await fu_client.get_internal_params_batch(sources_desc)
329+
if self.entry_op_mode == ImportMode.create_from_import:
330+
# nothing else to do for an imported connection, because original `DataFile`s most certainly don't exist
331+
return
316332

317-
for src_order, src_id in enumerate(sources_to_add):
318-
self.update_data_source(
319-
src_id,
320-
role=DataSourceRole.origin,
321-
raw_schema=internal_params[src_order].raw_schema,
322-
preview_id=internal_params[src_order].preview_id,
323-
)
333+
await self._update_added_sources(sources_to_add)
324334

335+
# trigger re-save for sources, that are marked for update, by removing them from _saved_sources
325336
if self._saved_sources is not None:
326337
saved_source_ids = set(src.id for src in self._saved_sources)
327-
for src_id in sources_to_update & saved_source_ids: # trigger update by removing source from _saved_sources
338+
for src_id in sources_to_update & saved_source_ids:
328339
self._remove_saved_source_by_id(src_id)
329340

330341
# clear errors for updated sources

lib/dl_constants/dl_constants/enums.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,3 +449,25 @@ class MigrationStatus(Enum):
449449
migrated_up = "migrated_up"
450450
migrated_down = "migrated_down"
451451
error = "error"
452+
453+
454+
class OperationsMode(Enum):
455+
pass
456+
457+
458+
class CreateMode(OperationsMode):
459+
create = auto()
460+
test = auto()
461+
462+
463+
class ImportMode(OperationsMode):
464+
create_from_import = auto()
465+
466+
467+
class EditMode(OperationsMode):
468+
edit = auto()
469+
test = auto()
470+
471+
472+
class ExportMode(OperationsMode):
473+
export = auto()

lib/dl_core/dl_core/us_connection_base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
DataSourceType,
3333
MigrationStatus,
3434
NotificationLevel,
35+
OperationsMode,
3536
RawSQLLevel,
3637
UserDataType,
3738
is_raw_sql_level_dashsql_allowed,
@@ -200,6 +201,7 @@ def __init__(
200201
hidden: bool = False,
201202
data_strict: bool = True,
202203
migration_status: MigrationStatus = MigrationStatus.non_migrated,
204+
entry_op_mode: Optional[OperationsMode] = None,
203205
*,
204206
us_manager: USManagerBase,
205207
):
@@ -218,6 +220,7 @@ def __init__(
218220
hidden=hidden,
219221
data_strict=data_strict,
220222
migration_status=migration_status,
223+
entry_op_mode=entry_op_mode,
221224
us_manager=us_manager,
222225
)
223226

0 commit comments

Comments
 (0)